在两点之间对 python 中的曲线进行积分
Integrating a curve in python between two points
我需要对使用数据点创建的曲线进行积分,因为我想找到特定区域中的值。所以,我只想在两点之间整合它。 scipy.trapz 不采用端点。 scipy.integrate 不允许我这样做,因为我的 x 轴不像 linspace(a, b, n) 那样简单。有什么办法我仍然可以在两点之间进行整合?定义这两点之间的间隔的蛮力方法将不起作用,因为我的函数是通过在范围内插值创建的。
为了更清楚,我的函数是通量 sed,我的 x 轴是波长。在我的积分中,我会将波长转换为频率,但我不确定如何在极限下进行积分。
非常感谢!
所以如果我理解正确的话,你有一个一定长度的数组,我们称它为 y_array
,并且你想找到相对于另一个数组的给定端点的区域,我们称其为 x_array
.我将使用一个简单的函数来显示 x**2
从 0 到 1 的积分
import numpy as np
import matplotlib.pyplot as plt
x_array = np.linspace(0,2,201)
y_array = x_array**2
plt.plot(x_array, y_array)
plt.show()
如果您要从 0 到 1 手动计算此积分,您会期望接近 0.333...
我们可以为此使用 np.trapz(...)
,但首先我们需要在 x_array
中找到我们要使用的索引,以及提供 Numpy 梯形规则的步长。
print(x_array[0], x_array[100])
# Gives 0.0, and 1.0
dx = (x_array[100]-x_array[0])/len(x_array[0:100])
# Gives the slices dx between these bounds
print(dx)
# Gives 0.01
现在我们插入这个
area = np.trapz(y_array[0:100], dx = dx)
print(area)
# Gives 0.3234494... (~2% relative error)
这给出了这些边界内曲线下的近似面积。当然这不是最准确的,但我相信你可以用 SciPy 的辛普森法则做类似的事情。
我想这就是您想要做的,希望对您有所帮助。
我需要对使用数据点创建的曲线进行积分,因为我想找到特定区域中的值。所以,我只想在两点之间整合它。 scipy.trapz 不采用端点。 scipy.integrate 不允许我这样做,因为我的 x 轴不像 linspace(a, b, n) 那样简单。有什么办法我仍然可以在两点之间进行整合?定义这两点之间的间隔的蛮力方法将不起作用,因为我的函数是通过在范围内插值创建的。
为了更清楚,我的函数是通量 sed,我的 x 轴是波长。在我的积分中,我会将波长转换为频率,但我不确定如何在极限下进行积分。
非常感谢!
所以如果我理解正确的话,你有一个一定长度的数组,我们称它为 y_array
,并且你想找到相对于另一个数组的给定端点的区域,我们称其为 x_array
.我将使用一个简单的函数来显示 x**2
import numpy as np
import matplotlib.pyplot as plt
x_array = np.linspace(0,2,201)
y_array = x_array**2
plt.plot(x_array, y_array)
plt.show()
如果您要从 0 到 1 手动计算此积分,您会期望接近 0.333...
我们可以为此使用 np.trapz(...)
,但首先我们需要在 x_array
中找到我们要使用的索引,以及提供 Numpy 梯形规则的步长。
print(x_array[0], x_array[100])
# Gives 0.0, and 1.0
dx = (x_array[100]-x_array[0])/len(x_array[0:100])
# Gives the slices dx between these bounds
print(dx)
# Gives 0.01
现在我们插入这个
area = np.trapz(y_array[0:100], dx = dx)
print(area)
# Gives 0.3234494... (~2% relative error)
这给出了这些边界内曲线下的近似面积。当然这不是最准确的,但我相信你可以用 SciPy 的辛普森法则做类似的事情。
我想这就是您想要做的,希望对您有所帮助。