Sympy为何不识别我定义的实数常量?
问题:Sympy积分结果出现额外条件的原因与解决办法
问题描述
运行以下Sympy代码时:
import sympy as sym sym.init_printing() from IPython.display import display_latex a = sym.symbols('a', real = True) r = sym.symbols('r', real = True) wavefunction = sym.exp(-a*r**2) normalization_squared = 4*sym.pi*sym.integrate((r**2)*wavefunction**2, (r, 0, sym.oo)) display_latex(normalization_squared.simplify())
得到的结果包含if arg(z)<pi/2的条件,但已明确声明a和r为实数,添加全局假设sym.assumptions.assume.global_assumptions.add(sym.Q.real(a))后问题仍存在,疑惑原因。
原因分析
虽然你声明了a是实数,但Sympy默认没有假设a是正实数。当a为负实数时,被积函数$r^2 e^{-2a r2}$会随$r$增大呈指数增长,导致积分$\int_0\infty r^2 e^{-2a r^2} dr$发散。Sympy保留arg(z)<π/2的条件,本质是在限制$a$的实部为正(对于实数$a$来说,等价于$a>0$),以此确保积分收敛。
解决办法
在定义符号a时,同时添加正实数的假设:
a = sym.symbols('a', real=True, positive=True)
修改后重新运行代码,积分结果会直接简化为收敛情况下的表达式,不再附带条件。
内容的提问来源于stack exchange,提问作者Jack
相关产品推荐
相关产品推荐

