用几种欧拉格式算一道题——基于matlab
作者:老李日期:2020-3-15用几种欧拉格式算一道题在这篇报告中,我先使用了显示欧拉格式来求解微分方程,隐式欧拉格式中,我使用了改进的欧拉格式和修正的欧拉格式来进行求解。这道题是这样的:我们要做的是,通过已有的信息,求出 y(3)。我使用matlab来实现这个事情首先设立参数和函数句柄代码如下%% function and parament% we are going t...
·
用几种欧拉格式算一道题
我们首先解决这样一个问题:
我们通常说的欧拉方位为显式欧拉方法:
然后我们还有隐式欧拉方法
有两种格式,分别为改进的欧拉格式和修正的欧拉格式
改进的欧拉格式运用了迭代的方法
修正的欧拉方法用的是两步式
然后我们来用三种方法求解这道题:
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的减小,误差也会变得越来越小

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐
所有评论(0)