我有一个由100个数字组成的列表,用作Y轴的高度,并且在X轴上使用长度1到100,步长为5。我需要使用矩形和Scipy计算曲线(x,y)点与X轴之间所包含的面积。我是否需要找到这条曲线的函数?还是不需要?...几乎所有我读过的例子都关于Y轴的特定方程式。在我的情况下,没有方程式,只有来自列表的数据。经典的解决方法是将Y点添加起来,然后乘以X距离的步长...使用Scipy有什么想法?
请问有人可以推荐一本重点关注使用Scipy和Numpy进行数值(有限元素)方法的书籍吗?...
trapz
和simpson
中,参数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
如果您已安装了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'数组,只需确保它是升序的,否则结果将不正确。
如果给定一个在固定间隔上的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)
h
是每个步骤之间的间隔。y_vals
可以是任何可以在 for
循环中迭代的东西。我只是总是使用数组,因为它们很容易使用。 - Will Richardson
trapz
和simps
函数的第一件事是将y
参数转换为numpy数组,因此这并不重要。您可以查看生成y
值的代码,看看是否可以从使用其他numpy或scipy函数中受益。如果是这样,当您将其传递给simps
时,y
已经是一个数组了。 - Warren Weckesser