我有一个100个数字的列表作为Y轴的高度,并且作为X轴的长度:1到100,恒定步长为5.我需要计算它所包含的面积(x的曲线) ,y)点和X轴,使用矩形和Scipy。我是否必须找到此曲线的功能?或不? ...我读过的几乎所有例子都是关于Y轴的特定方程。就我而言,没有等式,只有列表中的数据。经典的解决方案是通过X步距离添加Y点和倍数...使用Scipy任何想法?
请使用Scipy和Numpy推荐任何专注于数值(有限初等)方法的书吗? ...
答案 0 :(得分:55)
numpy和scipy库包括复合梯形(numpy.trapz)和Simpson(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
答案 1 :(得分:17)
您可以使用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)
答案 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'数组,只需确保它升序,否则结果将不正确