2013-12-11 42 views
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系统中。

+0

函数'data'不使用输入'time'。为了确定总的积分时间,向量'time'的想法传递给'lsqcurvefit'然后传递给'data'?此外,如果清理代码以删除所有多余的换行符,这将会很有帮助。 – horchler

+0

正如书面它不是。我认为,如果我让lsqcurvefit只适合每个tvec(i-1)到tvec(i)的点,那么我会得到最适合每个时间段的alpha。相反,我想在整个时间范围内找到最适合的alpha值。我不认为这个评论正确地解决你的问题,但? – Tim

+0

为了做任何有用的事情,我认为你需要让你的'data'函数至少符合'lsqcurvefit'的要求。那是什么问题?然后'init'和'time'对应'X0'和'XDATA'。 'data'的输出将需要和'XDATA' /'time'的长度相同。 – horchler

回答

0

也许还没回答,但有一些建议。

首先,现代,速度更快的方式传递参数给积分功能与匿名函数:

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

其次,你两次追加一些值。移动tvecufor循环的,因为他们是恒定的,初始化toutyout初始时间和状态

tout = tvec(1); 
yout = y0; 

然后,在循环追加新的数据是这样的:

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

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