首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ode45 +lsqcurvefit多个ODE

ode45 +lsqcurvefit多个ODE
EN

Stack Overflow用户
提问于 2018-06-18 19:13:28
回答 2查看 394关注 0票数 2

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

代码语言:javascript
复制
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

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

代码语言:javascript
复制
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)。我做错了什么,最好的方法是什么?

谢谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-06-18 22:22:33

我对lsqcurvefit(.)几乎没有经验,但是快速查看MathWork的函数文档会让我认为您的参数不符合MATLAB的语法要求。你的用法就像

代码语言:javascript
复制
 lsqcurvefit(fun,initial_points,time,y1_data,y2_data,lower_bounds)

这是有两个y数据条目的六个参数。该函数的文档显示了一个6个参数语法,用于读取

代码语言:javascript
复制
 lsqcurvefit(fun,initial_points,time,y_data,lower_bounds,upper_bounds)

我试着做了一个新的矩阵,

代码语言:javascript
复制
 y_data = [y1_data', y2_data']

并插入一些高值和随机上界。我得到了一个错误作为回报。

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

票数 0
EN

Stack Overflow用户

发布于 2018-06-20 16:28:39

感谢您的回复。将y_data放在一个矩阵中确实解决了这个问题。我注意到,如果初始值为off,lsqcurvefit会给出一个错误,即YDATA值和函数值大小不一样(这听起来像是一个与初始值无关的错误)。在大量使用初始值遍历之后,我得到了它的收敛性。

再次感谢!

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50916079

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档