matlab数值微分

标签(空格分隔): matlab 数值 微分 算法

文章目录

    • 标签(空格分隔): matlab 数值 微分 算法
    • @[toc]
  • matlab数值微分
    • 1 测试数值微分函数midD2Diff()
    • 2 中心二阶差商微分 midD2Diff()
    • 3 中心差商微分 midDiff()
    • 4 前向差商微分 forwardDiff()
    • 5 后向差商微分 backwardDiff()
    • 联系作者 [email protected]

matlab数值微分

1 测试数值微分函数midD2Diff()

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

2 中心二阶差商微分 midD2Diff()

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

3 中心差商微分 midDiff()

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

4 前向差商微分 forwardDiff()

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

5 后向差商微分 backwardDiff()

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

联系作者 [email protected]

end

你可能感兴趣的:(matlab,数值,微分,分析,计算,matlab,数值,微分,计算,分析)