Вы находитесь на странице: 1из 9

MARTINEZ PRADO FRANCCESCO 12190045

2.1 Escribir una funcin MATLAB df(x) que admita como entradas una vector de puntos x y los
valores de una funcin f en los mismos y que calcule el valor de la derivada primera en los mismos
utilizando la frmula de diferencia adelantada. Para calcular el valor en el extremo superior debe usarse
la frmula de diferencia retrasada.
Cdigo
clc
clear all
fprintf('Derivacion Numerica\n');
n=input('Ingrese el numero de puntos que va a ingresar: ');
h=input('\nIngrese el valor de h: ');
x=1:n;
y=1:n;
d=1:n;
for i=1:n
fprintf('\nIngrese el valor de x %d: ',i-1);
x(i)=input('');
fprintf('\nIngrese el valor de f(x %d): ',i-1);
y(i)=input('');
end
y1=polyfit(x,y,n-1);
%syms m;
display(y1);
%y2=poly2sym(y1, m);
%display(y2);
fprintf('Derivada con diferencia adelantada\n');
for i=1:n-1
d(i)=(polyval(y1,x(i)+h)-polyval(y1,x(i)))/h;
fprintf('f(x %d)=%.4f\n',i-1,d(i));
end
fprintf('Derivada con diferencia retrasada\n');
d(n)=(polyval(y1,x(i))-polyval(y1,x(i)-h))/h;
fprintf('f(x %d)=%.4f\n',n-1,d(n));

command window
Derivacion Numerica
Ingrese el numero de puntos que va a ingresar: 3
Ingrese el valor de h: 1
Ingrese el valor de x 0: 1
Ingrese el valor de f(x 0): 1
Ingrese el valor de x 1: 2
Ingrese el valor de f(x 1): 4
Ingrese el valor de x 2: 3
Ingrese el valor de f(x 2): 9
y1 =
1.0000 -0.0000 0
Derivada con diferencia adelantada
f(x 0)=3.0000
f(x 1)=5.0000
Derivada con diferencia retrasada
f(x 2)=3.0000

2.2 Aplicar la frmula de dos puntos adelantada al clculo de la derivada primera de f(x) = senx en
x = 2.13432. Comprobar que al ir reduciendo h el error se reduce de manera aproximadamente lineal con
h.
Cdigo
clc
clear all
fprintf('Derivacion Numerica\n');
fprintf('Derivada con diferencia adelantada\n');
syms x
f='sin(x)';
xo=2.13432;
h=input('\nIngrese el valor de h:');
der=1:7;
disp(der);
m=xo:xo:7*xo;
for i=1:7
der(i)=(subs(f,x,xo*(i)+h)-subs(f,x,xo*(i)))/h;
end
f1=diff(sym(f));
d=subs(f1,x, m);
error=(d-der);
error=error./d;
display(error);
display(m);
display(der);
h1=h:h:7*h;
xx=linspace(h,h*7);
p=polyfit(h1,error ,1)
z=polyval(p,xx);
error=abs(error);
plot(xx,z,h1,error,'ro');

command window
Derivacion Numerica
Derivada con diferencia adelantada
Ingrese el valor de h:0.5
Columns 1 through 6
1 2 3 4 5 6
Column 7
7
error =
Columns 1 through 4
-0.3463 0.5562 0.0706 -0.2596
Columns 5 through 7
0.7702 0.1009 -0.1952
m =
Columns 1 through 4
2.1343 4.2686 6.4030 8.5373
Columns 5 through 7
10.6716 12.8059 14.9402
der =
Columns 1 through 4
-0.7192 -0.1905 0.9227 -0.7952
Columns 5 through 7
-0.0731 0.8734 -0.8599

p =
0.0173 0.0649

2.3 Repetir el ejercicio anterior comparando la precisin de la frmula de diferencia adelantada con la
retrasada. Aplicar tambin ambas frmulas al clculo de la derivada de la funcin g(x)=1/(1 + ex) en
x = 1/2
Cdigo
clc
clear all
fprintf('Derivacion Numerica\n');
fprintf('Derivada con diferencia adelantada\n');
syms x
f='1/(1+exp(x))';
xo=1/2;
h=input('\nIngrese el valor de h: ');
der=(subs(f,x,xo+h)-subs(f,x,xo))/h;
fprintf('Derivada con diferencia adelantada: %.4f\n',der);
der1=(subs(f,x,xo)-subs(f,x,xo-h))/h;
fprintf('Derivada con diferencia atrasada: %.4f\n',der1);
f1=diff(sym(f));
d=subs(f1,x,xo);
error=abs((d-der)/d);
error1=abs((d-der1)/d);
fprintf('Error con diferencia adelantada: %f\n',error);
fprintf('Error con diferencia atrasada: %f\n',error1);
if(error==error1)
fprintf('El error es igual');
elseif error>error1
fprintf('El error de la diferencia retrasada es menor que la
diferencia adelantada');
else
fprintf('El error de la diferencia adelantada es menor que la
diferencia retrasada');
end

command window
Derivacion Numerica
Derivada con diferencia adelantada
Ingrese el valor de h: 0.01
Derivada con diferencia adelantada: -0.2347
Derivada con diferencia atrasada: -0.2353
Error con diferencia adelantada: 0.001231
Error con diferencia atrasada: 0.001218
El error de la diferencia retrasada es menor que la diferencia adelantada

2.4 Supongamos que se conoce el valor de la derivada mediante la frmula de diferencia adelantada para
tres valores de h diferentes. Es posible estimar el valor del h ptimo? Es posible estimar el error que se
comete en el clculo en cada uno de los casos?. Aplicarlo al clculo de la derivada de la funcin
f(x) = senx en x = 0.6 usando h = 0.1,h = 0.01 y h = 0.0000000001.

Cdigo
clc
clear all
syms x
h=0;
y=input('Ingrese la funcion que desea derivar: ');
xi=input('Ingrese el punto en el cual desea calcular la derivada: ');
while(h<=0)
h=input('Ingrese h: ');
if(h<=0)
display('h debe ser mayor a cero')
end
end
vreal=subs(diff(y),x, xi);
vaproximado=(subs(y,x,xi+h)-subs(y,x,xi))/h;
vreal2=subs(diff(diff(y)),x, xi);
vaproximado2=(subs(y,x,xi+2*h)-2*subs(y,x,xi+h)+subs(y,x,xi))/(h^2);
error=abs((vreal-vaproximado)/vreal)*100;
error2=abs((vreal2 -vaproximado2)/vreal2)*100;
fprintf('\nValor real 1ra derivada: %.4f\n',vreal)
fprintf('Valor aproximado 1ra derivada: %.4f\n',vaproximado)
fprintf('Error: %.2f %\n',error)
fprintf('\nValor real 2da derivada: %.4f\n',vreal2)
fprintf('Valor aproximado 2da derivada: %.4f\n',vaproximado2)
fprintf('Error: %.2f %\n',error2)

command window
Ingrese la funcion que desea derivar: sin(x)
Ingrese el punto en el cual desea calcular la derivada: 0.6
Ingrese h: 0.1
Valor real 1ra derivada: 0.8253
Valor aproximado 1ra derivada: 0.7958
Error: 3.58
Valor real 2da derivada: -0.5646
Valor aproximado 2da derivada: -0.6437
Error: 14.00
2.5 Calcular la derivada de la funcin f(x) = tanx en x = 3.14 usando h = 0.1 y h = 0.01. Comparar el
resultado con el valor exacto. Es buena la aproximacin? Por qu?

Cdigo
clc
clear all
syms x
h=0;
y=input('Ingrese la funcion que desea derivar: ');
xi=input('Ingrese el punto en el cual desea calcular la derivada: ');
while(h<=0)
h=input('Ingrese h: ');
if(h<=0)
display('h debe ser mayor a cero')
end
end
vreal=subs(diff(y),x, xi);
vaproximado=(subs(y,x,xi+h)-subs(y,x,xi))/h;
vreal2=subs(diff(diff(y)),x, xi);
vaproximado2=(subs(y,x,xi+2*h)-2*subs(y,x,xi+h)+subs(y,x,xi))/(h^2);
error=abs((vreal-vaproximado)/vreal)*100;
error2=abs((vreal2 -vaproximado2)/vreal2)*100;
fprintf('\nValor real 1ra derivada: %.4f\n',vreal)
fprintf('Valor aproximado 1ra derivada: %.4f\n',vaproximado)
fprintf('Error: %.2f %\n',error)
fprintf('\nValor real 2da derivada: %.4f\n',vreal2)
fprintf('Valor aproximado 2da derivada: %.4f\n',vaproximado2)
fprintf('Error: %.2f %\n',error2)

command window
Ingrese la funcion que desea derivar: tan(x)
Ingrese el punto en el cual desea calcular la derivada: 3.141592654
Ingrese h: 0.1
Valor real 1ra derivada: 1.0000
Valor aproximado 1ra derivada: 1.0033
Error: 0.33
2.7 Construir una tabla de derivadas primeras de la funcin g(x) definida por la siguiente tabla en los
puntos xj con la mayor precisin posible mediante frmulas de tres puntos.

X g(x)
1.0 1.000000
1.2 0.997502
1.4 0.990025
1.8 0.960398
2.0 0.940678

Cdigo

clc
clear all
fprintf('Derivacion Numerica\n');
n=input('Ingrese el numero de puntos que va a ingresar: ');
h=input('\nIngrese el valor de h: ');
x=1:n;
y=1:n;
d=1:n;
for i=1:n
fprintf('\nIngrese el valor de x %d: ',i-1);
x(i)=input('');
fprintf('\nIngrese el valor de f(x %d): ',i-1);
y(i)=input('');
end
y1=polyfit(x,y,n-1);
%syms m;display(y1);
%y2=poly2sym(y1, m);
%display(y2);
fprintf('Derivada con diferencia adelantada\n');
for i=1:n-1
d(i)=(polyval(y1,x(i)+h)-polyval(y1,x(i)))/h;
fprintf('f(x %d)=%.4f\n',i-1,d(i));
end
fprintf('Derivada con diferencia retrasada\n');
d(n)=(polyval(y1,x(i))-polyval(y1,x(i)-h))/h;
fprintf('f(x %d)=%.4f\n',n-1,d(n));

command window
Derivacion Numerica
Ingrese el numero de puntos que va a ingresar: 5
Ingrese el valor de h: 0.1
Ingrese el valor de x 0: 1
Ingrese el valor de f(x 0): 1
Ingrese el valor de x 1: 1.2
Ingrese el valor de f(x 1): 0.997502
Ingrese el valor de x 2: 1.4
Ingrese el valor de f(x 2): 0.990025
Ingrese el valor de x 3: 1.8
Ingrese el valor de f(x 3): 0.960398
Ingrese el valor de x 4: 2
Ingrese el valor de f(x 4): 0.940678
Derivada con diferencia adelantada
f(x 0)=-0.0067
f(x 1)=-0.0308
f(x 2)=-0.0569
f(x 3)=-0.0966
Derivada con diferencia retrasada
f(x 4)=-0.0897

2.8 Usando la frmula de diferencia centrada calcular la derivada primera de la funcin f(x) = arctan x
en el punto x = 2 (el valor correcto es 1/3). Utilizar diferentes valores de h y estudiar los efectos de los
errores de redondeo y de truncacin
Cdigo
clc
clear all
syms x
h=0;
y=input('Ingrese la funcion que desea derivar: ');
xo=input('Ingrese el punto en el cual desea calcular la derivada: ');
while(h<=0)
h=input('Ingrese h: ');
if(h<=0)
display('h debe ser mayor a cero')
end
end
vreal=subs(diff(y),x,xo);
vaproximado1=(subs(y,x,xo+h)-subs(y,x,xo-h))/(2*h);
vaproximado2=(-subs(y,x,xo+2*h)+8*subs(y,x,xo+h)-8*subs(y,x,xo-
h)+subs(y,x,xo-2*h))/(12*h);
error1=abs((vreal-vaproximado1)/vreal)*100;
error2=abs((vreal-vaproximado2)/vreal)*100;
fprintf('Valor real: %.8f\n',vreal)
fprintf('Valor aproximado de orden O(h^2): %.8f\n',vaproximado1)
fprintf('Valor aproximado de orden O(h^4): %.8f\n',vaproximado2)
fprintf('Error1: %.8f\n',error1)
fprintf('Error2: %.8f\n',error2)

command window
Ingrese la funcion que desea derivar: atan(x)
Ingrese el punto en el cual desea calcular la derivada: 2^0.5
Ingrese h: 0.1
Valor real: 0.33333333
Valor aproximado de orden O(h^2): 0.33395070
Valor aproximado de orden O(h^4): 0.33333306
Error1: 0.18520903
Error2: 0.00008178

Вам также может понравиться