计算数学函数下方的面积
我有一组数据,我用Python里的二次多项式(也就是最高次数是2的多项式)来近似这些数据。我想计算这个多项式在0到1之间的面积。
请问有没有什么数学工具,或者numpy里类似的包可以用,还是说我应该自己写个简单的函数来计算这些函数的积分呢?
我对怎么定义数学函数还不是很清楚,想请教一下最好的方法是什么。
谢谢。
5 个回答
3
对于你的特殊情况,使用通用的数值积分算法可能有点过头了……如果你仔细算一下代数,就会发现有一个简单的公式可以直接给你面积。
你有一个二次多项式:f(x) = ax2 + bx + c
你想找出在[0,1]这个范围内曲线下的面积。
它的反导数是F(x) = ax3/3 + bx2/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
>>>
我们的保证:适用于任何正次数的多项式,否则退款!
来自我们研究实验室的更新:保证延长;把“正”改成“非负”了 :-)
更新 这是一个工业级的版本,能够应对系数中出现的杂乱整数,而且在循环中没有函数调用,也没有在设置中使用 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
>>>
9
如果你只是想对多项式进行积分,那就不需要表示一个一般的数学函数,可以使用 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
。不过在这种情况下,听起来你并不需要这两者,尤其是后者。