Fmincon Error: not enough input arguments
1 vue (au cours des 30 derniers jours)
Afficher commentaires plus anciens
Maximilian Ernst
le 23 Juin 2016
Commenté : Maximilian Ernst
le 23 Juin 2016
Hi,
I have to optimize parameters of a system of two ordinary differential equations. Therefore I wrote the following code. If I run the main file, I get the error: "not enough input arguments. Caused by: Failure in initial objective function evaluation. FMINCON cannot continue. " This error occurs in the obj1 function file, in the line, where the ode solver is used. If I uncomment the testparameters in the obj1 function, the error does not occur. Does anyone have an idea how to avoid this error?
p.s.: is this basically the right way to optimize the parameters of a system of ODEs or should it be done in a completely different way?
Main file:
LB = zeros(1,8);
x0 = LB;
UB = [Inf,Inf,Inf,Inf,Inf,Inf,Inf,Inf];
[x,fval] = fmincon(@obj1,x0,[],[],[],[],LB,UB);
Definition of function which I want to optimize
function [flux] = obj1(K_a_F,K_a_T,K_b_F,K_b_T,r_a_F,r_a_T,r_b_F,r_b_T)
k1 = 10^-2; k_1 = 8* 10^-3; k2 = 10^-2; k_2 = 4*10^-3;
%testparameters
%K_a_F = 9.4*10^5; K_a_T = 3.9*10; K_b_F = 1.3*10^4; K_b_T = 1.2*10^-10;
%r_a_F = 4.3*10^7; r_a_T = 4.2*10^9; r_b_F = 6.9*10^-7; r_b_T = 6.2*10^-9;
a = 10^5;
T0 = 27; T1 = 33;
tscale = 1:3000;
T = importdata('KursAT');
F = importdata('kursAF');
chiT = @(T) (-1/pi * (atan(a*(T-T1)) + atan(a*(T-T0))));
Ft = @(x)interp1(tscale,F,x,'spline');
Tt = @(x)interp1(tscale,T,x,'spline');
[t,sol] = ode45(@(t,dyn) dynamics(t,dyn,Ft,Tt,K_a_F,K_a_T,K_b_F,K_b_T,r_a_F,r_a_T,r_b_F,r_b_T), [1,3000] , [60 30]);
A = @(x)interp1(t,sol(:,1),x,'spline');
B = @(x)interp1(t,sol(:,2),x,'spline');
f = @(x,T,F,A,B) (chiT(T(x)).*(k2 *B(x)-k_2*T(x)) + chi_F(F(x),chiT,T(x)).*(k_1*A(x)-k1*F(x)));
tau = 3000;
flux = integral(@(x)f(x,Tt,Ft,A,B),0,tau);
Definition of ordinary differential equations
function [ddyn] = dynamics(t,dyn,F,T,K_a_F,K_a_T,K_b_F,K_b_T,r_a_F,r_a_T,r_b_F,r_b_T)
%kinetic parameters, unit: 1/s
k1 = 10^-2; k_1 = 8* 10^-3; k2 = 10^-2; k_2 = 4*10^-3;
%Vmax for enzymes alpha and beta, unit: mM/s
V_max_a = 1.6; V_max_b = 3.5;
%Michaelis-Menten constants for enzymes alpha and beta, unit: mM
K_M_a = 1.5*10^-3; K_M_b = 2*10^-3;
ddyn = zeros(2,1);
R_a_F = (K_a_F + r_a_F* F(t))./(K_a_F + r_a_F);
R_a_T = (K_a_T + r_a_T* T(t))./(K_a_T + r_a_T);
R_b_F = (K_b_F + r_b_F* F(t))./(K_b_F + r_b_F);
R_b_T = (K_b_T + r_b_T* T(t))./(K_b_T + r_b_T);
v_a = (V_max_a*dyn(1))./(K_M_a + dyn(1))*R_a_F *R_a_T;
v_b = (V_max_b*dyn(2))./(K_M_b + dyn(2))*R_b_F *R_b_T;
ddyn(1) = k1*F(t) + v_b - k_1*dyn(1) - v_a;
ddyn(2) = k2*T(t) + v_a - k_2*dyn(2) - v_b;
0 commentaires
Réponse acceptée
Matt J
le 23 Juin 2016
Modifié(e) : Matt J
le 23 Juin 2016
The objective obj1 that you've shown is a function of 8 separate scalar arguments. However, fmincon expects it to be a function of a single 1x8 vector argument. Re-write your input syntax for obj1 to give fmincon what it expects.
4 commentaires
Plus de réponses (0)
Voir également
Catégories
En savoir plus sur Solver Outputs and Iterative Display dans Help Center et File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!