首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >具有变化的ODE方程的ode lsqcurvefit

具有变化的ODE方程的ode lsqcurvefit
EN

Stack Overflow用户
提问于 2013-12-12 04:24:47
回答 1查看 831关注 0票数 1

我正在尝试使用常微分方程系统来拟合一些数据的曲线。ODE系统根据预定义的时间点改变为不同的ODE系统。

我在下面构造了一个简单的例子来说明。

代码语言:javascript
复制
function examplefitting

init = [1];
expdata = [10;40;70;76;80;90;101;110;150;180;200;202;215;240;245]';
time = [5;10;15;20;25;30;35;40;50;55;60;65;70;75;80]';

[x,resnorm] = lsqcurvefit(@data,init,time,expdata);

function z = data(init,time)

alpha = init(1);
y0 = 100;
   tout = [];
   yout = [];
   for i = 2:5
       tvec = [0 15 30 50 65];
       u = [1 0 1 0 1];

       [t y] = ode23s(@Model,[tvec(i-1) tvec(i)],y0,[],alpha,u(i-1));
       nt = length(t);
       tout = [tout;t];
       yout = [yout;y];

       y0 = [y(nt,1)];

   end

z = yout;

function Y = Model(t,y,alpha,u)
if u == 0

Y(1) = y(1).^alpha;

elseif u == 1

Y(1) = alpha*y(1);

end

Y = Y.';

您可以看到,因为我必须停止积分器并重置它,所以输出的长度和原始数据输入的长度是不同的。这会导致“函数值和YDATA大小不相称”的错误。有没有一种方法可以提取最佳拟合的alpha,假设它出现在两个不同的ODES系统中,根据时间进行切换。

EN

回答 1

Stack Overflow用户

发布于 2013-12-12 04:53:01

可能还没有回答,但有一些建议。

首先,将参数传递给集成函数的现代(更快)方法是使用匿名函数:

代码语言:javascript
复制
[t,y] = ode23s(@(t,y)Model(t,y,alpha,u(i-1)),[tvec(i-1) tvec(i)],y0);

其次,您两次追加了一些值。将tvecu移出for循环,因为它们是常量,并将toutyout初始化为初始时间和状态

代码语言:javascript
复制
tout = tvec(1);
yout = y0;

然后,在您的循环中添加如下所示的新数据:

代码语言:javascript
复制
tout = [tout;t(2:end)];
yout = [yout;y(2:end,:)];

最后,我想知道您是否可以通过指定固定步长的输出来解决您的问题。您可以通过将tspan设置为包含两个以上元素的向量来完成此操作。然后,积分器将只在这些特定时间返回点。

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

https://stackoverflow.com/questions/20529216

复制
相关文章

相似问题

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