4

我有一系列数据,我使用 Python 中的 2 次多项式进行了近似计算。我想计算0到1之间这个多项式下面的面积。

是否有我可以使用的微积分或类似的 numpy 包,或者我应该只制作一个简单的函数来集成这些函数?

我有点不清楚定义数学函数的最佳方法是什么。

谢谢。

4

5 回答 5

9

如果您只对多项式进行积分,则无需表示通用数学函数 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. 在这种情况下,这听起来不像你想要的,尤其是后者。

于 2010-02-28T20:25:47.010 回答
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
>>>
于 2010-02-28T22:38:37.283 回答
3

为您的特殊情况求助于通用数值积分算法可能有点矫枉过正......如果您计算出代数,那么有一个简单的表达式可以为您提供该区域。

你有一个 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]的面积,您可能会考虑使用这个简单的表达式,而不是求助于通用方法。

于 2010-02-28T22:08:05.150 回答
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)
于 2010-02-28T20:59:22.847 回答
1

如果从一开始就对二次或三次多项式进行积分,则导出显式积分表达式的另一种方法是使用辛普森规则;一个深刻的事实是,这种方法精确地集成了 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来表明0and1可以替换为任意值uand v,并且代码仍然可以用于查找函数 from uto的积分v

于 2010-12-15T10:25:01.270 回答