在给定一组坐标的情况下计算曲线下的面积,而不知道函数
Posted
技术标签:
【中文标题】在给定一组坐标的情况下计算曲线下的面积,而不知道函数【英文标题】: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 专注于数值(有限基本)方法的书吗? ...
【问题讨论】:
【参考方案1】:numpy 和 scipy 库包括复合梯形 (numpy.trapz) 和辛普森 (scipy.integrate.simps) 规则。
这是一个简单的例子。在trapz
和simps
中,参数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
【讨论】:
太棒了! ...这两个答案都帮助我理解和解决我遇到的任何问题。我想问一些相关的事情......你建议使用数组而不是列表吗?对用户有帮助吗?还是算法的逻辑和速度?trapz
和 simps
函数所做的第一件事是将 y
参数转换为 numpy 数组,所以这并不重要。您可能会查看生成 y
值的代码,看看这是否会受益于使用额外的 numpy 或 scipy 函数。如果是这样,当您将 y
传递给 simps
时,它已经是一个数组。
这两种方法哪一种更准确?【参考方案2】:
您可以使用Simpsons rule 或Trapezium 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' 数组,只要确保它是升序的,否则结果会不正确
【讨论】:
以上是关于在给定一组坐标的情况下计算曲线下的面积,而不知道函数的主要内容,如果未能解决你的问题,请参考以下文章