使用定义的梯形箱进行数值积分

时间:2019-07-11 18:22:19

标签: python numpy numerical-integration

我编写了一个函数,该函数使用跨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。错误量也会根据测试用例中的分档大小和代数函数而变化。

0 个答案:

没有答案