MATLAB-将Euler方法转换为Heun';s法

MATLAB-将Euler方法转换为Heun';s法,matlab,numerical-methods,differential-equations,runge-kutta,Matlab,Numerical Methods,Differential Equations,Runge Kutta,我看到了计算误差的Euler方法: 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*(e

我看到了计算误差的Euler方法:

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
函数[t,le,ge]=欧拉误差(h)
f=@(u)u*(2-u);%这是IVP的功能
t0=0;
tn=1;
t=t0:h:tn;%我们希望找到解决方案中的错误
%这是IVP的精确解
精确=(0.2*exp(2*t))/(2+0.1*(exp(2*t)+1));%初始值为u(0)=0.1的
n=长度(t);
u_e=零(1,n);
u_g=零(1,n);
i=1;
u_e(i)=0.1;
u_g(i)=0.1;
%u_e和u_g都是由Euler方法给出的值
%u_e表示局部错误
%u_g表示全局错误
while(i)精确解的修正
首先,精确解有一个符号误差,这使得所有的误差计算无效

(e^(2t)/u)'=e^(2t)*(-u'/u^2 + 2/u) = e^(2t)

e^(2t)/u(t)-1/u0 = (e^(2t)-1)/2  

u(t) = 2*u0*exp(2*t) ./ ( 2 + u0*(exp(2*t)-1) )

局部和全局误差的计算 用于计算局部误差和全局误差的Euler代码的组织在概念上已经混淆了一些东西。完整的正态积分给出了全局结果,从而也给出了与精确解不同的全局误差。因此,所谓的
u_e
应该是
u_g

局部错误将在
(t_i,u_i)
中开始的精确解
u_i(t)
与方法步骤从同一点进行比较。因为只有一个精确解在起作用,它应该执行
(t_i,u_i)=(t(i),u_精确(i))
的步骤,然后比较结果存储在
u e(i+1)中的方法步骤
根据精确值
u\u精确(i+1)

这两个问题都通过将循环更改为

while (i<n)
  u_g(i+1)=u_g(i)+h*f(u_g(i));
  u_e(i+1)=u_exact(i)+h*f(u_exact(i));
  i=i+1;
end;
while(i精确解的校正
首先,精确解有一个符号误差,这使得所有的误差计算无效

(e^(2t)/u)'=e^(2t)*(-u'/u^2 + 2/u) = e^(2t)

e^(2t)/u(t)-1/u0 = (e^(2t)-1)/2  

u(t) = 2*u0*exp(2*t) ./ ( 2 + u0*(exp(2*t)-1) )

局部和全局误差的计算 用于计算局部误差和全局误差的Euler代码的组织在概念上已经混淆了一些东西。完整的正态积分给出了全局结果,从而也给出了与精确解不同的全局误差。因此,所谓的
u_e
应该是
u_g

局部错误将在
(t_i,u_i)
中开始的精确解
u_i(t)
与方法步骤从同一点进行比较。因为只有一个精确解在起作用,它应该执行
(t_i,u_i)=(t(i),u_精确(i))
的步骤,然后比较结果存储在
u e(i+1)中的方法步骤
根据精确值
u\u精确(i+1)

这两个问题都通过将循环更改为

while (i<n)
  u_g(i+1)=u_g(i)+h*f(u_g(i));
  u_e(i+1)=u_exact(i)+h*f(u_exact(i));
  i=i+1;
end;

while(I)据我所知,你的代码是正确的。也许巧合的是,特定的ODE使用Euler的方法效果更好。你是如何比较误差的?最好的检查方法是计算出每种方法在减少
h
时的收敛性。Euler的方法应该线性收敛,但Heun的方法应该改进得更快(二次).heun的方法有更大的截断误差,因为计算中有更多的部分吗?两个步骤而不是euler的方法中的一个步骤?不,我认为它应该有更小的截断误差,但较大的舍入误差。据我所知,你的代码是正确的。也许巧合的是,euler的方法更适合特定的ODE。如何比较误差?最好的检查方法是在减小
h
时计算出每种方法的收敛性。Euler的方法应该线性收敛,但Heun的方法应该改进得更快(二次).heun的方法有更大的截断误差,因为计算中有更多的部分吗?两个步骤而不是euler的方法中的一个步骤?不,我认为它应该有更小的截断误差,但较大的舍入误差。