Estimating parameters of ODE using ode45 and fminsearch

조회 수: 21 (최근 30일)
Pankaj
Pankaj 2016년 1월 15일
댓글: Torsten 2017년 11월 15일
Hello all I am trying to estimate parameters of Ordinary Differential Equations (ODE). I am receiveing the following error:
Subscripted assignment dimension mismatch.
Error in fminsearch (line 190)
fv(:,1) = funfcn(x,varargin{:});
I tried but I couldn't recognize where I am making mistake. I am providing my code kindly suggest me where I am going wrong. -- Thanks
..
% == ODE ==
function dx=LV(t,x,theta)
dx=zeros(2,1);
alpha=theta(1);
beta=theta(2);
gamma=theta(3);
delta=theta(4);
dx(1) = x(1)*(alpha-beta*x(2));
dx(2) = -x(2)*(gamma-delta*x(1));
end
% == Error function ==
function err = ODE_fit(exp_t, exp_y, theta)
% exp_y = Experimental observation at time exp_t
[t,y] = ode45(@(t,X)LV(t,X,theta), exp_t, [5 3]);
err = sum((y-exp_y).^2); % compute error between experimental y and fitted y
end
% == Script ==
exp_t = [0, 0.20, 0.400, 0.60, 0.80, 1, 1.20, 1.40, 1.60, 1.80, 2];
exp_y = [4.35,4.26,2.96,3.13,2.25,2.65,3.22,2.85,4.97,4.99,5.94;...
2.60,3.23,2.50,1.89,2.25,1.21,1.05,1.55,1.66,1.44,1.76]';
theta0 = [2.5 0.75 4.25 1.5];
p_estimate = fminsearch(@(theta)ODE_fit(exp_t, exp_y, theta), theta0);

답변 (1개)

Walter Roberson
Walter Roberson 2016년 1월 15일
ode45 returns a y with as many columns as there are values in the initialization vector. Your initialization has two elements so two columns will be returned. You do subtraction of an array of equal, getting an N x 2 array. You square the elements, getting an N x 2 array. You then sum(); by default sum() works along the first dimension, so your output is going to be 1 x 2 . You return that back to the internals of fminsearch, but fminsearch is expecting a scalar.
I speculate that you want another sum() around the sum() so that you get a scalar output.
Note: if you have the System Identification toolbox then if I understand correctly you can use some of the functions there to achieve the purpose you are coding for here.
  댓글 수: 4
Pankaj
Pankaj 2017년 11월 14일
sorry Kelly, but it's been too long, I might have solved it some way. At present I may not be able to dig it out.
Torsten
Torsten 2017년 11월 15일
err = sum(sum((y-exp_y).^2));
should work.
Best wishes
Torsten.

댓글을 달려면 로그인하십시오.

카테고리

Help CenterFile Exchange에서 Ordinary Differential Equations에 대해 자세히 알아보기

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by