Sei sulla pagina 1di 3

Laboratorio Mtodos Numricos

Diferenciacin Numrica
Objetivo
1. Analizar los errores incurridos al realizar diferenciaciones numricas simples: diferencia
hacia atras, adelante y central.
2. Entender los efectos que el ruido produce sobre las derivadas numricas.

Procedimiento
Escriba el siguiente guin:
// Este script sirve investigar el uso de las derivadas numericas sobre datos
// """"muestreados""""
// Empezamos por generar puntos para la funcion y = x*cos(x)
h = 0.1;
// paso de muestreo
x = 0:h:4;
sdev = 0.1;
y = x .*cos(x) + rand(x,"normal")*sdev;
// La derivada exacta de esta funcion es facil de hallar:
//
y = cos(x) - x*sin(x)
dyexacta = cos(x)-x .*sin(x);
// Ahora calculamos la derivada usando la diferencia finita hacia atras
// Buscamos el largo de x primero:
nl = max(size(x));

// Aplicamos la diferencia hacia atras. Notese que no es posible (sin extender los datos
// derivar el primer punto. Sacamos la division del ciclo para hacerlo mas eficiente.
for i = 2:nl
dyatras(1,i) = y(i)-y(i-1);
end;
dyatras = dyatras/h;

// Aplicamos la diferencia hacia adelante ahora. Ahora no es posible encontrar la


// derivada en el ultimo punto. Teniendo el resultado anterior, existe una manera
// mas eficiente de hacer lo que sigue?
for i = 1:nl-1
dyadelante(1,i) = y(i+1)-y(i);
end;
dyadelante = dyadelante/h;
// Ahora encontramos la diferencia central. Ni el primer punto ni el final pueden
// ser hallados.
for i = 2:nl-1
dycentral(1,i) = y(i+1)-y(i-1);
end;
dycentral = dycentral/(2*h);

// Como las derivadas no fueron calculadas en todos los puntos y queremos graficarlas
// todas para compararlas a las reales, entonces vamos a """"rellenar"""" los puntos fal
// con los datos verdaderos.
dyatras(1) = dyexacta(1);
dyadelante(nl) = dyexacta(nl);
dycentral(1) = dyexacta(1);
dycentral(nl) = dyexacta(nl);
// Ahora podemos graficar y ver las diferencias con respecto al resultado
// ideal.
scf(1)
clf(1)
plot(x,dyexacta,"y",x,dyatras,"r",x,dyadelante,"g",x,dycentral,"b");
xtitle("Comparacion de las derivadas","x","dy/dx");
legend("Exacta","Atras","Adelante","Central");
// Ahora podemos graficar los errores.
scf(2)
clf(2)
plot(x,dyatras-dyexacta,"r",x,dyadelante-dyexacta,"g",x,dycentral-dyexacta,"b");
xtitle("Errores de las derivadas","x","Error dy/dx");
legend("Atras","Adelante","Central");
// Grafique la funcion real y la que tienen la bulla
scf(3)
clf(3)
plot(x,x .*cos(x),"g",x,y,"r");
xtitle("Efecto del ruido gaussiano")
legend("Sin ruido","Con ruido");

Ruido y su efecto
Ahora aadiremos ruido a la seal y. Asumiremos que el ruido es gaussiano (tiene
una distribucin normal) con valor esperado de 0 (promedio cero) y desviacin estndard 0,1.
Para hacerlo usamos la instruccin rand(N,normal) que genera un vector de dimensin N
aleatorio con distribucin normal unitaria. Multiplicamos el mismo por 0.1 para cambiar su
desviacin estndar.
Modificamos la linea que calcula el vector y, aadiendo el vector aleatorio:
y = x.*cos(x) + rand(x,normal)*sdev;
y aadimos al final del programa instrucciones para visualizar los resultados.

Preguntas
1. Qu mtodo de diferenciacin resulta mas exacto para este caso?
2. Compare los errores de la derivada en la presencia de ruido con los errores en y. Qu
efecto tuvo el ruido sobre la derivada?

Potrebbero piacerti anche