是否有可能以某种方式获取这个积分?

问题描述 投票:0回答:1

我有以下代码,但显示错误:
IntegrationWarning:已达到最大细分数 (50)。 如果增加限制没有改善,建议分析 被积函数以确定困难。如果一个位置 局部难度可以通过意志来确定(奇异性、不连续性) 可能会从分割时间间隔并调用积分器中获益 在子范围上。也许应该使用专用积分器。 potC=sc.integrate.quad(lambda r: Psi(r,n2)*(-1/r)Psi(r,n1)(r**2),0,np.inf)

如何解决?

import scipy as sc
import numpy as np

def Psi(r,n):
    return 2*np.exp(-r/n)*np.sqrt(n)*sc.special.hyp1f1(1-n, 2, 2*r/n)/n**2

def p(n1,n2):
    potC=sc.integrate.quad(lambda r: Psi(r,n2)*(-1/r)*Psi(r,n1)*(r**2),0,np.inf)
    pot=potC[0]
    return pot
print(p(15,15))

python numpy scipy calculation numerical-integration
1个回答
1
投票

该错误从字面上说明了您的问题是什么。您的功能在某些地区“表现不佳”。

例如,当 n = 15 且 r = 50 时,您的

special.hyp1f1(-14, 2, 2*50/15)
结果为 NaN。我不熟悉这个函数,所以我不知道这是否是预期的行为,但这就是发生的情况。

您可以尝试隔离这些点并将它们从积分中排除(如果您知道函数值的下限和上限(如果已定义),您还可以更新积分的预期误差)并仅在表现良好的情况下进行积分地区。

如果是 scipy 中的错误,请向他们报告。

Ps.:用 scipy 1.8.0 测试

Ps2.:经过一些阅读,我发现,如果您使用复数进行计算,您可以正确获得值,因此以下代码为您提供一个值:

import scipy as sc
from scipy import integrate
from scipy import special
import numpy as np

def Psi(r,n):
    r = np.array(r,dtype=complex)
    return 2*np.exp(-r/n)*np.sqrt(n)*special.hyp1f1(1-n, 2, 2*r/n)/n**2

def p(n1,n2):
    potC=integrate.quad(lambda r: Psi(r,n2)*(-1/r)*Psi(r,n1)*(r**2),0,np.inf)
    pot=potC[0]
    return pot
print(p(15,15))
© www.soinside.com 2019 - 2024. All rights reserved.