Universidad Nacional de Ingeniería Facultad de Ciencias Física Computacional CC063 Integracion Numerica Prof: J. Solano 202-I
Problema: Integrando un espectro Un experimento ha medido dn(t)/dt, el numero de particulas por unidad de tiempo entrando a un contador. El problema es integrar este espectro para obtener el numero de particulas N() que entro al contador en el primer segundo N ( )= dn (t ) 0 dt dt 2
Cuadratura (integracion) Numerica Integracion: definicion de Riemann y aproximacion numerica [ (b a )/h h i= Esta suma solo en general solo es exacta para Para polinomios puede ser exacta para N finito En general precision aumenta con N, con limitacion por redondeo El algoritmo/metodo depende del comportamiento especifico de f(x) Si hay una singularidad, hay que removerla antes de integrar 0 f ( x i )] 0 f ( x ) dx = x /3 dx = 0 N i= f ( x ) dx+ 0 N f (x i ) w i f ( x ) dx 3 y 3 dy ( y=x /3 ) 0 f ( x) dx x 2 = 2 0 f ( y 2 )dy 2 y 2 ( y 2 = x ) 3
Algoritmo: regla del trapezio Usa valores de f(x) de valores de x igualmente espaciados. Usa N puntos x i (i=,n), igualmente espaciados, h, en la regiom de integracion [a,b] e incluye los puntos finales. Entonces hay N- intervalos de longitud h. h= b a N x i =a+ (i ) h i=, N El algoritmo toma el intervalo de integracion I y construye un trapezio de ancho h. Esto aproxima f(x) por una linea recta en el intervalo i, y usa la altura (f i + f i+ )/2 como el valor de f. x +h i x i f ( x ) dx h ( f i +f i+ ) 2 = 2 hf i + 2 hf i+ Esto corresponde a f (x i ) w i con N=2 puntos con peso w i =/2. Aplicando la regla del trapezio a todo el intervalo [a,b], anhadimos la contribucion de cada intervalo Que corresponderia a w i ={h/2,h,...,h,h/2. N i= b a f ( x ) dx h 2 f + hf 2 + hf 3 +... + hf N + h 2 f N 4
Area de una parabola usando regla del trapezio /* Curso Fisica Computacional CC063 202-I CC-FC-UNI */ #include <stdio.h> #define TYPE #define N 00 int main() { TYPE sum, h, t, w; int i; double double A = 0.; double B = 3.; h = (B A) / (N ); sum = 0.; for (i=; i<=n; i++) { t = A + (i - )*h; if (i== i==n) w=h/2; else w=h; sum = sum + w * t* t; printf("%.8f \n", sum); // paso h // posicion t // suma (integral) // imprimir resultados 5
Area del exponente usando regla del trapezio Ejercicio: hacer los cambios necesarios en el programa anterior para integrar la funcion exponente en el mismo intervalo 6
Integral de exponente usando regla del trapezio /* Curso Fisica Computacional CC063 202-I CC-FC-UNI */ #include <stdio.h> #include <math.h> #define TYPE double #define N 00 int main() { TYPE sum, h, t, w; int i; double A = 0.; double B = 3.; h = (B A) / (N ); sum = 0.; for (i=; i<=n; i++) { t = A + (i - )*h; if (i== i==n) w=h/2; else w=h; sum = sum + w *exp(t); printf("%.8f \t %.8f \n", sum, exp(3)-); // paso h // posicion t // suma (integral) // imprimir resultados 7
Algoritmo: regla de Simpson En cada intervalo, la regla de Simpson aproxima el integrando f(x) por una parabola f ( x) ax 2 +bx+g Con intervalos aun igualmente espaciados. El area de cada seccion es la integral de esta parabola. (x i +h) (ax2+bx+g)dx = a x3 (x i ) 3 + b x2 2 + g x x i x i +h Para relacionar los parametros a, b, g a la funcion, se considera el intervalo [-,] (ax 2 +bx+g )dx = 2a 3 +2g Pero notamos que: f(-) = a b +g ; f(0) = g ; f() = a +b +g entonces dando a = f ( )+f ( ) 2 f (0) b = f ()+f ( ) 2 (ax 2 +bx+g )dx = f ( ) +4 f (0 ) 3 3 + f ( ) 3 g = f (0 ) generalizando x +h i x i h f ( x ) dx = x +h i x i x i f ( x ) dx + f ( x ) dx h x i h 3 f i +4h 3 f i + h 3 f i+ 8
Algoritmo: regla de Simpson La regla de Simpson hace la integracion elemental sobre pares de intervalos adyacentes, lo que implica que el numero total de intervalos debe ser par, o el numero de puntos N impar. Para aplicar la regla al intervalo total sumamos las contribuciones de cada par de subintervalos, contando todos, con excepcion del primero y el ultimo, dos veces b a f ( x ) dx h 3 f +4h 3 f 2 +2h 3 f 3 +4h 3 f 4 +...+4h 3 f N + h 3 f N Con los pesos de w i ={h/3,4h/3,2h/3,4h/3,...,4h/3,h/3 La suma de esos pesos debe ser N i= w i = ( N ) h 9
Ej: integracion usando regla de Simpson Ejercicio2: Escribir un programa para calcular la integral de una parabola (f(x) = x 2 ) en el intervalo [0,3] usando la regla de Simpson. Ejercicio3: Modificar el programa para calcular la integral de un exponente (f(x) = e x ) en el intervalo [0,3] usando la regla de Simpson. 0
Integral de exponente usando regla de Simpson /* Curso Fisica Computacional CC063 202-I CC-FC-UNI */ #include <stdio.h> #include <math.h> #define TYPE double #define N 0 int main() { TYPE sum, h, t, w; int i; double A = 0.; double B = 3.; h = (B A) / (N ); sum = 0.; for (i=; i<n; i+=2) { t = A + (i - )*h; w=h/3; sum = sum + w*exp(t) + 4*w*exp(t+h) + w*exp(t+2*h); printf("%.8f \t %.8f \n", sum, exp(3)-); // paso h // posicion t // suma (integral) // imprimir resultados
Error de integracion Ejercicio5: Escribir un programa para calcular el error en la integral de un exponente (f(x) = e x ) en el intervalo [0,3] usando la regla del trapezio, para diferentes valores de N. Ejercicio6: Modificar el programa para calcular el error en la integral de un exponente (f(x) = e x ) en el intervalo [0,3] usando la regla de Simpson, para diferentes valores de N. 2
Integral de exponente usando regla del trapezio #include <stdio.h> #include <math.h> #define TYPE double #define N0 00000000 int main() { TYPE sum, esum, h, t, w; int i, N; double A = 0.; double B = 3.; sum = 0.; FILE *output; output=fopen("p4-cap5-eintegr-trapez.dat","w"); for(n=0; i<n0; N *= 0){ sum = 0.; for (i=; i<n; i++) { h = (B A) / (N ); // paso h t = A + (i - )*h; // posicion t if (i== i==n) w=h/2; else w=h; sum = sum + w *exp(t); // suma (integral) esum = log0(fabs(sum exp(3)+)/(exp(3)-)); fprintf(output,"intt: %.8f intn: %.8f eint: %e h: %e N: %d \n",exp(3)-,sum,esum,h,n); printf("datos almacenados en p4-cap5-eintegr-trapez.dat \n"; // imprimir resultados fclose(output); return 0; 3
Integral de exponente usando regla de Simpson #include <stdio.h> #include <math.h> #define TYPE double #define N0 00000000 int main() { TYPE sum, esum, h, t, w; int i, N; double A = 0.; double B = 3.; sum = 0.; FILE *output; output=fopen("p5-cap5-eintegr-simpson.dat","w"); for(n=0; i<n0; N *= 0){ sum = 0.; for (i=; i<n; i+=2) { h = (B A) / (N); // paso h t = A + (i - )*h; // posicion t w=h/3; sum = sum + w *exp(t) + 4*w*exp(t+h) +w*exp(t+2*h); // suma (integral) esum = log0(fabs(sum exp(3)+)/(exp(3)-)); fprintf(output,"intt: %.8f intn: %.8f eint: %e h: %e N: %d \n",exp(3)-,sum,esum,h,n); printf("datos almacenados en p5-cap5-eintegr-simpson.dat \n"; // imprimir resultados fclose(output); return 0; 4