【发布时间】: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的要求。这就是问题所在吗?那么init和time对应X0和XDATA。data的输出需要与XDATA/time的长度相同。
标签: matlab curve-fitting ode