Matlab - Largas fracciones.

 
Vista:

Largas fracciones.

Publicado por Álex (5 intervenciones) el 18/09/2018 20:29:48
Buenas,

Estoy intentando hacer un programa con el método de Newton-Raphson y me ocurre que a partir de las 5 o 6 iteraciones la siguientes van lentísimas. Creo que se debe a que Matlab está calculando los números con fracciones larguísimas en vez de con un número decimal normal y corriente. ¿Hay alguna manera de decirle a Matlab que se relaje un poquito y que no sea tan preciso, que con que calcule con 10 decimales ma vale?

Un saludo.
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

Largas fracciones.

Publicado por Álex (5 intervenciones) el 18/09/2018 21:06:57
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 [] = Newton(f,x0,tol,imax)
%Método de Newton-Rhapson que te va informando de lo que hace en cada
%iteración.
 
switch nargin
    case 1
        x0=0;
        tol=10^-5;
        imax=50;
    case 2
        tol=10^-5;
        imax=50;
    case 3
        imax=50;
end
 
fd=diff(f);
i=1;
x2=x0-f(x0)./fd(x0);
    fprintf('i\tf(x)\t\tx\n\n')
 
    fprintf('%d\t%.6E\t%.10f\n\n',0,f(x0),x0)
 
    fprintf('%d\t%.6E\t%.10f\n\n',i,f(x2),x2)
while abs(x2-x0)>tol
    i=i+1;
    x0=x2;
    x2=x0-f(x0)./fd(x0);
    fprintf('%d\t%.6E\t%.10f\n\n',i,f(x2),x2)
 
    if i>=imax
        disp('Demasiadas iteraciones')
        break
    end
 
end
disp('Terminado')
 
end
 
%Me pasa con todas las funciones, incluso con un simple polinomio, cada iteración tarda mucho más que la anterior.
 
%Un saludo
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
Imágen de perfil de JOSE JEREMIAS CABALLERO
Val: 6.975
Oro
Ha mantenido su posición en Matlab (en relación al último mes)
Gráfica de Matlab

Largas fracciones.

Publicado por JOSE JEREMIAS CABALLERO (5917 intervenciones) el 18/09/2018 21:30:13
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
unction Newton1(f,x0,tol,imax)
%Método de Newton-Rhapson que te va informando de lo que hace en cada
%iteración
    fd=diff(f);
    i=1;
    x2=x0-f(x0)/fd(x0);
    fprintf('i\t\tf(x)\t\t\t\tx\n\n')
    fprintf('%d\t%.6E\t%15.10f\n',0,f(x0),x0)
    fprintf('%d\t%.6E\t%15.10f\n',i,f(x2),x2)
    while abs(x2-x0)>tol
        i=i+1;
        x0=x2;
        x2=x0-f(x0)/fd(x0);
        fprintf('%d\t%.6E\t%15.10f\n',i,f(x2),x2)
        if i>=imax
            disp('Demasiadas iteraciones')
            break
        end
    end
    disp('Terminado')
end


1
2
3
4
5
6
7
8
9
10
>> syms x; f(x)=exp(x)-2; x0=0; tol=10^-5; imax=40;  Newton1(f,x0,tol,imax)
i		f(x)				x
 
0	-1.000000E+00	   0.0000000000
1	7.182818E-01	   1.0000000000
2	8.706523E-02	   0.7357588823
3	1.791040E-03	   0.6940422999
4	8.009998E-07	   0.6931475811
5	1.604001E-13	   0.6931471806
Terminado


Saludos
JOSE JEREMIAS CABALLERO
Asesor de Proyectos con Matlab
Servicios de programación matlab


http://matlabcaballero.blogspot.com
https://www.facebook.com/matlabcaballero/
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

Largas fracciones.

Publicado por Álex (5 intervenciones) el 18/09/2018 21:37:41
Te pongo el último que he probado.

>> syms x
f(x)=(sin(x)-2*x+1)^2;
Newton(f)


%Un saludo
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
Imágen de perfil de JOSE JEREMIAS CABALLERO
Val: 6.975
Oro
Ha mantenido su posición en Matlab (en relación al último mes)
Gráfica de Matlab

Largas fracciones.

Publicado por JOSE JEREMIAS CABALLERO (5917 intervenciones) el 18/09/2018 22:21:39
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
function Newton2(f,x0,tol,imax)
%Método de Newton-Rhapson que te va informando de lo que hace en cada
%iteración
switch nargin
case 1
x0=0;
tol=10^-5;
imax=50;
case 2
tol=10^-5;
imax=50;
case 3
imax=50;
end
 
    fd=diff(f);
    i=1;
    x2=x0-double(f(x0))/double(fd(x0));
    fprintf('i\t\tf(x)\t\t\t\tx\n\n')
    fprintf('%d\t%10.6E\t%15.10f\n',0,double(f(x0)),x0)
    fprintf('%d\t%10.6E\t%15.10f\n',i,f(x2),x2)
    while abs(x2-x0)>tol
        i=i+1;
        x0=x2;
        x2=x0-double(f(x0))/double(fd(x0));
        fprintf('%d\t%10.6E\t%15.10f\n',i,double(f(x2)),x2)
        if i>=imax
            disp('Demasiadas iteraciones')
            break
        end
    end
    disp('Terminado')
end


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
>> syms x;f(x)=(sin(x)-2*x+1)^2;Newton2(f)
i		f(x)				x
 
0	1.000000E+00	   0.0000000000
1	2.298488E-01	   0.5000000000
2	5.171035E-02	   0.7135682868
3	1.229244E-02	   0.8049689234
4	3.000675E-03	   0.8473876662
5	7.415403E-04	   0.8678570613
6	1.843324E-04	   0.8779163490
7	4.595312E-05	   0.8829032967
8	1.147213E-05	   0.8853862382
9	2.866020E-06	   0.8866250934
10	7.162539E-07	   0.8872438693
11	1.790321E-07	   0.8875530946
12	4.475411E-08	   0.8877076666
13	1.118804E-08	   0.8877849425
14	2.796948E-09	   0.8878235779
15	6.992294E-10	   0.8878428949
16	1.748064E-10	   0.8878525533
Terminado


Saludos
JOSE JEREMIAS CABALLERO
Asesor de Proyectos con Matlab
Servicios de programación matlab


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

Largas fracciones.

Publicado por Álex (5 intervenciones) el 19/09/2018 14:22:09
Wow, muchas gracias. Era justo lo que estaba buscando. ¿Crees que hay algua manera más sencilla de hacer esto? He intentado definir una nueva función como g(x)=double(f(x)) y empezar a utilizar g en vez de f, pero Matlab no está por la labor.

Un saludo y muchísimas gracias!
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
Imágen de perfil de JOSE JEREMIAS CABALLERO
Val: 6.975
Oro
Ha mantenido su posición en Matlab (en relación al último mes)
Gráfica de Matlab

Largas fracciones.

Publicado por JOSE JEREMIAS CABALLERO (5917 intervenciones) el 19/09/2018 18:39:13
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
>> syms x
x0=1
f(x)=(sin(x)-2*x+1)^2
df=diff(f)
fx0=fd(x0)
fx=double(fx0)
 
x0 =
 
     1
 
 
f(x) =
 
(sin(x) - 2*x + 1)^2
 
 
df(x) =
 
2*(cos(x) - 2)*(sin(x) - 2*x + 1)
 
 
fx0 =
 
2*(cos(1) - 2)*(sin(1) - 1)
 
 
fx =
 
    0.4628
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar

Largas fracciones.

Publicado por Álex (5 intervenciones) el 19/09/2018 19:21:40
Muchas gracias!
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