用程式來求積分的方法有很多,這篇文章主要是有關牛頓-科特斯公式。
學過插值演算法的同學最容易想到的就是用插值函式代替被積分函式來求積分,但實際上在大部分場景下這是行不通的。
插值函式一般是乙個不超過n次的多項式,如果用插值函式來求積分的話,就會引進高次多項式求積分的問題。這樣會將原來的求積分問題帶到另乙個求積分問題:如何求n次多項式的積分,而且當次數變高時,會出現龍悲歌現象,誤差反而可能會增大,並且高次的插值求積公式有可能會變得不穩定:詳細原因不贅述。
牛頓-科特斯公式解決這一問題的辦法是將大的插值區間分為一堆小的插值區間,使得多項式的次數不會太高。然後通過引入引數函式
將帶有冪的項的取值範圍固定在乙個固定範圍內,這樣一來就將多項式帶有冪的部分的求程式設計客棧積變為乙個固定的常數,只需手工算出來即可。這個常數可以直接帶入多項式求積函式。
上式中x的求積分區間為[a, b],h = (b - a)/n, 這樣一來積分區間變為[0, n],需要注意的是從這個公式可以看出乙個大的區間被分為n個等長的小區間。 這一部分具體請參見任意一本有關數值計算的書!
n是乙個事先確定好的值。
又因為乙個大的插值區間需要被分為等長的多個小區間,並在這些小區間上分別進行插值和積分,因此此時的牛頓-科特斯公式被稱為:復化牛頓-科特斯公式。
並且對於n的不同取值牛頓-科特斯有不同的名稱: 當n=1時,叫做復化梯形公式,復化梯形公式也就是將每乙個小區間都看為乙個梯形(高為h,上底為f(t), 下底為f(t+1))。這與積分的本質:無限分隔 相同。
當n=2時,復化牛頓-科特斯公式被稱為復化辛普森公式(非美國法律界著名的那個辛普森)。
我這篇文章實現的是復化梯形公式:
首先寫乙個函式求節點函式值求和那部分:
"""@brief: 求和 ∑f(xk) : xk表示等距節點的第k個節點,不包括端點
xk = a + kh (k = 0, 1, 2, ...)
程式設計客棧積分區間為[a, b]
@param: xk 積分區間的等分點x座標集合(不包括端點)
@param: func 求積函式
@return: 返回值為集合的和
"""def sum_fun_xk(xk, func):
return sum([func(each) for each in xk])
然後就可以寫整個求積分函式了程式設計客棧:
"""@brief: 求func積分 :
@param: a 積分區間左端點
@param: b 積分區間右端點
@param: n 積分分為n等份(復化梯形求積分要求)
@param: func 求積函式
@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))
相當的簡單
試驗:當把大區間分為兩個小區間時:
分為20個小區間時:
求的積分值就是這些彩色的梯形面積之和。
測試**:
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是指將每乙個具體的插值區間(也就是小區間)等距插n個節點,復化梯形公式的n是固定的為1.
而**中的n指將大區間分為n個小區間。
本文標題: 復化梯形求積分例項——用python進行數值計算
本文位址: /jiaoben/python/287470.html
數值分析 微分求積 復化梯形 復化辛浦生
本科課程參見 軟體學院那些課 將積分區間 a,b 劃分n等分,步長 然後將它們累加求和,作為所求積分i的近似值.記 式為復化梯形求積公式,下標n表示將區間n等分。將積分區間 a,b 劃分n等分,記子區間 其中記 式為復化辛普森求積公式。分別用復化梯形公式和復化辛浦生公式計算定積分 取n 2,4,8,...
復化積分公式
對於積分 只要找到被積公式的原函式f x 利用牛頓萊普利茲公式有 但是,實際使用這種求積分的方法往往是有困難的,因為大量的被積函式的原函式是不能用初等函式表示的 另外,當f x 是由測量或數值計算給出的一張資料表時,牛頓萊普利茲公式也無法直接運用,因此有必要研究積分的數值計算問題。對於一些理論的推導...
C語言基礎 利用復合梯形求積公式計算定積分
這是數值分析中一種求解定積分的近似方法。適用於被積函式的原函式不能用初等函式表示的情況。將被積函式 f x 與x軸圍成的區域分成n個梯形,把n個梯形面積求和得到積分的近似值。若精度不滿足需要,則可以將每個區間再等分一次,得到2n 1個等分區間,然後再求和,直到精度滿足需要。ab f x dx h 2...