1
我想适合一个曲线使用ODE系统的一些数据。根据预定义的时间点,ODE系统改变为不同的ODE系统。ODE lsqcurvefit与改变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大小不合适”的错误。有没有一种方法可以提取最适合的阿尔法,因为它出现在根据时间切换的两个不同的ODES系统中。
函数'data'不使用输入'time'。为了确定总的积分时间,向量'time'的想法传递给'lsqcurvefit'然后传递给'data'?此外,如果清理代码以删除所有多余的换行符,这将会很有帮助。 – horchler
正如书面它不是。我认为,如果我让lsqcurvefit只适合每个tvec(i-1)到tvec(i)的点,那么我会得到最适合每个时间段的alpha。相反,我想在整个时间范围内找到最适合的alpha值。我不认为这个评论正确地解决你的问题,但? – Tim
为了做任何有用的事情,我认为你需要让你的'data'函数至少符合'lsqcurvefit'的要求。那是什么问题?然后'init'和'time'对应'X0'和'XDATA'。 'data'的输出将需要和'XDATA' /'time'的长度相同。 – horchler