Matlab - Máximo de una función en un intervalo

 
Vista:
sin imagen de perfil

Máximo de una función en un intervalo

Publicado por jaisa (5 intervenciones) el 08/12/2016 14:08:59
Hola,

quiero hallar el máximo de una función en un intervalo, concretamente el máximo de |g'(x)| para x en [a,b] para lo que utilizo la instrucción: lambda=fminbnd('-abs(dg)',a,b) . Esta instrucción está dentro del programa function it=pfijo(g,x0,a,b,dg,Tol,nmax) pero me salta un error que dice "Input argument 'dg' might be unused". ¿Qué puedo hacer para arreglar esto?


Saludos.
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
sin imagen de perfil

Máximo de una función en un intervalo

Publicado por jaisa (5 intervenciones) el 08/12/2016 18:01:21
La cuestión es que a, b y dg se los pasas al programa, en el mismo valor

dg=inline(dg);
lambda=fminbnd(@(x) dg(x),a,b)

y

lambda=fminbnd(-abs(dg),a,b)

¿lo has colocado en distintos scripts, no?
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
sin imagen de perfil

Máximo de una función en un intervalo

Publicado por jaisa (5 intervenciones) el 08/12/2016 18:22:21
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
function principal(Tol,nmax)
    format long
    syms x
    [f,g]=problema(nprob);
    met=input('Introducir el método a ejecutar: ');
    if (met==1)||(met==2)||(met==3)
    if met==1
        disp('Usted ha elegido el MÉTODO DE NEWTON-RAPHSON: ')
        x0=input('Introduzca la iteración inicial: ');
        df=diff(f);
        nr(f,df,x0,Tol,nmax)
    elseif met==2
        disp('Usted ha elegido el MÉTODO DE LA SECANTE: ')
        x0=input('Introduzca la primera iteración: ');
        x1=input('Introduzca la segunda iteración: ');
        secant(f,x0,x1,Tol,nmax)
    elseif met==3
        disp('Usted ha elegido el MÉTODO DEL PUNTO FIJO: ')
        a=input('Introduzca el extremo inferior del intervalo: ');
        b=input('Introduzca el extremo superior del intervalo: ');
        x0=input('Introduzca la iteracion inicial: ');
        if a>=b
            disp('ERROR. Ha escogido un intervalo que NO es válido.')
        elseif x0>b || x0<a
            disp('ERROR. La iteración inicial elegida no se encuentra dentro del intervalo escogido.')
        else
            dg= diff(g);
            pfijo(g,x0,a,b,dg,Tol,nmax)
        end
    end
    else
        disp('ERROR. MÉTODO MAL ELEGIDO. Sólo están implementados tres métodos. Vuelva a intentarlo.')
    end
    end
 
 
function [f,g] = problema(nprob)
 
if (nprob==1)||(nprob==2)||(nprob==3)
    if nprob==1
        disp('Ha elegido el PROBLEMA 1')
        f=log(x)-(x-2)^2;
        g=log(x)-(x-2)^2+x;
    elseif nprob==2
        disp('Ha elegido el PROBLEMA 2')
        f=230*x^4+18*x^3+9*x^2-221*x-9;
        g=230*x^4+18*x^3+9*x^2-221*x-9+x;
    elseif nprob==3
        disp('Ha elegido el PROBLEMA 3')
        f=exp(-x)-sin(x);
        g=exp(-x)-sin(x)+x;
    end
else
disp('ERROR, ha escogido un valor inadecuado. Vuelva a intentarlo.')
end
end
 
 
function it=pfijo(g,x0,a,b,dg,Tol,nmax)
it(1)=x0;
it(2)=g(it(1));
i=2;
lambda=fminbnd(-abs(dg),a,b); %el max de |g'(x)| para x en [a,b]
if (lambda<1)
while (lambda/(1-lambda))*(abs(it(i+1)-it(i)))>Tol || i<nmax
    it(i+1)=g(it(i));
    i=i+1;
 
end
fprintf('La aproximacion de la raiz con el metodo de punto fijo es=%f', it)
fprintf('El criterio para que el metodo haya finalizado ha sido: (\lambda/1-\lambda)*|x(n+1)-x(n)|<Tol')%ARREGLAR
fprintf('El numero de iteraciones necesarias para que el metodo finalice ha sido=%i ', i)
else
    disp('El metodo diverge')
end
end


Esos son mis códigos.

Saludos.
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

Máximo de una función en un intervalo

Publicado por JOSE JEREMIAS CABALLERO (5917 intervenciones) el 08/12/2016 18:50:35
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
function principal1(Tol,nmax,nprob)
if nargin<1
    Tol=0.001;
    nmax=10000;
   nprob=1;
end
format long
syms x
[f,g]=problema(nprob);
met=input('Introducir el método a ejecutar: ');
if (met==1)||(met==2)||(met==3)
    if met==1
    disp('Usted ha elegido el MÉTODO DE NEWTON-RAPHSON: ')
    x0=input('Introduzca la iteración inicial: ');
    df=diff(f);
    nr(f,df,x0,Tol,nmax)
    elseif met==2
    disp('Usted ha elegido el MÉTODO DE LA SECANTE: ')
    x0=input('Introduzca la primera iteración: ');
    x1=input('Introduzca la segunda iteración: ');
    secant(f,x0,x1,Tol,nmax)
    elseif met==3
    disp('Usted ha elegido el MÉTODO DEL PUNTO FIJO: ')
    a=input('Introduzca el extremo inferior del intervalo: ');
    b=input('Introduzca el extremo superior del intervalo: ');
    x0=input('Introduzca la iteracion inicial: ');
    if a>=b
    disp('ERROR. Ha escogido un intervalo que NO es válido.')
    elseif x0>b || x0<a
    disp('ERROR. La iteración inicial elegida no se encuentra dentro del intervalo escogido.')
    else
    dg= diff(g);
    pfijo(g,x0,a,b,dg,Tol,nmax)
    end
    end
    else
    disp('ERROR. MÉTODO MAL ELEGIDO. Sólo están implementados tres métodos. Vuelva a intentarlo.')
    end
end
 
 
function [f,g] = problema(nprob)
syms x
        if (nprob==1)||(nprob==2)||(nprob==3)
        if nprob==1
        disp('Ha elegido el PROBLEMA 1')
 
        f=log(x)-(x-2)^2;
        g=log(x)-(x-2)^2+x;
        elseif nprob==21
        disp('Ha elegido el PROBLEMA 2')
 
        f=230*x^4+18*x^3+9*x^2-221*x-9;
        g=230*x^4+18*x^3+9*x^2-221*x-9+x;
        elseif nprob==3
        disp('Ha elegido el PROBLEMA 3')
 
        f=exp(-x)-sin(x);
        g=exp(-x)-sin(x)+x;
        end
        else
        disp('ERROR, ha escogido un valor inadecuado. Vuelva a intentarlo.')
        end
end
 
 
function it=pfijo(g,x0,a,b,dg,Tol,nmax)
g=inline(g);
dg=inline(-dg);
        it(1)=x0;
        it(2)=g(it(1));
        i=1;
        lambda=fminbnd(dg,a,b)   %el max de |g'(x)| para x en [a,b]
        if (lambda<1)
        while (lambda/(1-lambda))*(abs(it(i+1)-it(i)))>Tol || i<nmax
        it(i+1)=g(it(i));
        i=i+1;
 
        end
        fprintf('La aproximacion de la raiz con el metodo de punto fijo es=%f', it)
        fprintf('El criterio para que el metodo haya finalizado ha sido: (\lambda/1-\lambda)*|x(n+1)-x(n)|<Tol')%ARREGLAR
        fprintf('El numero de iteraciones necesarias para que el metodo finalice ha sido=%i ', i)
        else
        disp('El metodo diverge')
        end
end
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
>> principal1(0.001,1000,3)
Ha elegido el PROBLEMA 3
Introducir el método a ejecutar: 3
Usted ha elegido el MÉTODO DEL PUNTO FIJO:
Introduzca el extremo inferior del intervalo: 1.8
Introduzca el extremo superior del intervalo: 2.5
Introduzca la iteracion inicial: 2
 
lambda =
 
   2.499958496267869
 
El metodo diverge
 
ans =
 
   2.000000000000000   1.226037856410931


Saludos.
JOSE JEREMIAS CABALLERO
Asesor de Proyectos con Matlab
programador en matlab
Servicios de programación matlab
[email protected]


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
sin imagen de perfil

Máximo de una función en un intervalo

Publicado por jaisa (5 intervenciones) el 08/12/2016 20:39:00
Cuando utilizo el comando inline me salta el error: "INLINE will be removed in a future release. Use anonymous functions instead." ¿Qué puedo hacer?
Otra duda que tengo es ¿por qué comienzas el contador del método pfijo en i=1 y no en i=2?
Mi última duda en lambda=fminbnd(dg,a,b), en vez de hacer dg seria su valor absoluto.

Saludos.
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

Máximo de una función en un intervalo

Publicado por JOSE JEREMIAS CABALLERO (5917 intervenciones) el 09/12/2016 02:48:04
1
2
3
4
5
6
7
8
9
10
function it=pfijo(g,x0,a,b,dg,Tol,nmax)
        it(1)=x0;
        it(2)=subs(g,it(1));
        i=1;
        f=str2func(strcat('@(x)', char(abs(dg))));
        lambda=fminbnd(f,a,b)   %el max de |g'(x)| para x en [a,b]
        if (lambda<1)
        while (lambda/(1-lambda))*(abs(it(i+1)-it(i)))>Tol || i<nmax
        it(i+2)=subs(g,it(i+1));
        i=i+1;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
>> principal1(0.001,1000,3)
Ha elegido el PROBLEMA 3
Introducir el método a ejecutar: 3
Usted ha elegido el MÉTODO DEL PUNTO FIJO:
Introduzca el extremo inferior del intervalo: 5
Introduzca el extremo superior del intervalo: 8
Introduzca la iteracion inicial: 6
 
lambda =
 
   6.220115128665023
 
El metodo diverge
 
ans =
 
   6.000000000000000   6.281894250375593



Saludos.
JOSE JEREMIAS CABALLERO
Asesor de Proyectos con Matlab
programador en matlab
Servicios de programación matlab
[email protected]


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