Python龍貝格法求積分實(shí)例
我就廢話不多說了,直接上代碼吧!
# 龍貝格法求積分
import math
a=0 # 積分下限
b=1 # 積分上限
eps=10**-5 # 精度
T=[] # 復(fù)化梯形序列
S=[] # Simpson序列
C=[] # Cotes序列
R=[] # Romberg序列
def func(x): # 被積函數(shù)
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)
# 計(jì)算機(jī)參考值0.6321205588
print("積分結(jié)果為:{:.5f}".format(R[-1]))
補(bǔ)充拓展:python實(shí)現(xiàn)數(shù)值分析之龍貝格求積公式
復(fù)合梯形公式的提出:
1.首先,什么是梯形公式:

梯形公式表明:f(x)在[a,b]兩點(diǎn)之間的積分(面積),近似地可以用一個(gè)梯形的面積表示。
2.顯然,這個(gè)梯形公式對于不同的f(x)而言,其代數(shù)精度不同。為了能適合更多的f(x),我們一般使用牛頓-科特斯公式其中比較高次的公式來進(jìn)行數(shù)值求積。但高次的缺陷是當(dāng)次數(shù)大于8次,求積公式就會(huì)不穩(wěn)定。因此,我們用于數(shù)值積分的牛頓-科特斯公式通常是一次的梯形公式、二次的辛普森公式和4此的科特斯公式。
辛普森公式:

科特斯公式:

3.牛頓-科特斯公式次數(shù)高于8次不能用,但是低次公式又精度不夠。解決辦法就是使用:復(fù)合梯形求積公式。復(fù)合求積公式就是在區(qū)間[a,b]上劃分n格小區(qū)間。一個(gè)大區(qū)間[a,b]上用一次梯形公式精度不夠,那么在n個(gè)小區(qū)間都使用梯形公式,最后將小區(qū)間的和累加起來,就可以得到整個(gè)大區(qū)間[a,b]的積分近似值。
a = x0 < x1 <x2 …<xn-1 < xn =b

令Tn為將[a,b]劃分n等分的復(fù)合梯形求積公式,h =(b-a)/n為小區(qū)間的長度。h/2類似于梯形公式中的(b-a)/2
注意:這里的k+1是下標(biāo)

通過研究我們發(fā)現(xiàn):T2n與Tn之間存在一些遞推關(guān)系。
注意:這里的k+1/2是下標(biāo)。并且其中的h/2是中的h是Tn(n等分中的h = (b-a)/n))

于是乎,我們可以一次推出T1,T2,T4,T8…T2n序列
引出這些之后,才是我們的主題:龍貝格求積公式
龍貝格求積公式的實(shí)質(zhì)是用T2n序列構(gòu)造,S2n序列,
再用S2n序列構(gòu)造C2n序列
最后用C2n序列構(gòu)造R2n序列。
編程實(shí)現(xiàn),理解下面的幾個(gè)公式即可。

python編程代碼如下:
# coding=UTF-8
# Author:winyn
'''
給定一個(gè)函數(shù),如:f(x)= x^(3/2),和積分上下限a,b,用機(jī)械求積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
輸入一個(gè)函數(shù),輸出函數(shù)在積分上下限的積分
'''
self.integ_uplimit = integ_uplimit
self.integ_dowlimit = integ_dowlimit
def calc(self):
'''
計(jì)算Richardson外推算法的四個(gè)序列
'''
t_seq1 = np.zeros(5, 'f')
s_seq2 = np.zeros(4, 'f')
c_seq3 = np.zeros(3, 'f')
r_seq4 = np.zeros(2, 'f')
# 循環(huán)生成hm間距序列
hm = [(self.integ_uplimit - self.integ_dowlimit) / (2 ** i) for i in range(0,5)]
print(hm)
# 循環(huán)生成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
# 多出來的點(diǎn)的累加和
for each in range(1, 2**i,2):
sum =sum + hm[i]*func( self.integ_dowlimit+each * hm[i])#計(jì)算兩項(xiàng)值
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)))
# 循環(huán)生成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)))
# 循環(huán)生成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)))
# 循環(huán)生成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龍貝格法求積分實(shí)例就是小編分享給大家的全部內(nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
python利用requests庫進(jìn)行接口測試的方法詳解
在python的標(biāo)準(zhǔn)庫中,雖然提供了urllib,utllib2,httplib,但是做接口測試,requests真心好,正如官方說的,“讓HTTP服務(wù)人類”,一言以蔽之,說明一切,這篇文章主要給大家介紹了關(guān)于python利用requests庫進(jìn)行接口測試的相關(guān)資料,需要的朋友可以參考下2018-07-07
Python實(shí)現(xiàn)扣除個(gè)人稅后的工資計(jì)算器示例
這篇文章主要介紹了Python實(shí)現(xiàn)扣除個(gè)人稅后的工資計(jì)算器,涉及Python流程控制與數(shù)學(xué)運(yùn)算相關(guān)操作技巧,需要的朋友可以參考下2018-03-03
Python 身份驗(yàn)證和授權(quán)庫使用詳解(python jwt庫)
python_jwt是一個(gè)Python庫,用于生成、解析和驗(yàn)證JSON Web Tokens(JWT),它完全符合JWT標(biāo)準(zhǔn)規(guī)范(RFC 7519),并提供了簡單而強(qiáng)大的API,使得用戶可以輕松地在Python應(yīng)用中實(shí)現(xiàn)JWT功能,通過本文的介紹,深入探討了python_jwt庫的功能特性、使用方法以及應(yīng)用場景2021-01-01
Python PyMySQL操作MySQL數(shù)據(jù)庫的方法詳解
PyMySQL是一個(gè)用于Python編程語言的純Python MySQL客戶端庫,它遵循Python標(biāo)準(zhǔn)DB API接口,并提供了許多方便的功能,本文就來和大家簡單介紹一下吧2023-05-05
python suds訪問webservice服務(wù)實(shí)現(xiàn)
這篇文章主要介紹了python suds訪問webservice服務(wù)實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2020-06-06
PyCharm鼠標(biāo)右鍵不顯示Run unittest的解決方法
今天小編就為大家分享一篇PyCharm鼠標(biāo)右鍵不顯示Run unittest的解決方法,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-11-11
Django 接收Post請求數(shù)據(jù),并保存到數(shù)據(jù)庫的實(shí)現(xiàn)方法
今天小編就為大家分享一篇Django 接收Post請求數(shù)據(jù),并保存到數(shù)據(jù)庫的實(shí)現(xiàn)方法,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-07-07
Django 導(dǎo)出 Excel 代碼的實(shí)例詳解
本篇文章主要介紹了Django 導(dǎo)出 Excel 代碼的實(shí)例詳解,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-08-08

