gpt4 book ai didi

python - Sympy 在简化时生成损坏的 `Piecewise` 条件

转载 作者:太空宇宙 更新时间:2023-11-04 04:27:08 26 4
gpt4 key购买 nike

我的代码

我在一个较大的程序中有效地减少了以下代码片段:

import sympy as sp
print('sympy version:', sp.__version__)

n = sp.symbols('n', integer=True)
expr = sp.Piecewise((0, sp.Ne(n, 3)), (-1/2, True))*sp.Piecewise((2, sp.Ne(n, 0)), (1, True))

print('raw expression:', expr)
print('simplified expression:', sp.simplify(expr))

对于简化的表达式,我期望等价于:

simplified expression: Piecewise((0, Eq(n, 0)), (-1.0, Eq(n, 3)), (0, True))

(这可能会进一步简化为只有两个分支,但类似的东西。)

然而,我的实际输出是:

sympy version: 1.3

raw expression: Piecewise((0, Ne(n, 3)), (-0.5, True))*Piecewise((2, Ne(n, 0)), (1, True))

simplified expression: Piecewise((0, Ne(n, 3)), (-1.0, Ne(n, 0)), (-0.5, True))

我的问题

明显的问题是我没有得到预期的结果。但不仅如此,简化后的分段表达式中存在明显的逻辑问题;更具体地说,在其中的条件下。

第一个条件是Ne(n, 3),意思是“当n不等于3时,将使用第一个值”。这本身就很好。

然而,第二个条件是 Ne(n, 0),根据第一个条件,这是完全没有意义的。如果 n 为 0,则第一个条件为真,将使用第一个分支值,因此逻辑上保证如果正在评估第二个条件,则 n 不为 0。

更糟糕的是,最后一个条件是 True(即“否则”),如果不满足早期分支的条件,这是默认条件。但是,逻辑上不可能到达这个分支,因为前面两个条件划分了整数的完整空间(并且n被定义为整数;但是,当n 的数字类型未指定)。

(我还想指出,这个问题在简化之前的任何一个原始分段表达式中都不存在。虽然他们确实使用 Ne 作为他们的第一个分支条件,但第二个条件是默认的 True,这是完全有效的。)

我的问题

任何人都可以将此解释为预期行为吗?

如果没有,我计划将其作为错误提交给 SymPy。我确实简单地搜索了the SymPy issue tracker在发布之前解决我的问题,但我没有看到任何与之匹配的东西。我只是想在这里仔细检查我没有先忽略任何东西。

最佳答案

输出不是“损坏的”或“无意义的”。它在逻辑上是正确的,尽管没有以尽可能简单的形式呈现。

条件 if n == 3 and n != 0 可以简化为 if n == 3。 “可以简化”和“完全没有意义”是有区别的。

但是,是的,请在 SymPy 跟踪器上报告它,因为简化是不完整的;更好的结果是 Piecewise((0, Ne(n, 3)), (-1.0, True))

关于python - Sympy 在简化时生成损坏的 `Piecewise` 条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53287120/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com