【问题标题】:ODE lsqcurvefit with changing ode equations具有变化的 ode 方程的 ODE lsqcurvefit
【发布时间】:2013-12-11 20:24:46
【问题描述】:

我正在尝试使用 ODE 系统对某些数据进行曲线拟合。 ODE 系统根据预定义的时间点更改为不同的 ODE 系统。

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

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 系统中,这些系统会根据时间切换。

【问题讨论】:

  • 函数data不使用输入time。是否将向量 time 传递给 lsqcurvefit 然后传递给 data 以确定总积分时间?此外,如果您清理代码以删除所有多余的换行符,将会很有帮助。
  • 写的不是。我认为如果我让 lsqcurvefit 仅沿着每个 tvec(i-1) 到 tvec(i) 拟合点,那么我将获得每个时间段的最佳拟合 alpha。相反,我想在整个时间范围内获得最合适的 alpha。不过,我认为此评论不能正确解决您的问题?
  • 做任何有用的事情我认为你需要让你的data函数至少符合lsqcurvefit的要求。这就是问题所在吗?那么inittime对应X0XDATAdata 的输出需要与 XDATA/time 的长度相同。

标签: matlab curve-fitting ode


【解决方案1】:

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

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

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

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

tout = tvec(1);
yout = y0;

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

tout = [tout;t(2:end)];
yout = [yout;y(2:end,:)];

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-07-12
    • 2019-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-11
    • 2015-10-17
    • 1970-01-01
    相关资源
    最近更新 更多