如何在 sympy 中使用“提示”来防止 doit() 计算某种子表达式?

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

sympy 文档说:

sympy.core.basic.Basic.doit(**提示)

计算默认情况下不计算的对象,例如极限、积分、总和和乘积。所有此类对象都将被递归评估,除非通过“提示”排除某些物种或除非“深度”提示设置为“False”。

但是我找不到任何关于如何执行此操作的解释。

我尝试查看源代码并遵循

.doit()
方法对
**hints
参数所做的操作,但是对于我检查过的每个类,它都有针对类特定提示的显式代码,并且当它出现时,其他所有内容都会被启动在其子元素上调用
.doit(**hints)
。由于没有检查模块中每个类的
.doit()
方法,我无法想出如何弄清楚如何执行文档声称的操作。 有人知道该怎么做吗?

这是一个我想做的事情的快速示例,这会很有用。如果我运行以下代码:

from sympy import * from sympy.physics.quantum import Commutator A,B = symbols('A B', commutative=False) x = symbols('x') expr = 1 + Integral(Commutator(A,B),(x,0,2)) expr.doit()

我得到了输出

>>> 1 + 2(AB-BA)

这是正确的,但是我想保持换向器完好无损并得到

>>> 1 + 2[A,B]

我为上述所做的尝试:

如果我设置

deep=False

那么我只会得到未计算的表达式,大概是因为表达式的最外层是已经计算过的加法,可以这么说。在这种情况下,我当然可以迭代表达式并告诉它用

deep=False
计算积分并得到我想要的东西,但对于更复杂的表达式,我想在评估其他所有内容的同时保持换向器完整,这样更有意义能够告诉 sympy 不要打扰换向器。
将换向器创建为 

UnevaluatedExpr(Commutator(A,B))

也没有帮助,因为运行

.doit()
显然只会炸穿该保护层。
    

python sympy symbolic-math
1个回答
0
投票
setdefault

的一个有用功能来跟踪唯一替换,以掩盖使用

replace
找到的实体:

© www.soinside.com 2019 - 2024. All rights reserved.