龙贝格算法在MATLAB的实现

一、实验内容

用龙贝格算法计算积分

二、程序清单与运行结果 

M文件代码如下:

function I=romberg(fun,a,b,e)
% 使用龙贝格(Romberg数值求解公式)
% 例如:
% I=romberg(@(x)x^(3/2),0,1,0.000001)
%
% T =
%
%     1 至 3 列
%  
%     0.500000000000000                   0                   0
%     0.426776695296637   0.402368927062182                   0
%     0.407018110857901   0.400431916044989   0.400302781977176
%     0.401812464799974   0.400077249447332   0.400053605007488
%     0.400463401302048   0.400013713469406   0.400009477737544
%     0.400117671209778   0.400002427845688   0.400001675470774
%     0.400029739862529   0.400000429413446   0.400000296184629
%     0.400007491908991   0.400000075924478   0.400000052358547
%  
%     4 至 6 列
%  
%                     0                   0                   0
%                     0                   0                   0
%                     0                   0                   0
%     0.400049649817493                   0                   0
%     0.400008777304688   0.400008617020324                   0
%     0.400001551625270   0.400001523289272   0.400001516355028
%     0.400000274291198   0.400000269282045   0.400000268056232
%     0.400000048488292   0.400000047602790   0.400000047386095
%
%     7 至 8 列
%  
%                     0                   0
%                     0                   0
%                     0                   0
%                     0                   0
%                     0                   0
%                     0                   0
%     0.400000267751397                   0
%     0.400000047332207   0.400000047318753
%
%
% I =
%
%     0.400000047318753
 
% 判断输入参数是否足够
if nargin~=4
    error('请输入需要求积分的f、上界和下界以及误差e')
end
 
k=0; % 迭代次数
n=1; % 区间划分个数
h=b-a; %上下界间距
T(1,1)=h/2*(fun(a)+fun(b));
d=b-a; %误差间距
while e<=d
    k=k+1;
    h=h/2;
    sum=0;
    % 计算第一列T
    for i=1:n
        sum=sum+fun(a+(2*i-1)*h);
    end
    T(k+1,1)=T(k)/2+h*sum;
    % 迭代
    for j=1:k
        T(k+1,j+1)=T(k+1,j)+(T(k+1,j)-T(k,j))/(4^j-1);
    end
    n=n*2;
    d=abs(T(k+1,k+1)-T(k,k));
end
T
I=T(k+1,k+1);

运行结果如下:

I=romberg(@(x)x^(3/2),0,1,0.000001)

T =

  1 至 3 列

   0.500000000000000                   0                   0
   0.426776695296637   0.402368927062182                   0
   0.407018110857901   0.400431916044989   0.400302781977176
   0.401812464799974   0.400077249447332   0.400053605007488
   0.400463401302048   0.400013713469406   0.400009477737544
   0.400117671209778   0.400002427845688   0.400001675470774
   0.400029739862529   0.400000429413446   0.400000296184629
   0.400007491908991   0.400000075924478   0.400000052358547

  4 至 6 列

                   0                   0                   0
                   0                   0                   0
                   0                   0                   0
   0.400049649817493                   0                   0
   0.400008777304688   0.400008617020324                   0
   0.400001551625270   0.400001523289272   0.400001516355028
   0.400000274291198   0.400000269282045   0.400000268056232
   0.400000048488292   0.400000047602790   0.400000047386095

  7 至 8 列

                   0                   0
                   0                   0
                   0                   0
                   0                   0
                   0                   0
                   0                   0
   0.400000267751397                   0
   0.400000047332207   0.400000047318753


I =

   0.400000047318753

三、实验总结

在本次实验中,我使用了函数句柄来求值的方法,来避免直接代入求值而因舍入误差导致结果不理想。

  • 20
    点赞
  • 85
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值