[ Simpson 1/3 ] [ Ejercicio ] [Algoritmo Python] [ función Python]
..
La regla de Simpson 1/3
Referencia: Chapra 21.2.1 p631, Burden 4.3 p144, Rodríguez 7.1.4 p281
Es el resultado cuando se realiza una interpolación con polinomio de segundo grado.
Se puede obtener usando un polinomio de Lagrange de segundo grado:
que simplificando tiene como resultado para un solo tramo:
siendo h el tamaño de paso, donde para la expresión el divisor debe ser par, múltiplo de 2, al cubrir todo el intervalo [a,b]. En caso de usar valores de muestras xi, fi, el valor de h debe ser constante.
Error de truncamiento
la cota del error de truncamiento se estima como O(h5)
para un valor de z dentro del intervalo [a,b] de integración.
para cuantificar el valor, se puede usar la diferencia finita Δ4f, pues con la derivada sería muy laborioso.
[ Simpson 1/3 ] [ Ejercicio ] [Algoritmo Python] [ función Python]
Ejercicio
Para integrar la función en el intervalo [1,3] con 4, 16, 32 ,64 y 128 tramos,
Para el ejercicio planteado en la regla de trapecio, usando cuatro tramos, se aplica el método cada dos tramos.
Note que al usar Simpson 1/3 con 4 tramos el resultado tiene los 2 primeros decimales iguales a usar Trapecio con 16 tramos.
>>> import numpy as np >>> fx = lambda x: np.sqrt(x)*np.sin(x) >>> xi = [1, 1+1/2, 1+2/2, 1+3/2,3] >>> xi [1, 1.5, 2.0, 2.5, 3] >>> fx(xi) array([0.84147098, 1.22167687, 1.28594075, 0.94626755, 0.24442702]) >>> (0.5/3)*(fx(1)+4*fx(1.5)+fx(2)) + (0.5/3)*(fx(2)+4*fx(2.5)+fx(3)) 2.0549261957703937 >>>
Para más de 4 tramos es preferible realizar las operaciones con un algoritmo.
[ Simpson 1/3 ] [ Ejercicio ] [Algoritmo Python] [ función Python]
..
Algoritmo en Python
Del ejercicio con trapecios, se repite el ejercicio con n tramos; usando dos tramos (tres puntos) en cada iteración.
Cada iteración se procesa avanzando dos puntos xi, xi+h, xi+2h . Ejemplo:
tramos: 8 Integral: 2.053709383061734 >>>
Instrucciones en Python
Se realiza mediante la aplicación directa de la fórmula para cada segmento conformado de dos tramos. Se verifica que el valor de tramos sea par.
# Integración: Regla Simpson 1/3 import numpy as np import matplotlib.pyplot as plt # INGRESO: fx = lambda x: np.sqrt(x)*np.sin(x) # intervalo de integración a = 1 b = 3 tramos = 8 # Validar cantidad de tramos pares esimpar = tramos%2 while (esimpar == 1): print('tramos: ',tramos) tramos = int(input('tramos debe ser par: ')) esimpar = tramos%2 # PROCEDIMIENTO # Regla de Simpson 1/3 h = (b-a)/tramos xi = a area = 0 for i in range(0,tramos,2): deltaA = (h/3)*(fx(xi)+4*fx(xi+h)+fx(xi+2*h)) area = area + deltaA xi = xi + 2*h # SALIDA print('tramos:', tramos) print('Integral: ', area)
Gráfica
Se puede observar mejor lo expresado usando la gráfica para observar los tramos, muestras, por segmento. Para este caso se ejecuta el algoritmo anterior usando tramos =8
Instrucciones en Python adicionales al algoritmo anterior
# GRAFICA # fx muestras por tramo muestras = tramos + 1 xi = np.linspace(a,b,muestras) fi = fx(xi) fi0 = np.zeros(muestras) # linea base # fx suave aumentando muestras muestrasfxSuave = 4*tramos + 1 xk = np.linspace(a,b,muestrasfxSuave) fk = fx(xk) # Relleno for i in range(0,muestras-1,2): relleno = 'lightgreen' if (i/2)%2==0: # i/2 par relleno ='lightblue' xktramo = xk[i*4:(i+2)*4+1] fktramo = fk[i*4:(i+2)*4+1] plt.fill_between(xktramo,fktramo,fktramo*0,color=relleno) # Funcion f(x) plt.plot(xk,fk, label='f(x)') plt.plot(xi,fi,'o', label='f(xi)') # Divisiones entre Simpson 1/3 for i in range(0,muestras,1): tipolinea = 'dotted' if i%2==0: # i par tipolinea = 'dashed' plt.vlines(xi[i],fi0[i],fi[i], linestyle=tipolinea) plt.axhline(0) plt.xlabel('x') plt.ylabel('f') plt.title('Integral: Regla de Simpson 1/3') plt.legend() plt.show()
[ Simpson 1/3 ] [ Ejercicio ] [Algoritmo Python] [ función Python]
..
Algoritmo como función de Python
Caso: f(x) es una expresión matemática
A partir del ejercicio anterior, se resume en una función de Python si la entrada f(x) es una expresión matemática:
def integrasimpson13(fx,a,b,tramos): ''' integral con método de Simpson 1/3 tramos debe debe ser múltiplo de 2 ''' # Validar cantidad de tramos pares esmult2 = tramos%2 if esmult2 != 0: suma = 'tramos debe ser múltiplo de 2' # Regla de Simpson 1/3 if esmult2 == 0: h = (b-a)/tramos xi = a suma = 0 for i in range(0,tramos,2): unS13 = (h/3)*(fx(xi)+4*fx(xi+h)+fx(xi+2*h)) suma = suma + unS13 xi = xi + 2*h return(suma)
Caso: x[i], f[i] son muestras
xi = [1. , 1.5, 2. , 2.5, 3.] fi = [0.84147098, 1.22167687, 1.28594075, 0.94626755, 0.24442702]
Cuando se integra sobre muestras dadas por los vectores xi, fi. Se revisa que los tramos entre muestras sean iguales para un Simpson 1/3 y que existan suficientes puntos para completar el integral.
# Integración Simpson 1/3 # Usando una muestras xi,fi import numpy as np import matplotlib.pyplot as plt def integrasimpson13_fi(xi,fi,tolera = 1e-10): ''' sobre muestras de fi para cada xi integral con método de Simpson 1/3 respuesta es np.nan para tramos desiguales, no hay suficientes puntos. ''' n = len(xi) i = 0 suma = 0 while not(i>=(n-2)): h = xi[i+1]-xi[i] dh = abs(h - (xi[i+2]-xi[i+1])) if dh<tolera:# tramos iguales unS13 = (h/3)*(fi[i]+4*fi[i+1]+fi[i+2]) suma = suma + unS13 else: # tramos desiguales suma = 'tramos desiguales en i: '+str(i) suma = suma ' , '+str(i+2) i = i + 2 if i<(n-1): # incompleto, faltan tramos por calcular suma = 'tramos incompletos, faltan ' suma = suma ++str((n-1)-i)+' tramos' return(suma) # PROGRAMA ----------------- # INGRESO xi = [1. , 1.5, 2. , 2.5, 3.] fi = [0.84147098, 1.22167687, 1.28594075, 0.94626755, 0.24442702] # PROCEDIMIENTO Area = integrasimpson13_fi(xi,fi) # SALIDA print('tramos: ',len(xi)-1) print('Integral con Simpson 1/3: ',Area) if type(Area)==str: print(' Revisar errores...')
resultados
tramos: 4 Integral con Simpson 1/3: 2.0549261966666665 >>>
[ Simpson 1/3 ] [ Ejercicio ] [Algoritmo Python] [ función Python]
Fórmula con varios segmentos y h constante
Usado cuando el intervalo a integrar tiene varios segmentos, cada segmento tiene dos tramos. Ejemplo para dos segmentos, cuatro tramos, semejante al usado en la gráfica. La simplificación es válida si h es constante.
tomando factor común h/3
[ Simpson 1/3 ] [ Ejercicio ] [Algoritmo Python] [ función Python]