Python龙贝格法求积分实例

  

我就废话不多说了,直接上代码吧!

        #龙贝格法求积分   导入数学=0 #积分下限   b=1 #积分上限   每股收益=10 * * 5 #精度   T=[] #复化梯形序列   S=[] #辛普森序列   C=[] #柯特斯序列   R=[] #伯格序列   def func (x): #被积函数   y=math.exp (- x)   返回y   def伯格(a, b, eps,函数):   h=b -   T。附加(h * (func (a) + func (b))/2)   ep=每股收益+ 1   m=0   而(ep>=每股收益):   m=m + 1   t=0   因为我在范围(2 * * (m - 1) 1):   t=t + func (a + (2 * (i + 1) 1) * h/2 * *米)* h/2 * * m   t=t + t [1]/2   T.append (t)   如果m>=1:   S.append ((4 * * m * T [1] - T [2])/(4 * * m - 1))   如果m>=2:   C.append ((4 * * m * S [1] - S [2])/(4 * * m - 1))   如果m>=3:   R.append ((4 * * m * C [1] C [2])/(4 * * m - 1))   如果m> 4:   ep=abs (10 * (R [1] - R [2]))   伯格(a, b,每股收益函数)   #打印(T)   #打印(S)   #打印(C)   #打印(右)   #计算机参考值0.6321205588   打印(“积分结果为:{:.5f}”.format (R [1]))   之前      

  

复合梯形公式的提出:

  

1。首先,什么是梯形公式:

  

 Python龙贝格法求积分实例

  

梯形公式表明:f (x)在[a, b]两点之间的积分(面积),近似地可以用一个梯形的面积表示。

  

2。显然,这个梯形公式对于不同的f (x)而言,其代数精度不同。为了能适合更多的f (x),我们一般使用牛顿-科特斯公式其中比较高次的公式来进行数值求积,但高次的缺陷是当次数大于8次,求积公式就会不稳定,因此,我们用于数值积分的牛顿-科特斯公式通常是一次的梯形公式,二次的辛普森公式和4此的科特斯公式。

  

辛普森公式:

  

 Python龙贝格法求积分实例

  

科特斯公式:

  

 Python龙贝格法求积分实例

  

3。牛顿-科特斯公式次数高于8次不能用,但是低次公式又精度不够。解决办法就是使用:复合梯形求积公式。复合求积公式就是在区间[a, b]上划分n格小区间。一个大区间[a, b]上用一次梯形公式精度不够,那么在n个小区间都使用梯形公式,最后将小区间的和累加起来,就可以得到整个大区间[a, b]的积分近似值。

  

=x0 & lt;x1 & lt; x2…& lt; xn-1 & lt;xn=b

  

 Python龙贝格法求积分实例

  

令Tn为将[a, b]划分n等分的复合梯形求积公式,h=(b)/n为小区间的长度. h/2类似于梯形公式中的(b)/2

  

注意:这里的k + 1是下标

  

 Python龙贝格法求积分实例

  

通过研究我们发现:T2n与Tn之间存在一些递推关系。

  

注意:这里的k + 1/2是下标。并且其中的h/2是中的h是Tn (n等分中的h=(b)/n))

  

 Python龙贝格法求积分实例

  

于是乎,我们可以一次推出T1, T2, T4、T8…T2n序列

  

引出这些之后,才是我们的主题:龙贝格求积公式

  

龙贝格求积公式的实质是用T2n序列构造,S2n序列,

  

再用S2n序列构造C2n序列

  

最后用C2n序列构造R2n序列。

  

编程实现,理解下面的几个公式即可。

  

 Python龙贝格法求积分实例

  

python编程代码如下:

        #=utf - 8编码   #作者:winyn   “‘   给定一个函数,如:f (x)=x ^(3/2)和积分上下限a, b,用机械求积伯格公式求积分。      “‘   进口numpy np         def func (x):   返回x * * (3/2)      类伯格:   def __init__(自我、integ_dowlimit integ_uplimit):   “‘   初始化积分上限integ_uplimit和积分下限integ_dowlimit   输入一个函数、输出函数在积分上下限的积分      “‘   self.integ_uplimit=integ_uplimit   self.integ_dowlimit=integ_dowlimit            def calc(自我):   “‘   计算理查森外推算法的四个序列      “‘   t_seq1=np。0 (5,' f ')   s_seq2=np。0 (4,' f ')   c_seq3=np。0 (3,' f ')   r_seq4=np。0 (2,' f ')   #循环生成hm间距序列   嗯=[(self.integ_uplimit - self.integ_dowlimit)/(2 * *我)我的范围(0 5)]   打印(hm)   #循环生成t_seq1   fa=func (self.integ_dowlimit)   fb=func (self.integ_uplimit)      t0=(1/2) * (self.integ_uplimit - self.integ_dowlimit) * (fa +神奇动物)   t_seq1 [0]=t0      我的范围(1、5):   和=0   #多出来的点的累加和   为每个范围内(1、2 * *我,2):   和=和+嗯[我]* func (self.integ_dowlimit +每个*嗯[我])#计算两项值   temp1=1/2 * t_seq1 (i - 1)   temp2=总和   temp=temp1 + temp2   #求t_seql的1 - 4位   t_seq1[我]=temp   打印(' T序列:' + str(列表(t_seq1)))   #循环生成s_seq2   s_seq2=[圆((4 * t_seq1 (i + 1) - t_seq1[我])/3,6)因为我在范围(0,4))   打印(' S序列:' + str(列表(s_seq2)))   #循环生成c_seq3   c_seq3=[圆((4 * * 2 * s_seq2 (i + 1) - s_seq2[我])/(4 * * 2 - 1),6)因为我在范围(0,3))   打印(' C序列:' + str(列表(c_seq3)))   #循环生成r_seq4   r_seq4=[圆((4 * * 3 * c_seq3 (i + 1) - c_seq3[我])/(4 * * 3 - 1),6)因为我在范围(0,2))   打印(' R序列:' + str(列表(r_seq4)))   返回“结束”         罗=伯格(0,1)   print (rom.calc ())   

Python龙贝格法求积分实例