Matlab - Optimización de funciones

 
Vista:

Optimización de funciones

Publicado por Pepe (1 intervención) el 26/12/2016 14:33:44
Hola, necesito buscar el mínimo de una función que depende de 5 variables, que además deben cumplir dos condiciones.

He intentado hacerlo con fminsearch pero este sólo me encuentra el valor minimo de esa función y no sé como añadirle la restricción de que ese valor mínimo debe hacer que se cumplan las otras dos condiciones. Dejo el código:


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
function prueba1
%Constantes
glu=96;
gln=3.8;
J4=49.71;
J5=15.53;
J6=5.68;
J7=1.85;
NADPH=0.13;
NADP=0.0021;
ATP=1.5;
ADP=0.6;
Pi=10;
Keq=1290;
Kakg=0.32;
Knh4=1.1;
Knadph=0.04;
Kglu=10;
Knadp=0.042;
Leq=460;
Latp=0.35;
Lnh4=0.1;
Lglu=4.1;
Ladp=0.0585;
Lp=3.7;
Lgln=5.65;
Mgln=0.175;
Makg=0.007;
Mnadph=0.0015;
Mglu=11;
Mnadp=0.0037;
 
%Concentraciones de los valores de referencia
GDHref=413;
GSref=649;
GOGATref=63.79;
Glnref=3.8;
aKGref=0.375;
tamanio=1000;
 
%Vectores para guardar los valores de la iteración
Zmin=ones(1,tamanio).*10;
 
NH4in=linspace(0.01,10,tamanio);
 
syms aKG GOGAT Gln GDH GS;
x0=[aKGref GOGATref Glnref GDHref GSref].*0.1;
 
%Cálculos
for i=1:length(NH4in)
    cond=true;
 
    while(cond)
        x=[aKG GOGAT Gln GDH GS];
 
        fun=@(x) ((x(4)-GDHref)/x(4))^2+((x(5)-GSref)/x(5))^2+((x(2)-GOGATref)/x(2))^2+((x(3)-Glnref)/x(3))^2+((x(1)-aKGref)/x(1))^2;
        [xsol,fsol]=fminsearch(fun,x0)
 
        aKG=xsol(1);
        GOGAT=xsol(2);
        Gln=xsol(3);
        GDH=xsol(4);
        GS=xsol(5);
 
        J1=GDH.*(aKG*NH4in(i)*NADPH-(glu*NADP)/Keq)./(Kakg*Knh4*Knadph*(1+NH4in(i)/Knh4)*(1+aKG/Kakg+glu/Kglu)*(1+NADPH/Knadph+NADP/Knadp));
         p1=(ATP.*NH4in(i).*glu-ADP.*gln.*Pi./Leq)./(Latp.*Lnh4.*Lglu.*(1+ATP./Latp+ADP./Ladp+Pi./Lp+ADP.*Pi/(Ladp.*Lp)));
         p2=1./(1+NH4in(i)./Lnh4+gln./Lgln+glu./Lglu+gln.*NH4in(i)./(Lgln*Lnh4)+glu.*NH4in(i)./(Lglu.*Lnh4));
        J2=p1.*p2.*GS;
        J3=GOGAT.*(gln*aKG*NADPH/(Mgln*Makg*Mnadph*(1+gln/Mgln+glu/Mglu)*(1+aKG/Makg+glu/Mglu)*(1+NADPH/Mnadph+NADP/Mnadp)));
 
         a=J1+2*J3+J5-J2-J4-J6;  %Condición 1 debe ser igual a 0
         b=J2-J3-J5-J7;    %Condición 2 debe ser igual a 0
 
        if  (a==0) && (b==0)
        Zmin(i)=fsol;
        cond=false;
        end
 
    end
 
end
 
plot(NH4in,Zmin)
hold on, grid on;
xlabel('NH4 (mM)'),ylabel('Z')
hold off;
 
end


Un saludo y gracias

PD: Ya sé que el programa actual no funciona y solo te busca el valor mínimo de esa función, por eso necesito ayuda para obligarle a que cumpla las condiciones.
PD2: Estoy iterando en NH4 porque es de quien quiero sacar la gráfica.
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 Royeth
Val: 3.309
Plata
Ha mantenido su posición en Matlab (en relación al último mes)
Gráfica de Matlab

Optimización de funciones

Publicado por Royeth (1818 intervenciones) el 26/12/2016 15:13:18
bueno resulta que en el planteamiento debes colocar las condiciones también en función de las variables para que puedan ser evaluadas , entonces a y b deben estar en función de x, si estás trabajando con funciones anónimas no declares simbólico (syms) ,

para solucionar tu problema puedes agregar por multiplicadores de lagrange las restrinciones a la función objetivo o puedes usar algoritmos genéticos para minimizar las funciones respetando las restrinciones , de tal forma que el no cumplimiento de tus restrinciones sea bien penalizado , si tus restrinciones son lineales o puedes despejar una x en función de las otras entonces el problema te resultará mucho más fácil , ya que tendrás una restrinción sin objetivos

espero te sea de ayuda
https://www.facebook.com/royethmatlab/
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

Optimización de funciones

Publicado por JOSE JEREMIAS CABALLERO (5917 intervenciones) el 27/12/2016 02:16:38
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
function prueba1
%Constantes
glu=96;
gln=3.8;
J4=49.71;
J5=15.53;
J6=5.68;
J7=1.85;
NADPH=0.13;
NADP=0.0021;
ATP=1.5;
ADP=0.6;
Pi=10;
Keq=1290;
Kakg=0.32;
Knh4=1.1;
Knadph=0.04;
Kglu=10;
Knadp=0.042;
Leq=460;
Latp=0.35;
Lnh4=0.1;
Lglu=4.1;
Ladp=0.0585;
Lp=3.7;
Lgln=5.65;
Mgln=0.175;
Makg=0.007;
Mnadph=0.0015;
Mglu=11;
Mnadp=0.0037;
 
%Concentraciones de los valores de referencia
GDHref=413;
GSref=649;
GOGATref=63.79;
Glnref=3.8;
aKGref=0.375;
tamanio=1000;
 
%Vectores para guardar los valores de la iteración
Zmin=ones(1,tamanio).*10;
 
NH4in=linspace(0.01,10,tamanio);
 
 
syms aKG GOGAT Gln GDH GS;
x0=[aKGref GOGATref Glnref GDHref GSref].*0.1;
 
%Cálculos
disp('      i          a         b       fsol')
for i=1:length(NH4in)
    cond=true;
 I(i)=i;
    %while(cond)
        x=[aKG GOGAT Gln GDH GS];
 
        fun=@(x) ((x(4)-GDHref)/x(4))^2+((x(5)-GSref)/x(5))^2+((x(2)-GOGATref)/x(2))^2+((x(3)-Glnref)/x(3))^2+((x(1)-aKGref)/x(1))^2;
        [xsol,fsol]=fminsearch(fun,x0);
        Fsol(i,1)=fsol;
        aKG=xsol(1);
        GOGAT=xsol(2);
        Gln=xsol(3);
        GDH=xsol(4);
        GS=xsol(5);
 
        J1=GDH*(aKG*NH4in(i)*NADPH-(glu*NADP)/Keq)/(Kakg*Knh4*Knadph*(1+NH4in(i)/Knh4)*(1+aKG/Kakg+glu/Kglu)*(1+NADPH/Knadph+NADP/Knadp));
         p1=(ATP*NH4in(i)*glu-ADP*gln*Pi/Leq)/(Latp*Lnh4*Lglu*(1+ATP/Latp+ADP/Ladp+Pi/Lp+ADP*Pi/(Ladp*Lp)));
         p2=1/(1+NH4in(i)/Lnh4+gln/Lgln+glu/Lglu+gln*NH4in(i)/(Lgln*Lnh4)+glu*NH4in(i)/(Lglu*Lnh4));
        J2=p1*p2*GS;
        J3=GOGAT*(gln*aKG*NADPH/(Mgln*Makg*Mnadph*(1+gln/Mgln+glu/Mglu)*(1+aKG/Makg+glu/Mglu)*(1+NADPH/Mnadph+NADP/Mnadp)));
 
         a=J1+2*J3+J5-J2-J4-J6 ; %Condición 1 debe ser igual a 0
         b=J2-J3-J5-J7    ;%Condición 2 debe ser igual a 0
          a=abs(a); b=abs(b);
          fprintf('i: %3i  a:%8.5f   b: %8.5f    fs:%8.5f\n',i,a,b,fsol)
         if  (a<0.1 &&  b<0.1)
             %fprintf('i: %3i  a:%8.5f   b: %8.5f    fs:%8.5f\n',i,a,b,fsol)
         return;
         end
end
 
plot(NH4in,Zmin)
xlabel('NH4 (mM)'),ylabel('Z')
 grid on;


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
>> prueba1
      i          a         b       fsol
i:   1  a:28.61751   b: 49.04485    fs: 0.00000
i:   2  a:24.59992   b: 44.75150    fs: 0.00000
i:   3  a:21.23796   b: 41.11868    fs: 0.00000
i:   4  a:18.39022   b: 38.00482    fs: 0.00000
i:   5  a:15.95304   b: 35.30615    fs: 0.00000
i:   6  a:13.84868   b: 32.94481    fs: 0.00000
i:   7  a:12.01774   b: 30.86128    fs: 0.00000
i:   8  a:10.41402   b: 29.00925    fs: 0.00000
i:   9  a: 9.00107   b: 27.35217    fs: 0.00000
i:  10  a: 7.74976   b: 25.86080    fs: 0.00000
i:  11  a: 6.63652   b: 24.51146    fs: 0.00000
i:  12  a: 5.64208   b: 23.28479    fs: 0.00000
i:  13  a: 4.75053   b: 22.16479    fs: 0.00000
i:  14  a: 3.94863   b: 21.13812    fs: 0.00000
i:  15  a: 3.22526   b: 20.19358    fs: 0.00000
 
.
.
.
 
i: 198  a: 0.42423   b:  0.24936    fs: 0.00000
i: 199  a: 0.40124   b:  0.23632    fs: 0.00000
i: 200  a: 0.37837   b:  0.22341    fs: 0.00000
i: 201  a: 0.35560   b:  0.21062    fs: 0.00000
i: 202  a: 0.33294   b:  0.19795    fs: 0.00000
i: 203  a: 0.31038   b:  0.18540    fs: 0.00000
i: 204  a: 0.28794   b:  0.17297    fs: 0.00000
i: 205  a: 0.26560   b:  0.16065    fs: 0.00000
i: 206  a: 0.24336   b:  0.14844    fs: 0.00000
i: 207  a: 0.22123   b:  0.13635    fs: 0.00000
i: 208  a: 0.19920   b:  0.12437    fs: 0.00000
i: 209  a: 0.17728   b:  0.11250    fs: 0.00000
i: 210  a: 0.15546   b:  0.10074    fs: 0.00000
i: 211  a: 0.13374   b:  0.08908    fs: 0.00000
i: 212  a: 0.11212   b:  0.07753    fs: 0.00000
i: 213  a: 0.09061   b:  0.06609    fs: 0.00000


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