Matlab - Tercera derivada

   
Vista:

Tercera derivada

Publicado por Marco (3 intervenciones) el 01/09/2012 10:21:09
Si este algoritmo lo ejecuto como aquí figura:

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
function [L,n]=terceraderivada(f,x,h,tolerancia)
%f funcion
%x punto donde se va hallar la derivada
%tolerancia para el error
%Resultados L[H' D' E']
fprintf('===============================\n')
fprintf('\t  derivada 3 \n')
fprintf('===============================\n')
          itmax=5;
%h=1;
          H(1)=h;
         D(1)=(feval('f',x+2*h)-2*feval('f',x+h)+2*feval('f',x-h)-feval('f',x-2*h))/(2*h^3);
         E(1)=0;
         R(1)=0;
 
for n=1:2
        h=h/10;
        H(n+1)=h;
        D(n+1)=(feval('f',x+2*h)-2*feval('f',x+h)+2*feval('f',x-h)-feval('f',x-2*h))/(2*h^3);
        E(n+1)=abs(D(n+1)-D(n));
        R(n+1)=2*E(n+1)*(abs(D(n+1))+abs(D(n))+eps);
 
end
 
n=2;
while ((E(n)>E(n+1))&(R(n)>tolerancia))&n<itmax;
        h=h/10;
        H(n+2)=h;
       D(n+2)=(feval('f',x+2*h)-2*feval('f',x+h)+2*feval('f',x-h)-feval('f',x-2*h))/(2*h^3);
       E(n+2)=abs(D(n+2)-D(n+1));
       R(n+2)=2*E(n+2)*(abs(D(n+2))+abs(D(n+1))+eps);
       n=n+1;
 
end
 
       fprintf('\n El resultado es: \n');
       n=length(D)-1;
       L=[H' D' E' ];


Y en la ventana de comando lo declaro:

[L,n]=terceraderivada(f,0.8,1,0.001)

para f(x)=cos(x), obtengo lo siguiente:

>> [L,n]=terceraderivada('f',0.8,0.001)
===============================
derivada 3
===============================

El resultado es:

1
2
3
4
5
6
7
8
9
10
L =
 
    0.0010    0.7174         0
    0.0001    0.7174    0.0000
    0.0000    0.6661    0.0512
 
 
n =
 
     2


Pero si declaro mi algoritmo en la ventana de comando así, obviando el h:

[L,n]=terceraderivada(f,0.8,0.001)

Obtengo para el mismo f, f(x)=cos(x) lo siguiente:

>> [L,n]=terceraderivada('f',0.8,1,0.001)
===============================
derivada 3
===============================

El resultado es:

1
2
3
4
5
6
7
8
9
10
11
12
L =
 
    1.0000    0.5550         0
    0.1000    0.7156    0.1606
    0.0100    0.7173    0.0018
    0.0010    0.7174    0.0000
    0.0001    0.7174    0.0000
 
 
n =
 
     4


Obtengo distintos valores en las columnas para cada declaración de mi algoritmo y distintos valores de n. Me doy cuenta que declarando o no el h obtengo dichos valores distintos. Mi problema es que no detecto porque declarar o no el h ocasiona tales inconvenientes para saber cual es la respuesta correcta. espero me puedan ayudar . Gracias
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de JOSE JEREMIAS CABALLERO

Tercera derivada

Publicado por JOSE JEREMIAS CABALLERO jjcc94@hotmail.com (3440 intervenciones) el 01/09/2012 18:57:29
Hice unos arreglos a tu codigo.

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
42
43
function [L,sol_matlab]=terceraderivada(f,x,h,tolerancia)
format long
%f funcion
%x punto donde se va hallar la derivada
%tolerancia para el error
%Resultados L[H' D' E']
F=f;
fprintf('\t=============================================\n')
fprintf('\t\t tercera derivada de la funcion %s\n',f)
fprintf('\t=============================================\n')
f=inline(f,'x');
itmax=5;
%h=1;
H(1)=h;
D(1)=(f(x+2*h)-2*f(x+h)+2*f(x-h)-f(x-2*h))/(2*h^3);
E(1)=0;
R(1)=0;
N(1)=0;
for n=1:2
    h=h/10;
    H(n+1)=h;
    D(n+1)=(f(x+2*h)-2*f(x+h)+2*f(x-h)-f(x-2*h))/(2*h^3);
    E(n+1)=abs(D(n+1)-D(n));
    R(n+1)=2*E(n+1)*(abs(D(n+1))+abs(D(n))+eps);
    N(n+1)=n;
end
 
n=2;
while E(n)>E(n+1) && R(n)>tolerancia &&  n<itmax;
    h=h/10;
    H(n+2)=h;
    D(n+2)=(f(x+2*h)-2*f(x+h)+2*f(x-h)-f(x-2*h))/(2*h^3);
    E(n+2)=abs(D(n+2)-D(n+1));
    R(n+2)=2*E(n+2)*(abs(D(n+2))+abs(D(n+1))+eps);
    N(n+2)=n+1;
    n=n+1;
 
end
fprintf('           n                  H(n)               D(n)                 E(n)')
L=[N' H' D' E'];
d3=diff(sym(F),3);
D3=inline(d3);
sol_matlab=D3(x);



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
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
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
>> [L,aa,sol_matlab]=terceraderivada('cos(x)',0.8,1,0.1)
	=============================================
		 tercera derivada de la funcion cos(x)
	=============================================
           n                  H(n)               D(n)                 E(n)
L =
 
                   0   1.000000000000000   0.554978624961663                   0
   1.000000000000000   0.100000000000000   0.715564493054765   0.160585868093102
   2.000000000000000   0.010000000000000   0.717338157207870   0.001773664153104
   3.000000000000000   0.001000000000000   0.717355841395317   0.000017684187448
 
 
aa =
 
    'penultimo elemento mayor que que el ultimo'
    'por tanto  entra al while'
 
 
sol_matlab =
 
   0.717356090899523
 
>> [L,aa,sol_matlab]=terceraderivada('cos(x)',0.8,1,0.0001)
	=============================================
		 tercera derivada de la funcion cos(x)
	=============================================
           n                  H(n)               D(n)                 E(n)
L =
 
                   0   1.000000000000000   0.554978624961663                   0
   1.000000000000000   0.100000000000000   0.715564493054765   0.160585868093102
   2.000000000000000   0.010000000000000   0.717338157207870   0.001773664153104
   3.000000000000000   0.001000000000000   0.717355841395317   0.000017684187448
   4.000000000000000   0.000100000000000   0.717370607361545   0.000014765966227
 
 
aa =
 
    'penultimo elemento mayor que que el ultimo'
    'por tanto  entra al while'
 
 
sol_matlab =
 
   0.717356090899523
 
>> [L,aa,sol_matlab]=terceraderivada('cos(x)',0.8,1,0.00000001)
	=============================================
		 tercera derivada de la funcion cos(x)
	=============================================
           n                  H(n)               D(n)                 E(n)
L =
 
                   0   1.000000000000000   0.554978624961663                   0
   1.000000000000000   0.100000000000000   0.715564493054765   0.160585868093102
   2.000000000000000   0.010000000000000   0.717338157207870   0.001773664153104
   3.000000000000000   0.001000000000000   0.717355841395317   0.000017684187448
   4.000000000000000   0.000100000000000   0.717370607361545   0.000014765966227
   5.000000000000000   0.000010000000000   0.666133814775094   0.051236792586451
 
 
aa =
 
    'penultimo elemento mayor que que el ultimo'
    'por tanto  entra al while'
 
 
sol_matlab =
 
   0.717356090899523
 
>> [L,aa,sol_matlab]=terceraderivada('cos(x)',0.8,0.0001)
	=============================================
		 tercera derivada de la funcion cos(x)
	=============================================
           n                  H(n)               D(n)                 E(n)
L =
 
   1.0e+02 *
 
                   0   0.000001000000000   0.007173706073615                   0
   0.010000000000000   0.000000100000000   0.006661338147751   0.000512367925865
   0.020000000000000   0.000000010000000   1.110223024625156   1.103561686477405
 
 
aa =
 
    'penultimo elemento no es mayor que el ultimo elemento'
    'por lo tanto no entra while'
 
 
sol_matlab =
 
   0.717356090899523
 
>> [L,aa,sol_matlab]=terceraderivada('cos(x)',0.8,0.1)
	=============================================
		 tercera derivada de la funcion cos(x)
	=============================================
Error using terceraderivada (line 35)
Not enough input arguments.


Si no entra al bucle while no es necesario la tolerancia, pero si entra al bucle while, alli si es necesario la tolerancia.

Saludos.
JOSE JEREMIAS CABALLERO
Asesor de Proyectos con Matlab
programador en matlab
Servicios de programacion matlab
jjcc94@hotmail.com

http://matlabcaballero.blogspot.com
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Tercera derivada

Publicado por Marco (3 intervenciones) el 02/09/2012 09:15:41
Gracias por la ayuda y por los arreglos, yo tambien hice unos arreglos (habían unos detalles estéticos que mejorar nada más) y al final me quedó un señor código. Espero que para futuras dudas que tenga también pueda ayudarme :) Gracias por la ayuda.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar