我编写了一个函数,该函数使用跨x值的已定义仓进行数值积分。换句话说,它使用梯形规则,以箱的大小作为梯形的底。对于大多数纸槽尺寸,它返回的值不正确。
该函数接收x数组,y数组,最小x值,最大x值和bin大小。对于非常小的bin大小(<.0001),该函数实际上给出了正确的整数值,但对于几乎其他所有值,该值都是不正确的。例如,如果您手动将梯形规则用于y = x ^ 2从-2到1且bin大小为1,则应该得到3.5。我需要此功能才能适用于所有纸槽尺寸。
def integrate_bins(f_X, f_Y, bound_min, bound_max, binSize):
# get bound indices (ASSUMES SORTED)
bound_lower_idx = f_X.searchsorted(bound_min, 'left')
bound_upper_idx = f_X.searchsorted(bound_max, 'right')
# trim arrays
f_X = f_X [ bound_lower_idx : bound_upper_idx ]
f_Y = f_Y [ bound_lower_idx : bound_upper_idx ]
if np.amin(f_X) > bound_min:
bound_min = np.amin(f_X)
if np.amax(f_X) < bound_max:
bound_max = np.amax(f_X)
# interpolate along binSize
f_X_new = [i * binSize + bound_min for i in range(0, int((bound_max - bound_min)/binSize))]
f_Y_new = [np.interp(x, f_X, f_Y) for x in f_X_new]
# integrate
return np.trapz(f_Y_new, f_X_new)
#### test case
testx = np.arange(-3,4,.25)
testy = testx**2
print(integrate_bins(testx, testy, -2,1,1))
对于此示例,此测试用例的输出为3.0,而应为3.5。错误量也会根据测试用例中的分档大小和代数函数而变化。