Я видел этот метод Эйлера, который вычисляет ошибки:
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
Я попытался преобразовать метод в метод Хойна — вот моя попытка:
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
Но теперь ошибка действительно увеличилась. Может кто-нибудь сказать мне, что я сделал неправильно и как я могу это исправить?
h
. Метод Эйлера должен сходиться линейно, но метод Хойна должен улучшаться быстрее (квадратично). - person David   schedule 10.12.2015