2010-02-28 78 views
4

我有一系列數據,我使用Python中的2次多項式進行了近似。我想計算0到1之間的這個多項式下面的區域。計算數學函數下面的面積

是否有微積分或類似的numpy包,我可以使用,還是我應該做一個簡單的函數來集成這些函數?

我有點不清楚定義數學函數的最佳方法是什麼。

謝謝。

+2

如果它是一個2次多項式,只需手工整合即可 - 無需使用代碼。 – 2010-02-28 21:15:56

+0

它適用於大量的多項式,我可以批量處理40個。 – djq 2010-02-28 21:22:26

+0

度數爲2的多項式曲線下的面積是一個度數爲1的多項式。只需將值插入此方程即可。 – 2010-02-28 21:52:10

回答

8

如果您僅合併多項式,則不需要表示一般數學函數,請使用numpy.poly1d,該函數具有用於積分的integ方法。

>>> import numpy 
>>> p = numpy.poly1d([2, 4, 6]) 
>>> print p 
    2 
2 x + 4 x + 6 
>>> i = p.integ() 
>>> i 
poly1d([ 0.66666667, 2.  , 6.  , 0.  ]) 
>>> integrand = i(1) - i(0) # Use call notation to evaluate a poly1d 
>>> integrand 
8.6666666666666661 

對於集成任意數值函數,您可以使用scipy.integrate和普通的Python函數來實現函數。爲了以分析方式集成功能,您可以使用sympy。在這種情況下聽起來並不像你想要的那樣,特別是不是後者。

+0

太好了 - 謝謝!這非常有用。所以爲了計算從0到1的面積,我可以使用:Area = i(1) - i(0)? – djq 2010-02-28 20:38:06

+1

這將是從0到1的定積分。在這種情況下,這與面積相同,但在某些情況下(部分或全部多項式爲負),它不是。 – 2010-02-28 20:40:15

1

'quad'in scipy.integrate是在一定的時間間隔內集成單個變量函數的通用方法。在一個簡單的情況下(例如你的問題中描述的情況),你分別傳遞你的函數和下限和上限。 'quad'返回一個由積分結果和誤差項上限組成的元組。

from scipy import integrate as TG 

fnx = lambda x: 3*x**2 + 9*x # some polynomial of degree two 
aoc, err = TG.quad(fnx, 0, 1) 

[注:後,我張貼了這個我在我之前發佈了一個答案,並在numpy的使用「poly1d」代表多項式。以上只是我的小腳本也可以接受這種形式的多項式:

import numpy as NP 

px = NP.poly1d([2,4,6]) 
aoc, err = TG.quad(px, 0, 1) 
# returns (8.6666666666666661, 9.6219328800846896e-14) 
+0

由於多項式可以被平分地分析,所以最好使用更高效的「整數」方法,而不是重複高斯求積。 – 2010-02-28 21:34:59

4

這可能是矯枉過正訴諸通用數值積分算法爲您的特殊情況......如果你的工作代數,有一個簡單的表達,給你的區域。

你必須度2的多項式:F(X)= AX + BX + C

你想找到在範圍X [0的曲線下的面積,1]

的原函數F(X)= AX /3 + BX /2 + CX + C

曲線下從0到1的區域是:F(1) - F(0)= A/3 + b/2 + C

因此,如果你只計算區域的間隔[0,1]中,可以使用這種簡單的表達式考慮 而不是訴諸通用的方法。

5

看,馬,沒有進口!

>>> coeffs = [2., 4., 6.] 
>>> sum(coeff/(i+1) for i, coeff in enumerate(reversed(coeffs))) 
8.6666666666666661 
>>> 

我們保證:適用於任何積極程度的多項式或您的退款!

我們研究實驗室的更新:保證延長; S /正面/非負/ :-)

更新這裏的工業強度的版本,是在流浪係數整數面對強勁,而無需在循環函數調用,並且既不使用也不enumerate()reversed()在設置:

>>> icoeffs = [2, 4, 6] 
>>> tot = 0.0 
>>> divisor = float(len(icoeffs)) 
>>> for coeff in icoeffs: 
...  tot += coeff/divisor 
...  divisor -= 1.0 
... 
>>> tot 
8.6666666666666661 
>>> 
+0

+1,良好的解決方案(幾乎與'integ'實現的一樣,我敢肯定)。如果我不在'__future__ import division'中的文件中,我會讓分母'float(i + 1)'。 – 2010-02-28 23:22:46

1

如果一個人從整合的二次或三次多項式得到去,以獲得明確的積分表達式的替代方法是使用辛普森的規則;這個方法正好積分3級和更低的多項式是一個深刻的事實。

借用邁克·格雷厄姆的例子(我沒有在使用了一段時間的Python;道歉,如果代碼看起來靠不住):

>>> import numpy 
>>> p = numpy.poly1d([2, 4, 6]) 
>>> print p 
    2 
2 x + 4 x + 6 
>>> integrand = (1 - 0)(p(0) + 4*p((0 + 1)/2) + p(1))/6 

使用辛普森法則來計算的integrand值。您可以自己驗證該方法是否如所宣傳的那樣工作。

當然,我並沒有簡化表達式integrand,表明01可以用任意值uv被替換,並且代碼仍將查找功能從u積分來v工作。

+0

多好的回答!辛普森的規則,從微積分嘗試和真實的。非常優雅,不管Python的技巧。 – 2011-12-28 08:23:03