我在Python中使用2次多项式逼近了一组数据,现在希望计算该多项式在0到1之间的面积。
请问,numpy是否提供类似微积分的包来解决这个问题?或者我应该编写一个简单的函数来进行积分计算呢?
对于定义数学函数的最佳方法我还有些不清楚。
谢谢。
我在Python中使用2次多项式逼近了一组数据,现在希望计算该多项式在0到1之间的面积。
请问,numpy是否提供类似微积分的包来解决这个问题?或者我应该编写一个简单的函数来进行积分计算呢?
对于定义数学函数的最佳方法我还有些不清楚。
谢谢。
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
。但在这种情况下,似乎您不需要这两者,尤其是后者。
Look, Ma, no imports!
>>> coeffs = [2., 4., 6.]
>>> sum(coeff / (i+1) for i, coeff in enumerate(reversed(coeffs)))
8.6666666666666661
>>>
>>> icoeffs = [2, 4, 6]
>>> tot = 0.0
>>> divisor = float(len(icoeffs))
>>> for coeff in icoeffs:
... tot += coeff / divisor
... divisor -= 1.0
...
>>> tot
8.6666666666666661
>>>
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)
import numpy as NP
px = NP.poly1d([2,4,6])
aoc, err = TG.quad(px, 0, 1)
# returns (8.6666666666666661, 9.6219328800846896e-14)
如果一开始就要集成二次或三次多项式,除了推导显式积分表达式之外,另一种选择是使用辛普森法则;这是一个深刻的事实,该方法可以精确地集成3次及以下次数的多项式。
借用Mike Graham的例子(我已经有一段时间没有使用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
使用辛普森法则计算被积函数
的值。您可以自行验证该方法是否按照广告所述有效。
当然,我没有简化被积函数
的表达式,以表明0
和1
可以替换为任意值u
和v
,并且该代码仍将用于查找从u
到v
的函数的积分。