给定一组坐标,不知道函数,如何计算曲线下面积?

83

我有一个由100个数字组成的列表,用作Y轴的高度,并且在X轴上使用长度1到100,步长为5。我需要使用矩形和Scipy计算曲线(x,y)点与X轴之间所包含的面积。我是否需要找到这条曲线的函数?还是不需要?...几乎所有我读过的例子都关于Y轴的特定方程式。在我的情况下,没有方程式,只有来自列表的数据。经典的解决方法是将Y点添加起来,然后乘以X距离的步长...使用Scipy有什么想法?

请问有人可以推荐一本重点关注使用Scipy和Numpy进行数值(有限元素)方法的书籍吗?...

3个回答

95
numpy和scipy库包括复合梯形(numpy.trapz)和辛普森(scipy.integrate.simpson)规则。
这里有一个简单的例子。在trapzsimpson中,参数dx=5表示沿x轴的数据间距为5个单位。
import numpy as np
from scipy.integrate import simpson
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 = simpson(y, dx=5)
print("area =", area)

输出:

area = 452.5
area = 460.0

太好了!两个答案都帮助我理解和解决了我遇到的问题。 我想问一个相关的问题...你推荐使用数组而不是列表吗?这对用户有帮助吗?还是对算法的逻辑和速度有帮助? - user1640255
1
trapzsimps函数的第一件事是将y参数转换为numpy数组,因此这并不重要。您可以查看生成y值的代码,看看是否可以从使用其他numpy或scipy函数中受益。如果是这样,当您将其传递给simps时,y已经是一个数组了。 - Warren Weckesser
3
这两种方法中哪一种更准确? - Farid Alijani
两者都是准确的。 - vashista

28

如果您已安装了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'数组,只需确保它是升序的,否则结果将不正确。


24

如果给定一个在固定间隔上的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)

我不确定...找到一条直线的方程可能会非常棘手,特别是如果你不知道它是什么类型的曲线(指数、抛物线等)。 - Will Richardson
谢谢你...我非常感激你的帮助...只有y_vals是数组吗?还是我的Y数据列表(H[i])?使用数组更好,而不是列表吗?您建议将我的列表更改为数组吗?关于h,“h是y值之间的x间隔”?..在维基示例中提到:“f =函数,a =初始值,b =结束值,n =大小为h的间隔数,n必须是偶数”h = float(b-a)/ n..这个h是一样的吗?所以是每个步骤之间的距离? - user1640255
是的,h 是每个步骤之间的间隔。y_vals 可以是任何可以在 for 循环中迭代的东西。我只是总是使用数组,因为它们很容易使用。 - Will Richardson
那么 y_vals 可以是在算法的前面定义的列表或数组吗?在我的情况下,该列表被定义为 H...我是否需要为 def integrate 插入一个 for 循环? - user1640255
3
如果数据不是等间隔的,会怎样呢? - CMCDragonkai
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接