我写了这个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
答案 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