前向差分、后向差分、中心差分精度,matlab仿真

这篇具有很好参考价值的文章主要介绍了前向差分、后向差分、中心差分精度,matlab仿真。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、前向差分

前向差分,matlab,开发语言,算法

前向差分公式:(1)前向差分,matlab,开发语言,算法泰勒展开为:(2)
前向差分,matlab,开发语言,算法
由泰勒展开可以推出 f '(x) : (3)
前向差分,matlab,开发语言,算法
由(3)可以知道右边第一项是前向差分,而其他项的和是函数f '(x)与前向差分的误差,用o(x)表示,得出:(4)
前向差分,matlab,开发语言,算法
因为误差项为o(x),o(x)主要项为Δx/2。而Δx为一阶,所以前向差分为一阶精度。

同理可以推出后向差分

二、后向差分

前向差分,matlab,开发语言,算法
后向差分公式:(1)
前向差分,matlab,开发语言,算法
泰勒展开为:(2)
前向差分,matlab,开发语言,算法
由泰勒展开可以推出 f '(x) : (3)
前向差分,matlab,开发语言,算法
由(3)可以知道右边第一项是后向差分,而其他项的和是函数f '(x)与后向差分的误差,用o(x)表示,得出:(4)
前向差分,matlab,开发语言,算法因为误差项为o(x),o(x)主要项为Δx/2。而Δx为一阶,所以后向差分为一阶精度。

三、中心差分

前向差分,matlab,开发语言,算法
中心差分公式:(1)
前向差分,matlab,开发语言,算法泰勒展开为:(2)
前向差分,matlab,开发语言,算法前向差分,matlab,开发语言,算法
由泰勒展开可以推出 f '(x) : (3)
前向差分,matlab,开发语言,算法
前向差分,matlab,开发语言,算法
由(3)可以知道右边第一项是中心差分,而其他项的和是函数f '(x)与中心差分的误差,其中主要项就是 (Δx^2)/6,由于 Δx^2是二姐的,因此中心差分的精度是二阶精度。

总结:
1、对于一阶差分如果Δx缩小到原来的1/2,那么误差项也会缩小到原来的1/2.
2、对于二阶差分如果Δx缩小到原来的1/2,那么误差项会缩小到原来的1/4.
3、因此二阶精度比一阶精度高。

四、Matlab仿真

%% 探究前向差分、后向差分、中心差分的精确度
% 函数f(x)=sin(x)*exp(-0.3x)
% 原函数图像
hold on
a = 100;
x = linspace(0,5*pi,100);
fx = sin(x).*exp(-0.3*x);
plot(x,fx);
% fx的一阶倒数画图
% f'(x)=cos(x)*exp(-0.3x)-0.3sin(x)*exp(-0.3x)
% f1x = cos(x).*exp(-0.3*x)-0.3*sin(x).*exp(-0.3*x);
% plot(x,f1x);
hold off

%% 差分
hold on
f1x = cos(x).*exp(-0.3*x)-0.3*sin(x).*exp(-0.3*x);
plot(x,f1x);

dx = 5*pi/100;
fx_0dx = sin(x+dx).*exp(-0.3*(x+dx));
fx_1dx = sin(x-dx).*exp(-0.3*(x-dx));
% 前向差分:f'(x)=[f(x+dx)-f(x)]/dx
f1x_f = (fx_0dx - fx)/dx;
plot(x,f1x_f,'--');
% 后向差分:f'(x)=[f(x)-f(x-dx)]/dx
f1x_b = (fx - fx_1dx)/dx;
plot(x,f1x_b,'-.');
% 中心差分:f'(x)=[f(x+dx)-f(x-dx)]/2dx
f1x_c = (fx_0dx - fx_1dx)/(2*dx);
plot(x,f1x_c,'o:','MarkerSize',3);

title('f(x)的导数与有限差分近似,dx=5*\pi/100','FontSize',20)
legend("f'(x)原始","前向差分","后向差分","中心差分",'FontSize',12)
hold off

%% 差分误差分析,dx=5*pi/100
hold on
% 前向误差
error_f = f1x - f1x_f;
plot(x,error_f,'--');
% 后向误差
error_b = f1x - f1x_b;
plot(x,error_b,'-.');
% 中心误差
error_c = f1x - f1x_c;
plot(x,error_c,'o:','MarkerSize',3);
title('差分误差分析,dx=5*\pi/100','FontSize',20)
legend("前向误差","后向误差","中心误差",'FontSize',12)
hold off

%% 差分误差分析,dx=5*pi/200
a = 200;
x = linspace(0,5*pi,a);

fx = sin(x).*exp(-0.3*x);
f1x = cos(x).*exp(-0.3*x)-0.3*sin(x).*exp(-0.3*x);

dx = 5*pi/a;
fx_0dx = sin(x+dx).*exp(-0.3*(x+dx));
fx_1dx = sin(x-dx).*exp(-0.3*(x-dx));

f1x_f = (fx_0dx - fx)/dx;
f1x_b = (fx - fx_1dx)/dx;
f1x_c = (fx_0dx - fx_1dx)/(2*dx);

hold on
% 前向误差
error_f = f1x - f1x_f;
plot(x,error_f,'--');
% 后向误差
error_b = f1x - f1x_b;
plot(x,error_b,'-.');
% 中心误差
error_c = f1x - f1x_c;
plot(x,error_c,'o:','MarkerSize',3);
title('差分误差分析dx=5*\pi/200','FontSize',20)
legend("前向误差","后向误差","中心误差",'FontSize',12)

hold off


运行结果:

第一部分:原函数

前向差分,matlab,开发语言,算法

第二部分:

前向差分,matlab,开发语言,算法
细节图:前向差分,matlab,开发语言,算法
观察细节图:
由细节图可以观察出中心差分比前向后向差分都准确

第三部分:误差分析图

前向差分,matlab,开发语言,算法
由这个误差分析图可以看出:中心差分(橙色的圆圈)的误差最小。

第四部分:修改采样频率,理论分析得知,采样频率越高,精度越高。

前向差分,matlab,开发语言,算法
第三部分和第四部分对比,dx缩小1/2,误差缩小!文章来源地址https://www.toymoban.com/news/detail-789056.html

到了这里,关于前向差分、后向差分、中心差分精度,matlab仿真的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包