clc,clear
format long
% f=@(x)((x+1).^(-2))
% f=@(x)(exp(-x.^2))
% f=@(x)(exp(x))
f=@(x)(x*sin(x))
d2f=@(x)(cos(x)+cos(x)-x*sin(x))
disp('二阶中心差商求微分 ')
x=1
n=10
hdiff=[];h=10.^(-[1:n]);gErrer=[];
for i=1:n
[hdiffi,gErreri]=midD2Diff(f,x,h(i),true);
hdiff=[hdiff,hdiffi];
gErrer=[gErrer,gErreri];
end,h,hdiff,gErrer
% %% 系统计算的积分精确值
% diff_system=f(x)
diff_system=d2f(x)
d_my_system=abs(hdiff-diff_system);
log_darea=round(log10(gErrer)*10)
log_d_my_system=round(log10(d_my_system)*10)
运行结果:
f =
@(x)(x*sin(x))
d2f =
@(x)(cos(x)+cos(x)-x*sin(x))
二阶中心差商求微分
x =
1
n =
10
h =
Columns 1 through 6
0.100000000000000 0.010000000000000 0.001000000000000 0.000100000000000 0.000010000000000 0.000001000000000
Columns 7 through 10
0.000000100000000 0.000000010000000 0.000000001000000 0.000000000100000
hdiff =
1.0e+02 *
Columns 1 through 6
0.002380345116521 0.002391226291765 0.002391335168772 0.002391336240137 0.002391353781661 0.002389199948993
Columns 7 through 10
0.002553512956638 -0.011102230246252 1.110223024625156 0
gErrer =
1.0e+02 *
Columns 1 through 6
0.000032893550397 0.000000329924557 0.000000003298750 0 0.000000022204460 0.000002220446049
Columns 7 through 10
0.000222044604925 0.016653345369377 1.387778780781446 0
diff_system =
0.239133626928383
function [hd2diff,gErrer]=midD2Diff(func,x,h,withError)
%中心二阶差商微分
%理论依据:数值分析方法 奚梅成
%func 求导函数;
%x 微分点
%h 微分步长
%%
%name:邓能财 Date: 2013/12/23
%% 默认参数
if nargin<4 withError=false; gErrer=0;
if nargin<3 h=1e-3; %试验确定
end,end
%% 计算
hd2diff=(func(x+h)-2*func(x)+func(x-h))/(h*h);
%% 误差:区间倍增差商作为事后误差估计
if withError
hd2diff_=midD2Diff(func,x,h*2,false);
gErrer=abs(hd2diff-hd2diff_);
end
end
function [hdiff,gErrer]=midDiff(func,x,h,withError)
%中心差商微分
%理论依据:数值分析方法 奚梅成
%func 求导函数;
%x 微分点
%h 微分步长
%%
%name:邓能财 Date: 2013/12/23
%% 默认参数
if nargin<4 withError=false; gErrer=0;
if nargin<3 h=1e-5; %试验确定
end,end
%% 计算
hdiff=(func(x+h)-func(x-h))/(2*h);
%% 误差:区间倍增差商作为事后误差估计
if withError
hdiff_=midDiff(func,x,h*2,false);
gErrer=abs(hdiff-hdiff_);
end
end
function [hdiff,gErrer]=forwardDiff(func,x,h,withError)
%前向差商微分
%理论依据:数值分析方法 奚梅成
%func 求导函数;
%x 微分点
%h 微分步长
%%
%name:邓能财 Date: 2013/12/23
%% 默认参数
if nargin<4 withError=false; gErrer=0;
if nargin<3 h=1e-7;
end,end
%% 计算
hdiff=(func(x+h)-func(x))/h;
%% 误差:区间倍增差商作为事后误差估计
if withError
hdiff_=forwardDiff(func,x,h*2,false);
gErrer=abs(hdiff-hdiff_);
end
end
function [hdiff,gErrer]=backwardDiff(func,x,h,withError)
%后向差商微分
%理论依据:数值分析方法 奚梅成
%func 求导函数;
%x 微分点
%h 微分步长
%%
%name:邓能财 Date: 2013/12/23
%% 默认参数
if nargin<4 withError=false; gErrer=0;
if nargin<3 h=1e-7;
end,end
%% 计算
hdiff=(func(x)-func(x-h))/h;
%% 误差:区间倍增差商作为事后误差估计
if withError
hdiff_=backwardDiff(func,x,h*2,false);
gErrer=abs(hdiff-hdiff_);
end
end
end