用几种欧拉格式算一道题——基于matlab

用几种欧拉格式算一道题

我们首先解决这样一个问题:
在这里插入图片描述
我们通常说的欧拉方位为显式欧拉方法:
在这里插入图片描述
然后我们还有隐式欧拉方法
有两种格式,分别为改进的欧拉格式和修正的欧拉格式

改进的欧拉格式运用了迭代的方法
在这里插入图片描述
在这里插入图片描述

修正的欧拉方法用的是两步式
在这里插入图片描述
然后我们来用三种方法求解这道题:

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的减小,误差也会变得越来越小

  • 2
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值