在给定一组坐标的情况下计算曲线下面积,而不知道函数

时间:2012-11-10 07:42:32

标签: python numpy scipy area

我有一个100个数字的列表作为Y轴的高度,并且作为X轴的长度:1到100,恒定步长为5.我需要计算它所包含的面积(x的曲线) ,y)点和X轴,使用矩形和Scipy。我是否必须找到此曲线的功能?或不? ...我读过的几乎所有例子都是关于Y轴的特定方程。就我而言,没有等式,只有列表中的数据。经典的解决方案是通过X步距离添加Y点和倍数...使用Scipy任何想法?

请使用Scipy和Numpy推荐任何专注于数值(有限初等)方法的书吗? ...

3 个答案:

答案 0 :(得分:55)

numpy和scipy库包括复合梯形(numpy.trapz)和Simpson(scipy.integrate.simps)规则。

这是一个简单的例子。在trapzsimps中,参数dx=5表示沿x轴的数据间距为5个单位。

from __future__ import print_function

import numpy as np
from scipy.integrate import simps
from numpy import trapz


# The y values.  A numpy array is used here,
# but a python list could also be used.
y = np.array([5, 20, 4, 18, 19, 18, 7, 4])

# Compute the area using the composite trapezoidal rule.
area = trapz(y, dx=5)
print("area =", area)

# Compute the area using the composite Simpson's rule.
area = simps(y, dx=5)
print("area =", area)

输出:

area = 452.5
area = 460.0

答案 1 :(得分:17)

您可以使用Simpsons ruleTrapezium rule计算图表下的区域,并定期给出y值表格。

计算辛普森一家规则的Python脚本:

def integrate(y_vals, h):
    i = 1
    total = y_vals[0] + y_vals[-1]
    for y in y_vals[1:-1]:
        if i % 2 == 0:
            total += 2 * y
        else:
            total += 4 * y
        i += 1
    return total * (h / 3.0)

h是y值之间的偏移(或间隙),而y_vals是一个井,y值的数组。

示例(与上述功能相同的文件):

y_values = [13, 45.3, 12, 1, 476, 0]
interval = 1.2
area = integrate(y_values, interval)
print("The area is", area)

答案 2 :(得分:3)

如果您错失了sklearn,那么一个简单的替代方法是使用sklearn.metrics.auc

这将根据给定的x和y数组使用梯形规则计算曲线下的面积

import numpy as np
from sklearn.metrics import auc

dx = 5
xx = np.arange(1,100,dx)
yy = np.arange(1,100,dx)

print('computed AUC using sklearn.metrics.auc: {}'.format(auc(xx,yy)))
print('computed AUC using np.trapz: {}'.format(np.trapz(yy, dx = dx)))

两者都输出相同的区域:4607.5

sklearn.metrics.auc的优点是它可以接受任意间隔的'x'数组,只需确保它升序,否则结果将不正确