我有一系列数据,我使用 Python 中的 2 次多项式进行了近似计算。我想计算0到1之间这个多项式下面的面积。
是否有我可以使用的微积分或类似的 numpy 包,或者我应该只制作一个简单的函数来集成这些函数?
我有点不清楚定义数学函数的最佳方法是什么。
谢谢。
我有一系列数据,我使用 Python 中的 2 次多项式进行了近似计算。我想计算0到1之间这个多项式下面的面积。
是否有我可以使用的微积分或类似的 numpy 包,或者我应该只制作一个简单的函数来集成这些函数?
我有点不清楚定义数学函数的最佳方法是什么。
谢谢。
如果您只对多项式进行积分,则无需表示通用数学函数 use 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
. 在这种情况下,这听起来不像你想要的,尤其是后者。
看,妈,没有进口!
>>> 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
>>>
为您的特殊情况求助于通用数值积分算法可能有点矫枉过正......如果您计算出代数,那么有一个简单的表达式可以为您提供该区域。
你有一个 2 次多项式:f(x) = ax 2 + bx + c
您想在[0,1]范围内找到x曲线下的面积。
反导数 F(x) = ax 3 /3 + bx 2 /2 + cx + C
从 0 到 1 的曲线下面积为:F(1) - F(0) = a/3 + b/2 + c
因此,如果您只计算区间[0,1]的面积,您可能会考虑使用这个简单的表达式,而不是求助于通用方法。
scipy.integrate 中的“ quad ”是在一定区间内对单个变量的函数进行积分的通用方法。在一个简单的情况下(例如您的问题中描述的那个),您分别传入您的函数以及下限和上限。'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”的多项式。我上面的 scriptlet 也可以接受这种形式的多项式:
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
使用辛普森规则计算 的值integrand
。您可以自己验证该方法是否像宣传的那样有效。
当然,我没有简化 for 的表达式integrand
来表明0
and1
可以替换为任意值u
and v
,并且代码仍然可以用于查找函数 from u
to的积分v
。