我就废话不多说了,直接上代码吧!
# 龙贝格法求积分
import math
a=0 # 积分下限
b=1 # 积分上限
eps=10**-5 # 精度
T=[] # 复化梯形序列
S=[] # Simpson序列
C=[] # Cotes序列
R=[] # Romberg序列
def func(x): # 被积函数
y=math.exp(-x)
return y
def Romberg(a,b,eps,func):
h = b - a
T.append(h * (func(a) + func(b)) / 2)
ep=eps+1
m=0
while(ep>=eps):
m=m+1
t=0
for i in range(2**(m-1)-1):
t=t+func(a+(2*(i+1)-1)*h/2**m)*h/2**m
t=t+T[-1]/2
T.append(t)
if m>=1:
S.append((4**m*T[-1]-T[-2])/(4**m-1))
if m>=2:
C.append((4**m*S[-1]-S[-2])/(4**m-1))
if m>=3:
R.append((4**m*C[-1]-C[-2])/(4**m-1))
if m>4:
ep=abs(10*(R[-1]-R[-2]))
Romberg(a,b,eps,func)
# print(T)
# print(S)
# print(C)
# print(R)
# 计算机参考值0.6321205588
print("积分结果为:{:.5f}".format(R[-1]))
补充拓展:python实现数值分析之龙贝格求积公式
复合梯形公式的提出:
1.首先,什么是梯形公式:
梯形公式表明:f(x)在[a,b]两点之间的积分(面积),近似地可以用一个梯形的面积表示。
2.显然,这个梯形公式对于不同的f(x)而言,其代数精度不同。为了能适合更多的f(x),我们一般使用牛顿-科特斯公式其中比较高次的公式来进行数值求积。但高次的缺陷是当次数大于8次,求积公式就会不稳定。因此,我们用于数值积分的牛顿-科特斯公式通常是一次的梯形公式、二次的辛普森公式和4此的科特斯公式。
辛普森公式:
科特斯公式:
3.牛顿-科特斯公式次数高于8次不能用,但是低次公式又精度不够。解决办法就是使用:复合梯形求积公式。复合求积公式就是在区间[a,b]上划分n格小区间。一个大区间[a,b]上用一次梯形公式精度不够,那么在n个小区间都使用梯形公式,最后将小区间的和累加起来,就可以得到整个大区间[a,b]的积分近似值。
a = x0 < x1 <x2 …<xn-1 < xn =b
令Tn为将[a,b]划分n等分的复合梯形求积公式,h =(b-a)/n为小区间的长度。h/2类似于梯形公式中的(b-a)/2
注意:这里的k+1是下标
通过研究我们发现:T2n与Tn之间存在一些递推关系。
注意:这里的k+1/2是下标。并且其中的h/2是中的h是Tn(n等分中的h = (b-a)/n))
于是乎,我们可以一次推出T1,T2,T4,T8…T2n序列
引出这些之后,才是我们的主题:龙贝格求积公式
龙贝格求积公式的实质是用T2n序列构造,S2n序列,
再用S2n序列构造C2n序列
最后用C2n序列构造R2n序列。
编程实现,理解下面的几个公式即可。
python编程代码如下:
# coding=UTF-8
# Author:winyn
'''
给定一个函数,如:f(x)= x^(3/2),和积分上下限a,b,用机械求积Romberg公式求积分。
'''
import numpy as np
def func(x):
return x**(3/2)
class Romberg:
def __init__(self, integ_dowlimit, integ_uplimit):
'''
初始化积分上限integ_uplimit和积分下限integ_dowlimit
输入一个函数,输出函数在积分上下限的积分
'''
self.integ_uplimit = integ_uplimit
self.integ_dowlimit = integ_dowlimit
def calc(self):
'''
计算Richardson外推算法的四个序列
'''
t_seq1 = np.zeros(5, 'f')
s_seq2 = np.zeros(4, 'f')
c_seq3 = np.zeros(3, 'f')
r_seq4 = np.zeros(2, 'f')
# 循环生成hm间距序列
hm = [(self.integ_uplimit - self.integ_dowlimit) / (2 ** i) for i in range(0,5)]
print(hm)
# 循环生成t_seq1
fa = func(self.integ_dowlimit)
fb = func(self.integ_uplimit)
t0 = (1 / 2) * (self.integ_uplimit - self.integ_dowlimit) * (fa+fb)
t_seq1[0] = t0
for i in range(1, 5):
sum = 0
# 多出来的点的累加和
for each in range(1, 2**i,2):
sum =sum + hm[i]*func( self.integ_dowlimit+each * hm[i])#计算两项值
temp1 = 1 / 2 * t_seq1[i - 1]
temp2 =sum
temp = temp1 + temp2
# 求t_seql的1-4位
t_seq1[i] = temp
print('T序列:'+ str(list(t_seq1)))
# 循环生成s_seq2
s_seq2 = [round((4 * t_seq1[i + 1] - t_seq1[i]) / 3,6) for i in range(0, 4)]
print('S序列:' + str(list(s_seq2)))
# 循环生成c_seq3
c_seq3 = [round((4 ** 2 * s_seq2[i + 1] - s_seq2[i]) / (4 ** 2 - 1),6) for i in range(0, 3)]
print('C序列:' + str(list(c_seq3)))
# 循环生成r_seq4
r_seq4 = [round((4 ** 3 * c_seq3[i + 1] - c_seq3[i]) / (4 ** 3 - 1),6) for i in range(0, 2)]
print('R序列:' + str(list(r_seq4)))
return 'end'
rom = Romberg(0, 1)
print(rom.calc())
以上这篇Python龙贝格法求积分实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。
Python,龙贝格法,求积分
《魔兽世界》大逃杀!60人新游玩模式《强袭风暴》3月21日上线
暴雪近日发布了《魔兽世界》10.2.6 更新内容,新游玩模式《强袭风暴》即将于3月21 日在亚服上线,届时玩家将前往阿拉希高地展开一场 60 人大逃杀对战。
艾泽拉斯的冒险者已经征服了艾泽拉斯的大地及遥远的彼岸。他们在对抗世界上最致命的敌人时展现出过人的手腕,并且成功阻止终结宇宙等级的威胁。当他们在为即将于《魔兽世界》资料片《地心之战》中来袭的萨拉塔斯势力做战斗准备时,他们还需要在熟悉的阿拉希高地面对一个全新的敌人──那就是彼此。在《巨龙崛起》10.2.6 更新的《强袭风暴》中,玩家将会进入一个全新的海盗主题大逃杀式限时活动,其中包含极高的风险和史诗级的奖励。
《强袭风暴》不是普通的战场,作为一个独立于主游戏之外的活动,玩家可以用大逃杀的风格来体验《魔兽世界》,不分职业、不分装备(除了你在赛局中捡到的),光是技巧和战略的强弱之分就能决定出谁才是能坚持到最后的赢家。本次活动将会开放单人和双人模式,玩家在加入海盗主题的预赛大厅区域前,可以从强袭风暴角色画面新增好友。游玩游戏将可以累计名望轨迹,《巨龙崛起》和《魔兽世界:巫妖王之怒 经典版》的玩家都可以获得奖励。
更新动态
- 小骆驼-《草原狼2(蓝光CD)》[原抓WAV+CUE]
- 群星《欢迎来到我身边 电影原声专辑》[320K/MP3][105.02MB]
- 群星《欢迎来到我身边 电影原声专辑》[FLAC/分轨][480.9MB]
- 雷婷《梦里蓝天HQⅡ》 2023头版限量编号低速原抓[WAV+CUE][463M]
- 群星《2024好听新歌42》AI调整音效【WAV分轨】
- 王思雨-《思念陪着鸿雁飞》WAV
- 王思雨《喜马拉雅HQ》头版限量编号[WAV+CUE]
- 李健《无时无刻》[WAV+CUE][590M]
- 陈奕迅《酝酿》[WAV分轨][502M]
- 卓依婷《化蝶》2CD[WAV+CUE][1.1G]
- 群星《吉他王(黑胶CD)》[WAV+CUE]
- 齐秦《穿乐(穿越)》[WAV+CUE]
- 发烧珍品《数位CD音响测试-动向效果(九)》【WAV+CUE】
- 邝美云《邝美云精装歌集》[DSF][1.6G]
- 吕方《爱一回伤一回》[WAV+CUE][454M]






