Matlab使用fzero向后欧拉

时间:2015-02-17 19:17:34

标签: matlab

我正在尝试整合dy3dt = @(t,y)-41 *(y - t)+ 1;使用后向欧拉,在[0,1]上,h = 0.05。初始条件,y(0)为1.

yvals3 = [1]; %inital condition
dy3dt = @(t,y) -41*(y - t) + 1;
for t = 0:0.05:0.95; 

    index = round(t*20 + 1); %convert t into index of the last step
    oldy = yvals3(index);
    newy1 = oldy + h.*dy3dt(t, oldy);
    newy2 = oldy + h.*dy3dt(t+ 0.05, newy1); 
    yvals3 = [yvals3; newy2];
end
tvals3 = 0:0.05:1;

当我绘制tvals3和yvals3时,我得到一个不寻常的指数图,所以我的方法可能不正确。有关如何使用fzero实现此功能的任何见解?

1 个答案:

答案 0 :(得分:1)

通常的(向前)欧拉方法可以表示为从切线上的已知点开始,并得到新点:

newy = oldy + tstep*dydt(oldt, oldy); 

向后的欧拉方法向后做所有事情:它从切线上的新(未知)点开始,向后移动,然后击中旧点:

oldy = newy - tstep*dydt(newt, newy); 

最后一行不是可以执行的命令,因为newy未知。相反,它是一个待解决的方程式:

newy = fzero(@(y) y - tstep*dydt(newt,y) - oldy, oldy)

(第二个参数oldy是根的初始猜测,fzero需要。)

以下是这在您的设置中如何工作。我以一种可能不是最有效Matlab的方式编写代码,但(我希望)使计算逻辑清晰。

dydt = @(t,y) -41*(y - t) + 1;   % right hand side
tvals = [0];                     % initial t
yvals = [1];                     % initial y
tstep = 0.05;                    % time step 
numsteps = 20;                   % number of steps to go
for i=1:numsteps; 
    oldt = tvals(end);           % pick the last entry of array
    oldy = yvals(end);
    newt = oldt + tstep;         % step forward in t 
    newy = fzero(@(y) y - tstep*dydt(newt,y) - oldy, oldy);  % backward Euler 
    tvals = [tvals; newt];       
    yvals = [yvals; newy];
end
plot(tvals, yvals);