不收敛势的多极展开计算

计算科学 Python 浮点 近似
2021-12-02 03:11:31

根据Beatson 和 Greengard 关于 FMM 的短期课程:(等式 5.15 和 5.16 设置 k=1,q=1)

我们可以近似一个潜在的ϕ=1/(rR)使用:

1|rR|=n=0rnRn+14π(2n+1)m=nnYnm(θ,ϕ)Ylm(θ,ϕ)

我在Python中试过这个,错误是这样的:

|ϕ(P)n=0pm=nn()|1Rr(rR)p+1

def potential_expansion( p,
                         r1, theta1, phi1, 
                         r2, theta2, phi2 ):
    """
    Return inverse r potential expansion upto the pth term.

    Input
    ======
    p - terms in the expansion to return
    r1, theta1, phi1 - position vector components for r
    r2, theta2, phi2 - position vector components for R

    """
    coefficients = np.zeros( (p+1, p+1), complex )
    for n in xrange(p+1):
        for m in xrange(-n, n+1):
            coefficient = sph_harm( m, n, theta1, phi1 )*sph_harm( -m, n, theta2, phi2)
            coefficients[n][m] = 4*pi/(2*n+1)*(r2/r1)**n/r1*coefficient
    return coefficients.sum().real

使用这种方法我得到错误的结果,举一个简单的例子

p = 5

r1 = 100.
theta1 = 0.
phi1 = 0.

r2 = 1. 
theta2 = pi/2.
phi2 = 0.

cosgamma = cos(theta1)*cos(theta2)+sin(theta1)*sin(theta2)*cos(phi1-phi2)
potential = 1/root( r1**2 + r2**2 - 2*r1*r2*cosgamma)
print "Direct calculation: %s" % potential

approx_potential = potential_expansion(p, r1, theta1, phi1, r2, theta2, phi2)
print "Approximation: %s" % approx_potential
print
print "Error: %s" % np.abs((approx_potential - potential))
print "Upper bound on error: %s" % (1/(r1-r2)*(r2/r1)**(p+1))

这会输出完全错误的结果:

Approximation:0.010101010101
Direct calculation:0.0099995000375
Error:0.000101510063503
Upper bound on error:1.0101010101e-14

我是否应该调查这是否是浮点错误?如果是这样,我该怎么做?

2个回答

为了给尽可能多的人带来不便,很久以前,数学家和物理学家决定使用两种不同的约定θ或者ϕ是纬度角。格林加德的笔记使用了物理学家的惯例:θ是纬度和ϕ是经度,而 Scipy 使用θ对于经度和ϕ对于纬度,因此切换参数的顺序thetaphi修复您的代码。

只是一个小评论:求和的顺序也可能导致分歧。我在学校学过总是把系数从小到大求和。线路如何

return coefficients.sum().real

总结一下,没有具体说明。你可以考虑一下。