diferenciaciÓn numÉrica

16
Diferenciación Hacia Adelante Diferenciación Hacia Atrás DIFERENCIACIÓN NUMÉRICA EJERCICIO 1: Hacer un programa que efectúe la 1ª,2ª,3ª y 4ª derivada de un set de datos (X, Y), con las fórmulas de serie de Taylor. INTRODUCCIÓN. 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 diferenciación numérica hacia adelante, centrada y hacia atrás. A continuación las formulas Usadas:

Upload: victor-barreto-vasquez

Post on 30-Dec-2015

366 views

Category:

Documents


2 download

TRANSCRIPT

Diferenciación Hacia Adelante

Diferenciación Hacia Atrás

DIFERENCIACIÓN NUMÉRICA

EJERCICIO 1: Hacer un programa que efectúe la 1ª,2ª,3ª y 4ª derivada de un set de datos (X, Y), con las fórmulas de serie de Taylor.

INTRODUCCIÓN.

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 diferenciación numérica hacia adelante, centrada y hacia atrás. A continuación las formulas Usadas:

Diferenciación Centrada

Es importante decir, que debido a que el programa usa las fórmulas de diferenciación basadas en la serie de Taylor, los datos ingresados deben ser regularmente espaciados, es decir debe haber la misma distancia(tamaño de paso) entre cada uno de los puntos de la variable dependiente

EJECUCIÓN Y DESCRIPCIÓN DEL PROGRAMA

- Al ejecutar el programa, se nos presenta un pequeño 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, también para todos los puntos y así sucesivamente.

- Ahora verificaremos los resultados de la primera derivada con el comando “gradient”,que nos ofrece Matlab, el cuál 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 idénticos a los obtenidos por la función “gradient” de las librerías de Matlab

- El programa tiene algunos filtros intentando que el trabajo que realice sea óptimo, el primero de ellos es verificar si el tamaño de paso es del mismo tamaño entre cada punto de la variable dependiente(X), al no cumplirse esta condición, el programa imprimirá un mensaje de error, saltara todas las instrucciones y terminará:

Como vemos, uno de los datos ingresados (5.5), genera un tamaño 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 fórmulas 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 código 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 característica:

Esta vez solo ingresamos 4 pares de datos, el programa encuentra las primeras y segundas derivadas sin ningún problema pero, debido a los datos necesarios para el cálculo de la tercera derivada, solo podemos efectuar las derivadas en los puntos extremos. Esto se puede verificar analizando las fórmulas para la tercera derivada por Derivación Hacia Adelante, Hacia Atrás y centrada; mostradas al inicio.Para hallar la derivada en el primer punto, se puede utilizar solamente Derivación hacia Adelante, en el último punto, solo podemos usar Derivación hacia atrás, la derivación 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 líneas anteriores, utiliza las tres variantes del método de diferenciación numérica basado en series de Taylor. Por ejemplo, la primera derivada en el primer punto se obtiene utilizando Diferenciación Hacia Adelante; las derivadas en los puntos siguientes se obtienen usando Diferenciación Centrada y la derivada en el último dato, con Diferenciación Hacia Atrás.

CODIGO DEL PROGRAMA:

clc; clear all;fprintf('PROGRAMA PARA EFECTUAR LA DERIVACIÓN 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 tamaño 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; endendif e>0,error ('Los datos deben ser igualmente espaciados');endfprintf('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 adelantepridrv(1,1)=(y(1,2)-y(1))/h;%Desde el segundo dato hasta el penúltimo, Direncias finitas centradasfor 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 atraspridrv(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 derivadasegdrv=zeros(1,n);if n<3 fprintf('No se puede calcular la segunda derivada con solo 2 datos\n'); elsesegdrv(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); endelseterdrv=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);endterdrv(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 derivadaif 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(n-4))/h.^4; fprintf('Estas son:'); disp(excuadrv); endelsecuadrv=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,i-2))/h.^4;endcuadrv(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(n-5))/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 método de Lagrange

DERIVACION CON DATOS DESIGUALMENTE ESPACIADOS

Hasta aquí, todas las fórmulas de derivación numérica se han basado en datos igualmente espaciados. Sin embargo, la información empírica (datos obtenidos experimentalmente) con frecuencia se obtiene a intervalos desiguales.

Para calcular una derivada en datos irregularmente espaciados, se ajusta un polinomio de interpolación de Lagrange de segundo grado a cada conjunto de tres puntos adyacentes Recordemos que los polinomios de interpolación no requieren que los puntos estén igualmente espaciados. Si se deriva analíticamente el polinomio de segundo grado se obtiene:

Ejemplo: Dada la siguiente tabla

x f(x)

0,45 0,96848

0,52 0,90640

0,62 0,80227

0,67 0,74278

0,74 0,65042

0,78 0,59260

0,84 0,49850

0,89 0,41296

Determinar la primera derivada en x = 0.7

Se procede de la siguiente manera: se seleccionan los tres puntos más cercanos al valor que necesitamos evaluar, los cuales son el punto inmediatamente anterior y los dos

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

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

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

2x - xi+1 - xi+2 f(xi)f’(x) =

inmediatamente siguientes {0.67, 0.74, 0.78} ya que nos dan un intervalo más corto (0.11) en contra del conjunto {0.62, 0.67, 0.74} que da un intervalo de 0.12. Para nuestro caso, serían:

0,67 0,74278

0,74 0,65042

0,78 0,59260

Y los etiquetamos para reemplazar en la fórmula:

X(i) 0,67 0,74278 F[X(i)]

X(i+1) 0,74 0,65042 F[X(i+1)]

X(i+2) 0,78 0,59260 F[X(i+2)]

X es el valor a evaluar, para este ejemplo, X = 0.7

Al reemplazar, tenemos:

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

EJECUCIÓN Y DESCRIPCION DEL PROGRAMA

EL programa realizado para este ejercicio, calcula una aproximación a la derivada de un set de datos desigualmente espaciados en un punto deseado, usando el método de Lagrange. La fórmula utilizada es la que se utilizó para resolver el ejemplo que hemos presentado líneas anteriores.

f’(0.7) = 0.74278(0.67-0.78)(0.67-0.74)

2(0.7) – 0.74 - 0.78+ 0.65042

2(0.7) – 0.67 - 0.78

(0.74-0.67) (0.74-0.78)

+ 0.592602(0.7) – 0.67 - 0.74

(0.78-0.67) (0.78-0.74)

f’(0.7) = 0.74278-0.12

(-0.07) (-0.11)+ 0.65042

-0.05

(0.07) (-0.04)

+ 0.59260-0.01

(0.11) (0.04)

- Al ejecutar el archivo script, se nos presentará un pequeño 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 aproximación a la derivada en dicho punto

Como vemos el resultado coincide con obtenido analíticamente en el ejemplo anterior.

- El diseño del programa permite elegir, de todos los intervalos que incluyen al dato requerido, aquel que tenga el tamaño de paso más pequeño; de la misma manera q lo elegimos nosotros en el ejemplo desarrollado en el marco teórico presentado, garantizando así la mejor aproximación.

CODIGO DEL PROGRAMA

fprintf('PROGRAMA PARA EFECTUAR LA DERIVACIÓN 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'); endposxi=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 endk=j-1;%numero de elementos vector newposxi%Ahora seleccionaremos de estos, el intervalo mas pequeño: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); endend 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 endend%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)