Buenas tardes, ayer hice este programa de Integración de Romberg para el ejercicio 1 del TP8, lo revisé con majo y como puede llegar a servirnos a todos, me dijo que lo compartiera por acá.
import math
# Cargo la matriz con los puntos de la función (ejemplo de temperaturas)
def cargarmatrizM():
M = [[0, 63], [1, 65], [2, 66], [3, 68], [4, 70], [5, 69], [6, 68],
[7, 68], [8, 65], [9, 64], [10, 62], [11, 58], [12, 55]]
return M
# Defino la función a integrar (usando interpolación de la matriz)
def f(x):
M = cargarmatrizM()
for i in range(len(M) - 1):
if M[i][0] <= x <= M[i + 1][0]:
# Interpolación lineal entre dos puntos consecutivos
x0, y0 = M[i]
x1, y1 = M[i + 1]
return y0 + (y1 - y0) * (x - x0) / (x1 - x0)
return 0 # Valor fuera del rango
# Cálculo de la regla del trapecio compuesto
def trapecio_compuesto(func, a, b, n):
h = (b - a) / n
suma = 0.5 * (func(a) + func(b))
for i in range(1, n):
suma += func(a + i * h)
return h * suma
# Cálculo de la integración de Romberg con orden de estimación fijo
def romberg(func, a, b, orden_max):
R = [[0] * (k + 1) for k in range(orden_max)] # Matriz triangular
# Primera estimación con un solo tramo (n = 1)
R[0][0] = trapecio_compuesto(func, a, b, 1)
for k in range(1, orden_max):
# Refinamiento usando 2^k tramos
R[k][0] = trapecio_compuesto(func, a, b, 2**k)
# Extrapolación de Richardson
for j in range(1, k + 1):
R[k][j] = ((4**j) * R[k][j - 1] - R[k - 1][j - 1]) / (4**j - 1)
# El resultado final es la última estimación disponible
print(f"Integración final alcanzada con orden de estimación {orden_max}")
return R[orden_max - 1][orden_max - 1]
# Programa principal
a = int(input('Ingrese el valor del límite inferior de la integral: '))
b = int(input('Ingrese el valor del límite superior de la integral: '))
orden_max = int(input('Ingrese el orden de estimación deseado: '))
# Calcular el valor de la integral usando Romberg
resultado = romberg(f, a, b, orden_max)
# Calcular la temperatura promedio
temprom = resultado / (b - a)
# Mostrar resultados
print(f'El valor promedio de la temperatura es: {temprom:.6f} ºC')
if temprom <= 58 or temprom >= 62:
print('La estufa no funciona correctamente')
else:
print('La estufa funciona correctamente')
Buen finde para todos!