前向欧拉方法在Matlab中求解一阶ODE

时间:2014-02-10 18:08:08

标签: matlab

我写了这个Matlab程序,它应该用u(0)= 1来解决IVP du / dx = -5000(u(t) - cos(t)) - sin(t)。我的确切解决方案应该是u(t)= cos(t)但是我在代码中从欧拉的前进中获得的解决方案与它应该是什么以及我计算的内容相比是巨大的但我不确定我走到哪里我的代码错了。你能找到我的错误吗?

function main

dt=5;
u0 = 1;
n=50;

[T,U] = euler(dt, u0, n);

uexact = cos(T);

plot(T,U)

hold on 

plot(T, uexact, 'r')

end

function [T,U]= euler( dt, u0, n)

R= dt/n;
T=zeros(1,n+1);
U=zeros(1,n+1);
U(1)=u0;
T(1) = 0;


for j=1:n   

 U(j+1)= U(j)+ R*(rhs(T(j),U(j)));
 T(j+1)= T(j) + R;
end

end


function dP = rhs(t, P)
P = zeros(1,1);

dP = (-5000)*(P - cos(t)) - sin(t);

end

1 个答案:

答案 0 :(得分:1)

您不必将P =零(1,1)设置为使用公式近似导数的函数。

此外,你遇到的问题是[前向欧拉方法的数值不稳定] [1]。你需要一个很小的时间步长才能使它收敛(因为函数dP中的P系数很大)。

function main

dt=5;
u0 = 1;
n=50000; % increase the number or subintervals (smaller time step) to get stability

[T,U] = euler(dt, u0, n);

uexact = cos(T);

plot(T,U,'bs')

hold on 

plot(T, uexact, 'r')

end

function [T,U]= euler( dt, u0, n)

R= dt/n;
T=zeros(1,n+1);
U=zeros(1,n+1);
U(1)=u0;
T(1) = 0;

for j=1:n
 % Implicit method converges
 % U(j+1) = ( U(j) - R*(-5000)*cos(T(j)) - R*sin(T(j)))/(1 - R*(-5000));
 U(j+1)= U(j)+ R*(rhs(T(j),U(j)));
 T(j+1)= T(j) + R;
end

end


function dP = rhs(t, P)
%P = zeros(1,1); %% It must not be here

dP = (-5000)*(P - cos(t)) - sin(t);

end


  [1]: http://en.wikipedia.org/wiki/Euler_method