python 符号中含有缺陷的渐近简化函数

hkmswyz6  于 2023-08-02  发布在  Python
关注(0)|答案(1)|浏览(80)

我用sympy来验证一些手工计算,版本是anaconda和

import sympy as sp
sp.__version__
'1.11.1'

字符串
Windows 11 Jupyter笔记本
代码运行如下

from sympy import Function
eta = Function('eta')
from sympy import *
s,c,h=symbols('s c h',real=True)

A,B =symbols("A B")
q=exp(-2*pi*exp(s))
chi_0=eta(s)**(-1) * q**(0-(c-1)/24)*(1-q)


下面的代码

print( chi_0.diff(s).subs((eta(s)**(-1)).diff(s),-B) .subs(eta(s)**(-1),A) .subs(s,0) )


产生了正确的结果

print( chi_0.diff(s).subs((eta(s)**(-1)).diff(s),-B) .subs(eta(s)**(-1),A) .subs(s,0) )

-2*pi*A*(1/24 - c/24)*(1 - exp(-2*pi))*exp(-2*pi*(1/24 - c/24)) + 2*pi*A*exp(-2*pi)*exp(-2*pi*(1/24 - c/24)) - B*(1 - exp(-2*pi))*exp(-2*pi*(1/24 - c/24))


请注意项-2*pi*A*(1/24 - c/24)*(1 - exp(-2*pi))*exp(-2*pi*(1/24 - c/24))中的符号。然而,当我试图取消*exp(-2*pi*(1/24 - c/24))时,

#bug
print( (( chi_0.diff(s).subs((eta(s)**(-1)).diff(s),-B) .subs(eta(s)**(-1),A) .subs(s,0) )/exp(pi*(c-1)/12)  ).simplify()  )
(-pi*A*(1 - exp(2*pi))*(c - 1)/12 + 2*pi*A + B*(1 - exp(2*pi)))*exp(-2*pi)


请注意,其中两项(-pi*A*(1 - exp(2*pi))*(c - 1)/12B*(1 - exp(2*pi)))*exp(-2*pi)获得了错误的符号,而2*pi*A的符号保持正确。
虽然扩展语句可以修复结果,

print( (( chi_0.diff(s).subs((eta(s)**(-1)).diff(s),-B) .subs(eta(s)**(-1),A) .subs(s,0) ).expand()/exp(pi*(c-1)/12)  ).simplify() )
-pi*A*c*exp(-2*pi)/12 + pi*A*c/12 - pi*A/12 + 25*pi*A*exp(-2*pi)/12 - B + B*exp(-2*pi)


但没有用。
这是怎么发生的?

dba5bblo

dba5bblo1#

您可以通过一个简单的示例来查看该行为:

>>> from sympy.abc import x, y, z
>>> from sympy import signsimp
>>> a = (1-x)*(y-1)*(1-z)/-1; a
-(1 - x)*(1 - z)*(y - 1)
>>> b = signsimp(_); b  # make expression canonical wrt sign
-(x - 1)*(y - 1)*(z - 1)

字符串
你可以看到发生了两件事:因子的顺序被改变了(但这对交换因子是可以的),two 因子的符号被改变了(这保留了整体符号)。
如果你对两个表达式是否相等有疑问,你可以尝试以下方法(如果不能判断,将返回None):

>>> a.equals(b)
True


signsimp是简化过程的一部分,并且可能是因子内的符号改变的原因之一。

相关问题