matlab '' [],[数学]Improved Euler Method or Heun's Method 改进的欧拉方法或亨氏方法...

思想原理

必须要陈述一个事实,那就是欧拉方法在实际中是不采用的,因为误差较大,虽然可以增加段数,但是增加了段数,每个小误差累加起来也会很大,所以必须提出改进。

这时候,亨氏这个人就很巧妙的提出了他的方法。

有一个这样的问题,那就是欧拉方法很明显的误差,就是对于凹曲线的函数图像,以初始点做的切线延伸到下个点时的函数值总会比真实值要么大要么小。如下图。

2a8bef5b81a94917f9f7a8c493611361.png

那怎么可以更好的接近真实值呢?答案就是你不是总是要么大要么小么,那我来个折中。如下图。那怎么折中呢,那就用欧拉方法预测下个点的函数值,但是呢我用这个预测的点在求出一个斜率,这样就有两个斜率(一个欧拉求得的斜率,一个欧拉预测的点的斜率),那么取得一个平均,那么就得到了相对近似的斜率,再用这个斜率带入欧拉公示求近似的函数值。

69f9eab726274b9579f5302c968722e0.png

MATLAB 代码

fun = @(x,y) (x+y);

% 欧拉近似值

re = euler_method(fun,0,2,1,0.25);

fprintf('result is %f\n',re);

% 准确值

xx = 0:0.25:1;

yy = 3*exp(xx)-xx-1;

plot(xx,yy,'b');

legend('Euler','Point','Exact');

% Euler Method

% f 表示一阶常微分方程

% (x0,y0):初始值

% xn要求的函数值的自变量的值

% h 步长

function y = euler_method(f,x0,y0,xn,h)

n = round((xn-x0)/h);

y = y0;

x = x0;

xa = [];

xa(1) =x0;

re = [];

re(1) = y;

for i=1:n

y = y + h*f(x,y);

x = x + h;

% 保存段点值,用于绘图

xa(i+1)=x;

re(i+1)=y;

end

plot(xa,re,'r');

hold on;%不清除画面

scatter(xa,re,'*');% 描点

end

Result:

0dce7228c13431dc290a9502c66ebf5b.png

b7f0c77775d4d8b9f026b9f502efbea1.png

标签:Improved,斜率,xa,Heun,re,xx,x0,Method,欧拉

来源: https://www.cnblogs.com/tailiang/p/12248175.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值