我就废话不多说了,直接上代码吧!
#龙贝格法求积分 导入数学=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。首先,什么是梯形公式:
梯形公式表明:f (x)在[a, b]两点之间的积分(面积),近似地可以用一个梯形的面积表示。
2。显然,这个梯形公式对于不同的f (x)而言,其代数精度不同。为了能适合更多的f (x),我们一般使用牛顿-科特斯公式其中比较高次的公式来进行数值求积,但高次的缺陷是当次数大于8次,求积公式就会不稳定,因此,我们用于数值积分的牛顿-科特斯公式通常是一次的梯形公式,二次的辛普森公式和4此的科特斯公式。
辛普森公式:
科特斯公式:
3。牛顿-科特斯公式次数高于8次不能用,但是低次公式又精度不够。解决办法就是使用:复合梯形求积公式。复合求积公式就是在区间[a, b]上划分n格小区间。一个大区间[a, b]上用一次梯形公式精度不够,那么在n个小区间都使用梯形公式,最后将小区间的和累加起来,就可以得到整个大区间[a, b]的积分近似值。
=x0 & lt;x1 & lt; x2…& lt; xn-1 & lt;xn=b
令Tn为将[a, b]划分n等分的复合梯形求积公式,h=(b)/n为小区间的长度. h/2类似于梯形公式中的(b)/2
注意:这里的k + 1是下标
通过研究我们发现:T2n与Tn之间存在一些递推关系。
注意:这里的k + 1/2是下标。并且其中的h/2是中的h是Tn (n等分中的h=(b)/n))
于是乎,我们可以一次推出T1, T2, T4、T8…T2n序列
引出这些之后,才是我们的主题:龙贝格求积公式
龙贝格求积公式的实质是用T2n序列构造,S2n序列,
再用S2n序列构造C2n序列
最后用C2n序列构造R2n序列。
编程实现,理解下面的几个公式即可。
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龙贝格法求积分实例