matlab数值微分

5 篇文章 0 订阅
3 篇文章 0 订阅

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

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

联系作者 definedone@163.com

end

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值