復(fù)化梯形求積分實(shí)例——用Python進(jìn)行數(shù)值計(jì)算
用程序來求積分的方法有很多,這篇文章主要是有關(guān)牛頓-科特斯公式。
學(xué)過插值算法的同學(xué)最容易想到的就是用插值函數(shù)代替被積分函數(shù)來求積分,但實(shí)際上在大部分場景下這是行不通的。
插值函數(shù)一般是一個(gè)不超過n次的多項(xiàng)式,如果用插值函數(shù)來求積分的話,就會(huì)引進(jìn)高次多項(xiàng)式求積分的問題。這樣會(huì)將原來的求積分問題帶到另一個(gè)求積分問題:如何求n次多項(xiàng)式的積分,而且當(dāng)次數(shù)變高時(shí),會(huì)出現(xiàn)龍悲歌現(xiàn)象,誤差反而可能會(huì)增大,并且高次的插值求積公式有可能會(huì)變得不穩(wěn)定:詳細(xì)原因不贅述。
牛頓-科特斯公式解決這一問題的辦法是將大的插值區(qū)間分為一堆小的插值區(qū)間,使得多項(xiàng)式的次數(shù)不會(huì)太高。然后通過引入?yún)?shù)函數(shù)

將帶有冪的項(xiàng)的取值范圍固定在一個(gè)固定范圍內(nèi),這樣一來就將多項(xiàng)式帶有冪的部分的求積變?yōu)橐粋€(gè)固定的常數(shù),只需手工算出來即可。這個(gè)常數(shù)可以直接帶入多項(xiàng)式求積函數(shù)。
上式中x的求積分區(qū)間為[a, b],h = (b - a)/n, 這樣一來積分區(qū)間變?yōu)閇0, n],需要注意的是從這個(gè)公式可以看出一個(gè)大的區(qū)間被分為n個(gè)等長的小區(qū)間。 這一部分具體請參見任意一本有關(guān)數(shù)值計(jì)算的書!
n是一個(gè)事先確定好的值。
又因?yàn)橐粋€(gè)大的插值區(qū)間需要被分為等長的多個(gè)小區(qū)間,并在這些小區(qū)間上分別進(jìn)行插值和積分,因此此時(shí)的牛頓-科特斯公式被稱為:復(fù)化牛頓-科特斯公式。
并且對于n的不同取值牛頓-科特斯有不同的名稱: 當(dāng)n=1時(shí),叫做復(fù)化梯形公式,復(fù)化梯形公式也就是將每一個(gè)小區(qū)間都看為一個(gè)梯形(高為h,上底為f(t), 下底為f(t+1))。這與積分的本質(zhì):無限分隔 相同。
當(dāng)n=2時(shí),復(fù)化牛頓-科特斯公式被稱為復(fù)化辛普森公式(非美國法律界著名的那個(gè)辛普森)。
我這篇文章實(shí)現(xiàn)的是復(fù)化梯形公式:

首先寫一個(gè)函數(shù)求節(jié)點(diǎn)函數(shù)值求和那部分:
""" @brief: 求和 ∑f(xk) : xk表示等距節(jié)點(diǎn)的第k個(gè)節(jié)點(diǎn),不包括端點(diǎn) xk = a + kh (k = 0, 1, 2, ...) 積分區(qū)間為[a, b] @param: xk 積分區(qū)間的等分點(diǎn)x坐標(biāo)集合(不包括端點(diǎn)) @param: func 求積函數(shù) @return: 返回值為集合的和 """ def sum_fun_xk(xk, func): return sum([func(each) for each in xk])
然后就可以寫整個(gè)求積分函數(shù)了:
""" @brief: 求func積分 : @param: a 積分區(qū)間左端點(diǎn) @param: b 積分區(qū)間右端點(diǎn) @param: n 積分分為n等份(復(fù)化梯形求積分要求) @param: func 求積函數(shù) @return: 積分值 """ def integral(a, b, n, func): h = (b - a)/float(n) xk = [a + i*h for i in range(1, n)] return h/2 * (func(a) + 2 * sum_fun_xk(xk, func) + func(b))
相當(dāng)?shù)暮唵?/p>
試驗(yàn):
當(dāng)把大區(qū)間分為兩個(gè)小區(qū)間時(shí):

分為20個(gè)小區(qū)間時(shí):

求的積分值就是這些彩色的梯形面積之和。
測試代碼:
if __name__ == "__main__":
func = lambda x: x**2
a, b = 2, 8
n = 20
print integral(a, b, n, func)
''' 畫圖 '''
import matplotlib.pyplot as plt
plt.figure("play")
ax1 = plt.subplot(111)
plt.sca(ax1)
tmpx = [2 + float(8-2) /50 * each for each in range(50+1)]
plt.plot(tmpx, [func(each) for each in tmpx], linestyle = '-', color='black')
for rang in range(n):
tmpx = [a + float(8-2)/n * rang, a + float(8-2)/n * rang, a + float(8-2)/n * (rang+1), a + float(8-2)/n * (rang+1)]
tmpy = [0, func(tmpx[1]), func(tmpx[2]), 0]
c = ['r', 'y', 'b', 'g']
plt.fill(tmpx, tmpy, color=c[rang%4])
plt.grid(True)
plt.show()
注意上面代碼中的n并不是上文開篇提到的公式中的n,開篇提到的n是指將每一個(gè)具體的插值區(qū)間(也就是小區(qū)間)等距插n個(gè)節(jié)點(diǎn),復(fù)化梯形公式的n是固定的為1.
而代碼中的n指將大區(qū)間分為n個(gè)小區(qū)間。
以上這篇復(fù)化梯形求積分實(shí)例——用Python進(jìn)行數(shù)值計(jì)算就是小編分享給大家的全部內(nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
基于Python在MacOS上安裝robotframework-ride
今天小編就為大家分享一篇關(guān)于基于Python在MacOS上安裝robotframework-ride,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧2018-12-12
python 截取XML中bndbox的坐標(biāo)中的圖像,另存為jpg的實(shí)例
這篇文章主要介紹了python 截取XML中bndbox的坐標(biāo)中的圖像,另存為jpg的實(shí)例,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-03-03
python編程scrapy簡單代碼實(shí)現(xiàn)搜狗圖片下載器
這篇文章主要為大家介紹了使用python scrapy簡單代碼實(shí)現(xiàn)搜狗圖片下載器示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助2021-11-11
調(diào)整Jupyter notebook的啟動(dòng)目錄操作
這篇文章主要介紹了調(diào)整Jupyter notebook的啟動(dòng)目錄操作,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-04-04
pytorch實(shí)現(xiàn)建立自己的數(shù)據(jù)集(以mnist為例)
今天小編就為大家分享一篇pytorch實(shí)現(xiàn)建立自己的數(shù)據(jù)集(以mnist為例),具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-01-01
python接口自動(dòng)化使用requests庫發(fā)送http請求
這篇文章主要介紹了python接口自動(dòng)化使用requests庫發(fā)送http請求,HTTP協(xié)議?,一個(gè)基于TCP/IP通信協(xié)議來傳遞數(shù)據(jù),包括html文件、圖像、結(jié)果等,即是一個(gè)客戶端和服務(wù)器端請求和應(yīng)答的標(biāo)準(zhǔn)2022-08-08
如何使用matplotlib讓你的數(shù)據(jù)更加生動(dòng)
數(shù)據(jù)可視化用于以更直接的表示方式顯示數(shù)據(jù),并且更易于理解,下面這篇文章主要給大家介紹了關(guān)于如何使用matplotlib讓你的數(shù)據(jù)更加生動(dòng)的相關(guān)資料,需要的朋友可以參考下2021-11-11
Pandas讀取MySQL數(shù)據(jù)到DataFrame的方法
今天小編就為大家分享一篇Pandas讀取MySQL數(shù)據(jù)到DataFrame的方法,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-07-07

