用几种欧拉格式算一道题
我们首先解决这样一个问题:
我们通常说的欧拉方位为显式欧拉方法:
然后我们还有隐式欧拉方法
有两种格式,分别为改进的欧拉格式和修正的欧拉格式
改进的欧拉格式运用了迭代的方法
修正的欧拉方法用的是两步式
然后我们来用三种方法求解这道题:
1.h=0.1
-0.002
h=0.2:
-0.005
h = 0.05
-0.001
最后贴上修正的欧拉格式
我用matlab来实现这件事情
代码如下:
clear; close all
%% 例2.4
%% function and parament
% we are going to cacular the funtion y(3) from y(2)
f = @(t)(exp(-t)+t);
df = @(t,y)(-y+t+1);
startP = 0;
endP = 5;
omiga0 = 1;
h = 0.05;
%% show Euler format
%显式欧拉方法
omiga = zeros(1,100);
omiga(1) = omiga0 + h*df(startP,omiga0);
for i = 2:100
omiga(i) = omiga(i-1) + h*df(startP+h*(i-1),omiga(i-1));
end
%% show Euler error figure
figure('name','例2.1');
axis on
X = 0:0.01:5;
plot(X,f(X))
hold on
X1 = 0:0.05:5;
plot(X1,[omiga0,omiga])
axis equal;
legend({'原函数','欧拉格式'},'Location','northwest')
figure('name','显式欧拉格式下例1.2的误差')
title('显式欧拉格式下例1.2的误差')
plot(X1,([omiga0,omiga]-f(X1)))
%% Implicit Euler format
%改进的欧拉方法
%% 观察迭代序列的收敛性以及与真值的误差
%这里关注从omiga0到omiga1的过程
format long;
omiga1 = omiga0 + h*df(startP,omiga0);%初值
k=1;
i = [];
e = [];
temp = omiga1;
while k <= 10%迭代10次
omiga2 = omiga0 + (h/2)*(df(startP,omiga0)+df(startP+h,omiga1));
ik = omiga2-temp;
temp = omiga2;
ek = f(startP+h)-omiga2;
i = [i ,ik];
e = [e ,ek];
k=k+1;
end
figure('name','收敛性')
title('convergence in each iteration')
plot(1:10,i)
figure('name','error')
title('error in each iteration')
plot(1:10,e)
%% using improved Euler format to caculate eg 1.2
%运用(改进的)隐式欧拉格式计算例1.2
format short;
omiga = zeros(1,101);
omiga(1) = omiga0;
w = omiga0;
for k = 1:100
wk = w + h*df(startP+(k-1)*h, w);
z1 = wk;
z2 = Inf;
while abs(z1-z2)>eps
z2 = z1;
z1 = w + (h/2)*(df(startP+(k-1)*h,w)+df(startP+k*h,wk));
end
w = z1;
omiga(k+1) = w;
end
%% improved Euler error figure
figure('name','例2.1');
axis on
X = 0:0.01:5;
plot(X,f(X))
hold on
X1 = 0:0.05:5;
plot(X1,omiga)
axis equal;
legend({'原函数','改进欧拉格式'},'Location','northwest')
figure('name','改进欧拉格式下例1.2的误差')
title('改进欧拉格式下例1.2的误差')
plot(X1,(omiga-f(X1)))
%% Modified Euler scheme
%修正欧拉格式
w = zeros(1,101);
w(1) = omiga0;
k = 1;
while k<=100
w_half = w(k)+(h/2)*df(startP+(k-1)*h,w(k));
w(k+1) = w(k)+df(startP+(k-1)*h,w_half)*h;
k = k+1;
end
%% modified Euler error figure
figure('name','例2.1');
axis on
X = 0:0.01:5;
plot(X,f(X))
hold on
X1 = 0:0.05:5;
plot(X1,w)
axis equal;
legend({'原函数','修正欧拉格式'},'Location','northwest')
figure('name','修正欧拉格式下例1.2的误差')
title('修正欧拉格式下例1.2的误差')
plot(X1,(w-f(X1)))
我们可以看到,对于显式欧拉格式而言,随着步长h的减小,误差也会变得越来越小