我看到了这个计算错误的欧拉方法:
function [t,le,ge] = euler_errors(h)
f=@(u) u*(2-u); % this is the function for the IVP
t0=0;
tn=1;
t=t0:h:tn;%we want to find the errors along this solutions
%here is the exact solution of the IVP
u_exact=(0.2*exp(2*t))./(2+0.1*(exp(2*t)+1)); %the with initial value u(0)=0.1
n=length(t);
u_e=zeros(1,n);
u_g=zeros(1,n);
i=1;
u_e(i)=0.1;
u_g(i)=0.1;
%u_e and u_g are both values given by Euler method
%u_e is for the local error
%u_g is for the global error
while (i<n)
u_e(i+1)=u_e(i)+h*f(u_e(i));
u_g(i+1)=u_g(i)+h*f(u_exact(i));
i=i+1;
end;
%le1 is the local error
%ge1 is the global error
le=abs(u_e-u_exact);
ge=abs(u_g-u_exact);
end
我试图将该方法转换为 Heun 的方法——这是我的尝试:
function [t,le,ge] = heun_errors(h)
f=@(u) u*(2-u); % this is the function for the IVP
t0=0;
tn=1;
t=t0:h:tn;%we want to find the errors along this solutions
%here is the exact solution of the IVP
u_exact=(0.2*exp(2*t))./(2+0.1*(exp(2*t)+1)); %the with initial value u(0)=0.1
n=length(t);
u_e=zeros(1,n);
u_g=zeros(1,n);
i=1;
u_e(i)=0.1;
u_g(i)=0.1;
%u_e and u_g are both values given by Euler method
%u_e is for the local error
%u_g is for the global error
while (i<n)
u_e1(i+1)=u_e(i)+h*f(u_e(i));
u_e(i+1)=u_e(i)+(h/2)*(f(u_e(i))+f(u_e1(i+1)));
u_g1(i+1)=u_g(i)+h*f(u_exact(i));
u_g(i+1)=u_g(i)+(h/2)*(f(u_exact(i))+f(u_g1(i+1)));
i=i+1;
end;
%le1 is the local error
%ge1 is the global error
le=abs(u_e-u_exact);
ge=abs(u_g-u_exact);
end
但现在误差实际上增加了。有人可以告诉我我做错了什么以及如何解决吗?