Sympy简化时生成错误的“Piecewise”条件

3

我的代码

在一个较大的程序中,我有效地有以下简化的代码片段:

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))

对于简化后的表达式,我期望得到与以下等价的结果:

简化表达式:Piecewise((0, Eq(n, 0)), (-1.0, Eq(n, 3)), (0, True))

(这可能还可以进一步简化为只有两个条件分支,但类似的结果)

然而,我的实际输出是:

sympy版本:1.3

原始表达式:Piecewise((0, Ne(n, 3)), (-0.5, True))*Piecewise((2, Ne(n, 0)), (1, True))

简化表达式: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的数字类型未指定时,同样的问题会发生)。

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

我的问题

有人能解释这是否是本意吗?

如果不是,我计划向SymPy提交此错误报告。在发布之前,我曾在SymPy问题跟踪器上搜索过我的问题,但没有找到与之匹配的内容。我只是想在这里再次核实一下,以防我遗漏了什么。


1
从未使用过Symply,但是这是一个写得很好的问题! - narendra-choudhary
1
@narendra-choudhary 除了技术支持,情感上的支持也是受欢迎的 :) 谢谢! - CrepeGoat
1个回答

1
输出并非“破碎的”或“荒谬的”。它在逻辑上是正确的,尽管没有以可能的最简形式呈现。
条件if n == 3 and n != 0可以简化为if n == 3。"可以简化"和"完全没有意义"之间存在差异。
但是,是的,请在SymPy跟踪器上报告它,因为简化是不完整的;更好的结果将是Piecewise((0, Ne(n, 3)), (-1.0, True))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接