4o Semestre
Mayo 16 de 2012
%Conjunto de programas de an alisis num erico para calcular integrales %definidas y derivadas en punto de alguna funci on %Se limpian variables clear alto = 0; disp(Selecciona alguno de los programas para ejecutarlo: ) disp(Integraci on) disp( 1 M etodo del Trapecio) disp( 2 M etodo Simpson 1/3 y 3/8) disp(Derivaci on) disp( 3 Extrapolaci on de Richardson) %Se solicita el programa hasta recibir una opci on v alida while alto == 0 s = input(Escribe el n umero correspondiente al programa: ); switch s case 1 trapecio alto = 1; case 2 simpson alto = 1; case 3 richardson alto = 1; otherwise disp(Opci on inv alida, por favor selecciona una opci on v alida) end end
A continuaci on se muestra y explica el script del programa trapecio, el cual est a limitado en cuanto a intervalos.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
%Programa que calcula la integral definida de una funci on mediante %el m etodo del trapecio %A continuaci on se limpian los valores en las variables clear %A continuaci on se solicita la funci on, los l mites y los segmentos f = input(Ingrese la funci on f(x)= ,s); a = input(Ingrese el l mite inferior: ); b = input(Ingrese el l mite superior: ); %Se solicita el n umero de intervalos hasta obtener una opci on v alida alto=0; while alto == 0 n = input(Ingrese el n umero de aplicaciones del m etodo [1-20]: ); na=round(n); if na==n if n>0 if n<21 alto=1; end end end if alto==0 disp(Opci on inv alida, selecciona entre 1 y 20) end end %Posteriormente se calcula el valor del intervalo d=(b-a)/n; %Ahora se calcula la suma de las evaluaciones de la funci on en cada %intervalo sin contar el primer y el ultimo valor s=0; for i=1:n-1 s=s+subs(f,a+(i*d)); end %Se calcula posteriormente el valor definitivo de la integral definida %utilizando la f ormula del m etodo del trapecio r=(b-a)*((subs(f,a)+2*s+subs(f,b))/(2*n)); %Se despliega el resultado disp([El valor calculado de la integral definida es num2str(r)]) %Se calcula la integral m as exacta k=int(sym(f)); r1=subs(k,b)-subs(k,a); disp([El valor real de la integral definida es num2str(r1)])
A continuaci on se muestra y explica el script del programa del m etodo de Simpson, el cual est a limitado en cuanto a intervalos tambi en. N otese que no se agrega elecci on
para el grado del polin omio en la aproximaci on debido a que esto est a en funci on del n umero de intervalos, el m etodo de Simpson 1/3 (apoximaci on por polinomios de segundo grado) es solo para un n umero impar de puntos, o bien, para un n umero par de intervalos. Por lo contrario el m etodo de Simpson 3/8 (aproximaci on por polinomios de tercer grado) es solo para un n umero par de puntos(a decir 4) o bien para un n umero impar de intervalos (a decir, 3). Una combinaci on de estos dos nos permite cubrir n umeros de intervalos grandes pares. En espec co en este programa para n umeros de intervalos pares, es decir, n umero de puntos impares, se aplica multiples veces el m etodo de Simpson 1/3, y si se presentan n umeros de intervalos impares, se toman 3 intervalos para aplicar ah m etodo de Simpson 3/8, lo cual nos cambia la paridad del n umero de intervalos por calcular, y posteriormente aplicamos el m etodo de Simpson 1/3 el resto de los intervalos.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
%Programa que calcula la integral definida de una funci on mediante %la regla de Simpson %A continuaci on se limpian los valores en las variables clear %A continuaci on se solicita la funci on, los l mites y los segmentos f = input(Ingrese la funci on f(x)= ,s); a = input(Ingrese el l mite inferior: ); b = input(Ingrese el l mite superior: ); %Se solicita el n umero de intervalos hasta obtener una opci on v alida alto=0; while alto == 0 n = input(Ingrese el n umero de aplicaciones del m etodo [1-10]: ); na=round(n); if na==n if n>0 if n<11 alto=1; end end end if alto==0 disp(Opci on inv alida, selecciona entre 1 y 10) end end %Posteriormente se calcula el valor del intervalo d=(b-a)/n; Ip=0; Ii=0; na=round(n/2); %Se detecta la paridad del n umero de secciones if (n/2)==na %Siendo par el n umero de intervalo, basta con aplicar el M etodo de %Simpson 1/3
33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78
%A continuaci on se suman separadamente los intervalos impares y pares p=0; q=0; for i=1:n-1 s=round(i/2); if (i/2)==s q=q+subs(f,a+(i*d)); else p=p+subs(f,a+(i*d)); end end %Se calcula posteriormente el valor definitivo de la integral definida Ip=(b-a)*((subs(f,a)+4*p+2*q+subs(f,b))/(3*n)); else %En caso de ser impar el n umero de secciones, se utilizar a una %aplicaci on del M etodo de Simpson 3/8 para cambiar la paridad %del n umero de secciones y despu es aplicar al resto %M etodo de Simpson 1/3 m ultiples veces if n==1; disp(No se puede aproximar un polin omio y luego integrarlo) disp(por el M etodo de Simpson con solo 1 secci on(2 puntos)) return end if n>=3 %Se aplica una vez el m etodo de Simpson 3/8 Ii=(3*d)*((subs(f,a)+(3*subs(f,a+d))+(3*subs(f,a+(2*d)))+subs(f,a+(3*d)))/8); if n>3 p=0; q=0; for i=4:n-1 s=round(i/2); if (i/2)==s q=q+subs(f,a+(i*d)); else p=p+subs(f,a+(i*d)); end end %Se aplican las veces m ultiples necesarias el m etodo de %Simpson 1/3 Ip=((n-3)*d)*((subs(f,a+(3*d))+4*q+2*p+subs(f,b))/(3*(n-3))); end end end I=Ip+Ii; %Se despliega el resultado disp([Por M. Simpson el valor de la integral definida es num2str(I)])
79 80 81 82
%Programa que calcula la derivada en un punto por el %M etodo de Extrapolaci on de Richardson %A continuaci on se limpian los valores en las variables clear %A continuaci on se solicita la funci on, el punto a evaluar y %el tama~ no del intervalo f = input(Ingrese la funci on f(x)= ,s); x = input(Ingrese el punto x donde se desee la derivada: ); h1 = input(Ingrese el tama~ no del intervalo h1: ); h2=h1/2; %Se calcula el intervalo m as peque~ no %Se calculan las evaluaciones de la funci on en puntos necesarios fxm2h1=subs(f,x-(2*h1)); fxmh1=subs(f,x-h1); fxMh1=subs(f,x+h1); fxM2h1=subs(f,x+(2*h1)); fx=subs(f,x); fxm2h2=subs(f,x-(2*h2)); fxmh2=subs(f,x-h2); fxMh2=subs(f,x+h2); fxM2h2=subs(f,x+(2*h2)); %Posteriormente se solicita la diferenciaci on a realizar disp(1 Diferenciaci on hacia adelante); disp(2 Diferenciaci on hacia atr as); disp(3 Diferenciaci on centrada); %Se calculan las derivadas en el punto pedido con dos intervalos h1 y h2 %dependiendo de la diferenciaci on seleccionada alto=0; while alto == 0 s = input(Escribe el n umero de la diferenciaci on que desee: ); switch s case 1 Dxh1=((-1*fxM2h1)+(4*fxMh1)+(-3*fx))/(2*h1); Dxh2=((-1*fxM2h2)+(4*fxMh2)+(-3*fx))/(2*h2); alto = 1; case 2 Dxh1=((fxm2h1)+(-4*fxmh1)+(3*fx))/(2*h1); Dxh2=((fxm2h2)+(-4*fxmh2)+(3*fx))/(2*h2); alto = 1; case 3 Dxh1=((-1*fxM2h1)+(8*fxMh1)+(-8*fxmh1)+(fxm2h1))/(12*h1); Dxh2=((-1*fxM2h2)+(8*fxMh2)+(-8*fxmh2)+(fxm2h2))/(12*h2); alto = 1; otherwise
44 45 46 47 48 49 50 51 52 53 54 55
disp(Opci on inv alida, por favor selecciona una opci on v alida) end end %Posteriormente se calcula el valor de la derivada en ese punto %mediante la f ormula de Richardson ya conocida Daprox=((4/3)*Dxh2)-((1/3)*Dxh1); %Se despliega el resultado disp([El valor de la derivada en ese punto es: num2str(Daprox)]) %Se calcula la derivada en ese punto m as exacta k=diff(sym(f)); de=subs(k,x); disp([El valor real de la derivada en ese punto es : num2str(de)])
En seguida se muestran ejecuciones del programa eligiendo distintas opciones y subprogramas como ejemplos.