如何以符合假设的方式规范化部首

How to canonicalize radicals in a way that's consistent with assumptions

Sage docs 中他们说函数 canonicalize_radical() 根据它在无穷大的行为选择一个分支。用他们自己的话来说,这意味着

Assumptions are not taken into account during the transformation. This may result in a branch choice inconsistent with your assumptions.

简而言之,这是一件坏事。一个简单的答案示例

assume(x<0) sqrt(x^2).canonicalize_radical() returns x,并具有 assume(x>0) 的行为。至少我们会期望不同假设的行为会有所不同。

使用 Sage,是否有一种方法可以始终以始终与假设一致的方式执行此操作?我的主要目标是简化,所以也许还有另一个我不知道的功能可以做到这一点。

在 Sage Trac 服务器以及 Sage 开发人员列表和 Maxima 开发人员列表中,关于此的通信很长。这就是为什么它现在被称为 canonicalize_radical; Maxima 文档非常清楚,这在 表达式 的某些 class 中是规范的,但在 函数 中不是规范的(多值或非多值)。这可能不是您正在寻找的答案,但 Maxima 的人听起来这是最好的答案,因为分支削减。

还有很多其他的化简套路,也在Sympy和Sage的其他部分...