【问题标题】:ode45 + lsqcurvefit- multiple ODEsode45 + lsqcurvefit - 多个 ODE
【发布时间】:2018-06-18 19:13:28
【问题描述】:

我正在尝试将我的实验数据拟合到包含 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)。我做错了什么,最好的方法是什么?

谢谢!

【问题讨论】:

    标签: matlab ode non-linear-regression


    【解决方案1】:

    感谢您的回复。将 y_data 放入矩阵确实解决了这个问题。我注意到,如果初始值关闭,则 lsqcurvefit 会给出 YDATA 和函数值大小不同的错误(这听起来像是与初始值无关的错误)。在玩了很多初始值之后,我让它收敛了。

    再次感谢!

    【讨论】:

      【解决方案2】:

      我对 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 数组并定义上限值。我会继续玩它并发布任何进展,但这可能需要一些时间。祝你好运,请发布解决方案。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-08-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多