Sunteți pe pagina 1din 13

DIFERENCIACIN NUMRICA EJERCICIO 1: Hacer un programa que efecte la 1,2,3 y 4 derivada de un set de datos (X, Y), con las

frmulas de serie de Taylor. INTRODUCCIN. El programa realizado solicitar el ingreso de dos vectores de datos que contengan; uno, la variable independiente y el otro, la variable dependiente; para encontrar las aproximaciones de sus derivadas primera y mayores, utilizando la diferenciacin numrica hacia adelante, centrada y hacia atrs. A continuacin las formulas Usadas:

Diferenciacin Hacia Adelante

Diferenciacin Hacia Atrs

Diferenciacin Centrada

Es importante decir, que debido a que el programa usa las frmulas de diferenciacin basadas en la serie de Taylor, los datos ingresados deben ser regularmente espaciados, es decir debe haber la misma distancia(tamao de paso) entre cada uno de los puntos de la variable dependiente EJECUCIN Y DESCRIPCIN DEL PROGRAMA Al ejecutar el programa, se nos presenta un pequeo dialogo, que nos solicita ingresar los datos de las variables dependiente e independiente:

Luego deberemos ingresar dos vectores, uno para cada variable:

El programa nos devolver las aproximaciones de las derivadas en todos los puntos

Como vemos el programa nos da como resultado cuatro vectores, el primero contiene la primera derivada en todos los puntos ingresados, el segundo, las segundas derivadas, tambin para todos los puntos y as sucesivamente.

Ahora verificaremos los resultados de la primera derivada con el comando gradient,que nos ofrece Matlab, el cul puede calcular las aproximaciones de las derivadas por medio de series de Taylor:

Como podemos ver los resultados obtenidos con nuestro programa, para la primera derivada, son idnticos a los obtenidos por la funcin gradient de las libreras de Matlab El programa tiene algunos filtros intentando que el trabajo que realice sea ptimo, el primero de ellos es verificar si el tamao de paso es del mismo tamao entre cada punto de la variable dependiente(X), al no cumplirse esta condicin, el programa imprimir un mensaje de error, saltara todas las instrucciones y terminar:

Como vemos, uno de los datos ingresados (5.5), genera un tamao de paso de 0.5 y 1.5 (entre 5 y 0.5 y entre 0.5 y 6, respectivamente), diferentes al del resto (1), el programa se percata de este error. Debido a las frmulas que se utilizan (mostradas en la primera parte del informe); se puede ver que, para obtener una primera derivada solo son necesarios dos datos, para una segunda se necesitan tres, y as sucesivamente. En el programa hay secciones de cdigo que permite informar al usuario si es que no se puede calcular alguna derivada por falta de datos o en cuales es posible calcularlas con solamente cierta cantidad de datos ingresados. En la siguiente captura de pantalla mostramos esta caracterstica:

Esta vez solo ingresamos 4 pares de datos, el programa encuentra las primeras y segundas derivadas sin ningn problema pero, debido a los datos necesarios para el clculo de la tercera derivada, solo podemos efectuar las derivadas en los puntos extremos. Esto se puede verificar analizando las frmulas para la tercera derivada por Derivacin Hacia Adelante, Hacia Atrs y centrada; mostradas al inicio. Para hallar la derivada en el primer punto, se puede utilizar solamente Derivacin hacia Adelante, en el ltimo punto, solo podemos usar Derivacin hacia atrs, la derivacin centrada no se puede usar para esta cantidad de datos. Como podemos verificar en las formulas referidas, con solo 4 datos no podemos obtener una derivada de cuarto grado.

ALGUNAS ACOTACIONES IMPORTANTES: El programa, como se ha dicho en lneas anteriores, utiliza las tres variantes del mtodo de diferenciacin numrica basado en series de Taylor. Por ejemplo, la primera derivada en el primer punto se obtiene utilizando Diferenciacin Hacia Adelante; las derivadas en los puntos siguientes se obtienen usando Diferenciacin Centrada y la derivada en el ltimo dato, con Diferenciacin Hacia Atrs.

CODIGO DEL PROGRAMA:


clc; clear all; fprintf('PROGRAMA PARA EFECTUAR LA DERIVACIN DE UN SET DE DATOS\n\n'); fprintf('El programa le brindar la 1,2,3 y 4 derivada\n\n'); fprintf('Ingrese datos de variable independiente:\n'); fprintf('(RECUERDE QUE ESTOS DATOS DEBEN SER REGULARMENTE ESPACIADOS\n'); x=input('Ej.[0 1 2 3 4 5 6 7 8 9 10])'); n=length(x); e=0; for i=1:n-3%este bucle verificar que el tamao de paso sea el mismo if (x(1,i+1)-x(1,i))~=(x(1,i+2)-x(1,i+1)) e=e+1; break; end end if e>0,error ('Los datos deben ser igualmente espaciados');end fprintf('Ingrese datos de la variable dependiente: \n'); y=input('(Ej.[1.4 2.1 3.3 4.8 6.8 6.6 8.6 7.5 8.9 10.9 10])'); h=x(1,2)-x(1,1); n=length(x); pridrv=zeros(1,n); %.................................-------................................ %Realizamos la primera derivada de los datos ingresados por diferencias %finitas. %primer dato, diferencias finitas hacia adelante pridrv(1,1)=(y(1,2)-y(1))/h; %Desde el segundo dato hasta el penltimo, Direncias finitas centradas for i=2:n-1 pridrv(1,i)=(y(1,i+1)-y(1,i-1))/(2.*h); end %Para el ltimo dato, diferencias finitas hacia atras pridrv(1,n)=(y(1,n)-y(1,n-1))/h; fprintf('\n\nRESULTADOS!\n'); fprintf('Las primeras derivadas para los datos ingresados son, respecticamente :\n'); disp(pridrv); %Ahora Desarrollaremos la segunda derivada segdrv=zeros(1,n); if n<3 fprintf('No se puede calcular la segunda derivada con solo 2 datos\n'); else segdrv(1,1)=(y(1,3)-2.*y(1,2)+y(1,1))/h.^2; for i=2:n-1 segdrv(1,i)=(y(1,i+1)-2.*y(1,i)+y(1,i-1))/h.^2; end segdrv(1,n)=(y(1,n)-2.*y(1,n-1)+y(1,n-2))/h.^2; fprintf('Las segundas derivadas para los datos ingresados son, respectivamente: \n'); disp(segdrv); end %Tercera derivada:

if n<5 if n<4 fprintf('No se puede hallar la tercera derivada con menos de 4 datos\n'); else fprintf('Con cuatro datos solo podemos hallar terceras derivadas en los extremos'); fprintf('\n'); exterdrv=zeros(1,2); exterdrv(1,1)=(y(1,4)-3.*y(1,3)+3.*y(1,2)-y(1,1))/h.^3; exterdrv(1,2)=(y(1,n)-3.*y(1,n-1)+3.*y(1,n-2)-y(1,n-3))/h.^3; fprintf('Estas son: '); disp(exterdrv); end else terdrv=zeros(1,n); terdrv(1,1)=(y(1,4)-3.*y(1,3)+3.*y(1,2)-y(1,1))/h.^3; terdrv(1,2)=(y(1,5)-3.*y(1,4)+3.*y(1,3)-y(1,2))/h.^3; for i=3:n-2 terdrv(1,i)=(y(1,i+2)-2.*y(1,i+1)+2.*y(1,i-1)-y(1,i-2))/(2*h.^3); end terdrv(1,n-1)=(y(1,n-1)-3.*y(1,n-2)+3.*y(1,n-3)-y(1,n-4))/h.^3; terdrv(1,n)=(y(1,n)-3.*y(1,n-1)+3.*y(1,n-2)-y(1,n-3))/h.^3; fprintf('Las terceras derivadas para los datos ingresados son, respectivamente: \n'); disp(terdrv); end %Cuarta derivada if n<6 if n<5 fprintf('No se puede hallar la cuarta derivada con menos de 5 datos\n'); else fprintf('Con cinco datos solo podemos hallar cuartas derivadas en los extremos\n'); excuadrv(1,1)=(y(1,5)-4.*y(1,4)+6.*y(1,3)4.*y(1,2)+y(1))/h.^4; excuadrv(1,2)=(y(1,n)-4.*y(1,n-1)+6.*y(1,n-2)-4.*y(1,n-3)+y(n4))/h.^4; fprintf('Estas son:'); disp(excuadrv); end else cuadrv=zeros(1,n); cuadrv(1,1)=(y(1,5)-4.*y(1,4)+6.*y(1,3)-4.*y(1,2)+y(1))/h.^4; cuadrv(1,2)=(y(1,6)-4.*y(1,5)+6.*y(1,4)-4.*y(1,3)+y(2))/h.^4; for i=3:n-2 cuadrv(1,i)=(y(1,i+2)-4.*y(1,i+1)+6.*y(1,i)-4.*y(1,i-1)+y(1,i2))/h.^4; end cuadrv(1,n)=(y(1,n)-4.*y(1,n-1)+6.*y(1,n-2)-4.*y(1,n-3)+y(n-4))/h.^4; cuadrv(1,n-1)=(y(1,n-1)-4.*y(1,n-2)+6.*y(1,n-3)-4.*y(1,n-4)+y(n5))/h.^4; fprintf('Las cuartas derivadas para los datos ingresados son, respectivamente: \n'); disp(cuadrv); end

EJERCICIO 1: Hacer un programa que para derivar un set de datos utilizando el mtodo de Lagrange DERIVACION CON DATOS DESIGUALMENTE ESPACIADOS Hasta aqu, todas las frmulas de derivacin numrica se han basado en datos igualmente espaciados. Sin embargo, la informacin emprica (datos obtenidos experimentalmente) con frecuencia se obtiene a intervalos desiguales. Para calcular una derivada en datos irregularmente espaciados, se ajusta un polinomio de interpolacin de Lagrange de segundo grado a cada conjunto de tres puntos adyacentes Recordemos que los polinomios de interpolacin no requieren que los puntos estn igualmente espaciados. Si se deriva analticamente el polinomio de segundo grado se obtiene:

f(x) = f(xi)

2x - xi+1 - xi+2 (xi - xi+2) (xi - xi+1)

+ f(xi+1)

2x - xi - xi+2 (xi+1 - xi+2) (xi+1 - xi)

+ f(xi+2)

2x - xi - xi+1 (xi+2 - xi) (xi+2 - xi+1)

Ejemplo: Dada la siguiente tabla x 0,45 0,52 0,62 0,67 0,74 0,78 0,84 0,89 f(x) 0,96848 0,90640 0,80227 0,74278 0,65042 0,59260 0,49850 0,41296

Determinar la primera derivada en x = 0.7 Se procede de la siguiente manera: se seleccionan los tres puntos ms cercanos al valor que necesitamos evaluar, los cuales son el punto inmediatamente anterior y los dos

inmediatamente siguientes {0.67, 0.74, 0.78} ya que nos dan un intervalo ms corto (0.11) en contra del conjunto {0.62, 0.67, 0.74} que da un intervalo de 0.12. Para nuestro caso, seran: 0,67 0,74 0,78 0,74278 0,65042 0,59260

Y los etiquetamos para reemplazar en la frmula: X(i) X(i+1) X(i+2) 0,67 0,74 0,78 0,74278 0,65042 0,59260 F[X(i)] F[X(i+1)] F[X(i+2)]

X es el valor a evaluar, para este ejemplo, X = 0.7 Al reemplazar, tenemos:

f(0.7) =

0.74278

2(0.7) 0.74 - 0.78 (0.67-0.74) (0.67-0.78) 2(0.7) 0.67 - 0.74 (0.78-0.67) (0.78-0.74) -0.12 (-0.07) (-0.11) -0.01 (0.11) (0.04)

+ 0.65042

2(0.7) 0.67 - 0.78 (0.74-0.67) (0.74-0.78)

+ 0.59260

f(0.7) =

0.74278

+ 0.65042

-0.05 (0.07) (-0.04)

+ 0.59260

f(0.7) = (0.74278*(-15.58442)) + (0.65042*17.85714) + (0.59260*(-2.27273)) f(0.7) = (-11.57586) + (11.61464) + (-1.34682) f(0.7) = -1.30804 EJECUCIN Y DESCRIPCION DEL PROGRAMA EL programa realizado para este ejercicio, calcula una aproximacin a la derivada de un set de datos desigualmente espaciados en un punto deseado, usando el mtodo de Lagrange. La frmula utilizada es la que se utiliz para resolver el ejemplo que hemos presentado lneas anteriores.

Al ejecutar el archivo script, se nos presentar un pequeo dialogo que nos solicitar ingresar un vector para la variable dependiente (X) y otro vector para la variable independiente(Y)

Ingresamos los datos y el punto en el que queremos calcular la derivada:

EL programa nos devuelve la aproximacin a la derivada en dicho punto

Como vemos el resultado coincide con obtenido analticamente en el ejemplo anterior. El diseo del programa permite elegir, de todos los intervalos que incluyen al dato requerido, aquel que tenga el tamao de paso ms pequeo; de la misma manera q lo elegimos nosotros en el ejemplo desarrollado en el marco terico presentado, garantizando as la mejor aproximacin.

CODIGO DEL PROGRAMA


fprintf('PROGRAMA PARA EFECTUAR LA DERIVACIN DE UN SET DE DATOS DESIGUALMENTE ESPACIADOS\n\n'); fprintf('Ingrese datos de variable independiente:\n'); x=input('(Ej.[0.45 0.52 0.62 0.67 0.74 0.78 0.84 0.89])\n-------->'); fprintf('Ingrese datos de la variable dependiente: \n'); y=input('(Ej.[0.96848 0.90640 0.80227 0.74278 0.65042 0.59260 0.49850 0.41296])\n-------->'); fprintf('\n'); xx=input('en que punto quiere calcular la derivada? '); n=length(x); if xx>x(1,n), error ('El dato solicitado debe estar dentro del intervalo de datos muestreados'); end posxi=zeros(1,n); posint=zeros(1,n); %Con el siguiente bucle seleccionamos el primer elemento de los intervalos %de tres datos adyascentes que incluyen al punto en donde se quiere derivar. j=1; for i=1:n-2 if x(1,i)<=xx && x(1,i+2)>=xx posxi(1,j)=x(1,i); posint(1,j)=x(1,i+2)-x(1,i); j=j+1; end end k=j-1;%numero de elementos vector newposxi %Ahora seleccionaremos de estos, el intervalo mas pequeo: newposxi=zeros(1,k); newposint=zeros(1,k); for i=1:k newposxi(1,i)=posxi(1,i); newposint(i,i)=posint(1,i); end %disp(newposxi); auxposint=newposint; for i=1:k-1 if auxposint(1,i)<auxposint(1,i+1) auxposint(1,i+1)=auxposint(1,i); end end minint=auxposint(1,k); %disp (minxi); for r=1:k if newposint(1,r)== minint for t=1:n if x(1,t)==newposxi(1,r) i=t; end end end end %disp(x(1,i));

der=y(1,i)*(2.*xx-x(1,i+1)-x(1,i+2))/((x(1,i)-x(1,i+1)).*(x(1,i)x(1,i+2)))+y(1,i+1).*(2.*xx-x(1,i)-x(1,i+2))/((x(1,i+1)x(1,i))*(x(1,i+1)-x(1,i+2)))+y(1,i+2).*(2.*xx-x(1,i)x(1,i+1))/((x(1,i+2)-x(1,i)).*(x(1,i+2)-x(1,i+1))); fprintf('\n\n'); fprintf('la derivada en el punto solicitado es: '); disp(der)

S-ar putea să vă placă și