ode45 + lsqcurvefit-多个ODE

时间:2018-06-18 19:13:28

标签: matlab ode non-linear-regression

我正在尝试将我的实验数据拟合到包含2个耦合的ODE的模型中。我已经创建了一个单独的函数来定义2个ODE,其中a是包含我试图拟合的2个常量的数组。

function dy = CalcCoupODEs(t,y,a) 
%dy= matrix with all 2 ODEs
dy = zeros(2,1); % variable definition
dy(1) = 1.41.*a(1) .* ((y(2)*y(1)^2)^2)*y(1) - a(2) .* y(1)*t ; %ODE for R
dy(2) = -a(1)*(y(2)*y(1)^2)^2; %ODE for n
end

然后,我按以下方式调用该函数:

cycle_DMACl = [20, 25, 30, 40, 45]; % this is t variable
R_DMACl = [18.34, 11.29, 7.09, 6.51, 4.396]; %this is y(1)
n_DMACl = [92.31, 61.9, 53.82, 26.04, 11.87]; % this is y(2)
a0 = [1, 1]; %initial guess for constants
lb1 = [0, 0]; %lower bound
a = lsqcurvefit(@CalcCoupODEs, a0, cycle_DMACl(:), R_DMACl(:), n_DMACl(:), lb1);

我得到以下内容:

  

警告:下限长度> length(x);无视额外界限。

显然没有尝试适合正确的事情(alb都是1x2)。我做错了什么,最好的方法是什么?

谢谢!

2 个答案:

答案 0 :(得分:1)

感谢您的回复。将y_data放在矩阵中确实可以解决问题。我注意到,如果关闭了初始值,则lsqcurvefit会给出一个错误,即YDATA和函数值的大小不同(这听起来像是与初始值无关的错误)。在对初始值进行了很多的尝试后,我逐渐收敛了。

再次感谢!

答案 1 :(得分:0)

我对lsqcurvefit(...)没什么经验,但是快速浏览一下MathWork的函数文档会让我觉得你的参数与MATLAB的语法期望不符。 您的用法类似于

 lsqcurvefit(fun,initial_points,time,y1_data,y2_data,lower_bounds)

这是带有两个y数据条目的六个参数。该函数的文档显示了六个参数语法,其中包含

 lsqcurvefit(fun,initial_points,time,y_data,lower_bounds,upper_bounds)

我尝试通过制作一个新矩阵来快速修复

 y_data = [y1_data', y2_data']

并插入一些高值随机上界。我收到了一个错误。

我认为你将不得不重新定义你的ydata数组并定义上限值。我将继续玩它并发布任何进展,但可能需要一些时间。祝你好运,请发布一个解决方案。