在 SymPy 中处理负平方根的倒数

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

我正在使用以下形式的函数:

import sympy as sm
a,b,x = sm.symbols('a b x')
f = sm.integrate(sm.cos(a*x + 0.5*b*x**2),(x,0,1))

The full integral looks like this in SymPy's formatted output。 我真的不知道它背后的数学理论,但我认为这是一个正确的公式。

但是,我遇到的问题出现在 Fresnel S 和 C 函数的参数中,其中有一个

1/sqrt(b)
的因子。这意味着当
b
为负时,分母变得复杂,因此总参数不连续地切换符号。积分本身总是实数,因为复数项抵消了,但符号变化也会传播到积分的总值,例如:

f.subs([(a,1),(b,1e-9)]).evalf()
# =0.84147
f.subs([(a,1),(b,-1e-9)]).evalf()
# =−0.84147

至少对于我的应用程序,此函数在

b=0
处连续是有意义的。我也对这个倒数平方根项的歧义感到有点困惑,它似乎可以等价地写成:
1/sqrt(b) = sqrt(1)/sqrt(b) = sqrt(1/b)
,它失去负号
b
的符号变化。事实上,我目前的解决方法是在 SymPy 表达式中将菲涅耳参数从
1.0*a/(sqrt(pi)*sqrt(b))
重写为
1.0*a/(sqrt(pi))*sqrt(1/b)

此外,我在 MATLAB 的符号工具箱中尝试过这个,它似乎默认提供了我期望的输出:

syms a b x real
f = int(cos(a*x + 0.5*b*x^2),x,0,1)

MATLAB's formatted integral looks like this

值得注意的是,

1/sqrt(b)
项在 S 和 C 参数(sigma1 和 sigma4 替换)的分子中显示为
sqrt(1/b)

如何让 SymPy 以与 MATLAB 相同的方式评估此函数?如前所述,我有一个手动修改 SymPy 字符串表达式的一部分的 hacky 解决方法,但这显然不是理想的,并且可能不适用于我需要从中派生的更复杂的表达式。

python math sympy symbolic-math complex-numbers
© www.soinside.com 2019 - 2024. All rights reserved.