【问题标题】:Calculating the area under a curve given a set of coordinates, without knowing the function在给定一组坐标的情况下计算曲线下的面积,而不知道函数
【发布时间】:2012-10-30 11:49:04
【问题描述】:

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

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

【问题讨论】:

    标签: python numpy scipy area


    【解决方案1】:

    numpy 和 scipy 库包括复合梯形 (numpy.trapz) 和辛普森 (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
    

    【讨论】:

    • 太棒了! ...这两个答案都帮助我理解和解决我遇到的任何问题。我想问一些相关的事情......你建议使用数组而不是列表吗?对用户有帮助吗?还是算法的逻辑和速度?
    • trapzsimps 函数所做的第一件事是将 y 参数转换为 numpy 数组,所以这并不重要。您可能会查看生成 y 值的代码,看看这是否会受益于使用额外的 numpy 或 scipy 函数。如果是这样,当您将 y 传递给 simps 时,它已经是一个数组。
    • 这两种方法哪一种更准确?
    【解决方案2】:

    您可以使用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)
    

    【讨论】:

    • 我不确定.. 找到一条线的方程可能真的很棘手,尤其是如果你不知道它的曲线类型(指数、抛物线等)
    • 谢谢...非常感谢您的帮助...只是 y_vals 是数组?还是我的 Y 数据列表 (H[i]) ?使用数组而不是列表更好吗?是否建议将我的列表更改为数组?关于 h,“h 是 y 值之间的 x 间隔”? ..对此没什么帮助...在wiki示例上说:“”“f =函数,a =初始值,b =结束值,n =大小为h的间隔数,n必须是偶数“”” h = float(b - a) / n .. 是一样的吗?那么每一步之间的距离是多少?
    • 是的,h 是每一步之间的间隔。 y_vals 可以是任何可以在 for 循环中迭代的东西。我总是使用数组,因为它们易于使用。
    • ... 所以 y_vals 可以是算法前面部分定义的列表或数组?在我的情况下,列表被定义为 H.... 我是否必须为 def 集成插入一个 for 循环?
    • 如果数据不等间距怎么办?
    【解决方案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' 数组,只要确保它是升序的,否则结果会不正确

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-06-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-06-28
      • 2021-10-24
      相关资源
      最近更新 更多