numpy 从python到julia编写离散点上的2D积分

nxowjjhe  于 2023-03-23  发布在  Python
关注(0)|答案(1)|浏览(129)

我正在将我所有用python编写的代码切换到julia中以减少计算时间。为此,我需要将以下代码从python翻译到Julia中,但由于我对Julia仍然是新手,因此在重新发明轮子之前,我不确定当前的功能是什么。
Python代码:

def calculate_2d_probability_over_volume(internal_matrix, px, py):
    px = px[px >= 0]
    py = py[py >= 0]

    integrated_px = [np.trapz(px * row, px) for row in internal_matrix]  # \int p_x * f(p_x, p_y) dp_x

    return 2 / (2 * np.pi ** 2) * np.trapz(integrated_px[::-1], py)  # \int integrated_px(p_y) dp_y

在前两行中,我确保px和py只有正值,它们都是前两行之后维度为N的Numpy数组。矩阵是NxN矩阵,它与pxpy值相关如下:
假设矩阵的值由函数f(px,py)定义:

  • 每行是一个py值
  • 每列是一个px值
  • 矩阵的左下值对应于f(min(px),min(py)),矩阵的右上值对应于f(max(px),max(py))

px,py按升序排列,所以min(px)==px[0]
如果矩阵由二维函数f(px,py)表示,则要计算的积分由下式给出:

b * ∫dpy∫dpx px * f(px,py)

其中B是不需要进一步解释的因子。
该算法使用numpy的向量化来快速评估它。我现在需要在Julia的生态系统中重新实现该算法。是否有类似于np.trapz()的函数?我希望该函数已经带有错误估计。
编辑:修复了行和列规范中的排印错误

xytpbqjk

xytpbqjk1#

这不是一个完整的答案,但也许可以作为一个起点。定义:

trapz(y) = @views sum((y[1:end-1].+y[2:end])/2)

trapz(y,x) = @views sum(((y[1:end-1].+y[2:end])/2).*(x[2:end].-x[1:end-1]))

给出与此函数的NumPy版本相同的结果:

julia> trapz([1.0,2.0,4.0])
4.5

julia> trapz([1.0, 2.0],[0.0,0.1])
0.15000000000000002

相关问题