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

use*_*255 43 python numpy area scipy

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

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

War*_*ser 57

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)
Run Code Online (Sandbox Code Playgroud)

输出:

area = 452.5
area = 460.0
Run Code Online (Sandbox Code Playgroud)

  • 这两种方法哪一种更准确呢? (3认同)

Wil*_*son 18

您可以使用" 辛普森一家"规则或" 梯形"规则来计算图表下的区域,该图表给定了一个定期间隔的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)
Run Code Online (Sandbox Code Playgroud)

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)
Run Code Online (Sandbox Code Playgroud)

  • 如果数据间隔不均匀怎么办? (2认同)

khu*_*834 7

如果您错失了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)))
Run Code Online (Sandbox Code Playgroud)

两者输出的面积相同:4607.5

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