使用NumPy获取2D Gauss-Legendre求积点和权重

cfh9epnr  于 12个月前  发布在  其他
关注(0)|答案(1)|浏览(121)

NumPy提供np.polynomial.legendre.leggauss()函数来计算高斯-勒让德积分的采样点和权重。我试图使用这个函数来获得一个四边形的2D点和权重。我可以使用如下所示的函数:

def gauss2D(n):
    x, w = np.polynomial.legendre.leggauss(n)

    weights = []
    gauss_pts = []

    for i in range(n):
        for j in range(n):
            wts = w[i] * w[j]
            weights.append(wts)

            g = [x[i], x[j]]
            gauss_pts.append(g)

    return np.array(weights), np.array(gauss_pts)

它为n=2集成点输出以下内容:

weights
 [1. 1. 1. 1.]

points
 [[-0.57735027 -0.57735027]
 [-0.57735027  0.57735027]
 [ 0.57735027 -0.57735027]
 [ 0.57735027  0.57735027]]

如果可能的话,我想通过使用NumPy数组来摆脱for循环,但我的尝试(参见下面的函数)并没有生成正确的结果。

def gauss2Dnumpy(n):
    x, w = np.polynomial.legendre.leggauss(n)

    weights = np.concatenate((w, w))

    gauss_pts = np.zeros((n*2, n))

    for i in range(n*2):
        for j in range(n):
            gauss_pts[i] = x[j], x[j]

    return weights, gauss_pts

有没有一种方法可以在不使用for循环的情况下实现这一点?

xe55xuns

xe55xuns1#

这将是:

x, w = np.polynomial.legendre.leggauss(n)

gauss_pts = np.array(np.meshgrid(x,x,indexing='ij')).reshape(2,-1).T
weights = (w*w[:,None]).ravel()

相关问题