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:
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.
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
0