- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我在一个较大的程序中有效地减少了以下代码片段:
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/
我有一系列由类型级整数索引的数据类型,我以“分段”方式将它们定义为某个类型类的实例,这在尝试派生另一个类的实例时会导致问题。为了说明,我将问题隔离如下。考虑这段代码: {-# LANGUAGE Sco
在 sympy 中,如何声明一个对子函数中的多个变量具有多个限制的 Piecewise 函数? 这是我的背景和尝试: from sympy import Piecewise, Symbol, exp
我试图找到的傅里叶级数 像 simpy 一样: p = Piecewise((sin(t), 0 0) | (t < pi)), (0, (pi < t) | (t < 2*pi))), (t, 0
我正在尝试使用两个 x0 和 y0 坐标数组中的数据来创建一个使用提供的 x0 和 的函数>y0 计算分段的一系列线段。 为此,我创建了一个函数 import numpy as np import m
我正在学习关于模糊系统的类(class),我学习了 my notes在我的电脑上。这意味着我不得不时不时地在电脑上画图。由于这些图表定义明确,我觉得用 numpy 绘制它们是个好主意(我用 LaTeX
我希望从一组数据点生成一个最适合这些点的三次样条函数。 也就是说,寻求获得最适合数据的单个三阶多项式函数 - 而不是分段多项式。(最终目标是找到该函数二阶导数的最大值) 我已经尝试过scipy.int
我定义了一个分段复杂函数 import numpy as np def foo(x): return np.piecewise(x, [x>0], [np.exp(1j*x)]) 当我尝试评估
我想绘制以下累积分布函数 为此我想我可以使用 np.piecewise 如下 x = np.linspace(3, 9, 100) np.piecewise(x, [x 9], [0, float(
我的代码 我在一个较大的程序中有效地减少了以下代码片段: import sympy as sp print('sympy version:', sp.__version__) n = sp.symbo
我正在编写一个程序来进行三次样条插值。基本上,该程序将在某些间隔内拼凑三次多项式。如果可能的话,我想用piecewise[] 或其他类似的函数来绘制这个结果。 在我的代码中,我的方程在一个数组中,输出
我正在尝试使用 np.piecewise 定义一个多元分段函数,如下所示: X = np.array([ [1, 2], [3, 4], [5, 6] ]) pw = np.p
我正在尝试在 Mathematica 中绘制缓和函数的导数。它区分函数 OK,并且可以使用 % 绘制函数,但我希望能够通过将导数指定为函数 f[t_] 来绘制,然后 绘制[ f[t] , {t,-1,
我一直在尝试让 numpy.piecewise 将系数列表 {a_ij} 转换为分段三次多项式。每当我运行以下代码时, import math import numpy as np x = np.li
我想创建一个巨大的打包数据阵列,并将其保存在磁盘上。我正在使用 writePackedMessageToFd()。但是,由于输入数据非常大 (50GB),我需要将消息片段写入磁盘以释放内存。 Cap'
我正在尝试为一些数字信号处理构造一个分段函数,但我无法获得 numpy.piecewise 以允许我指定一个范围。 这里是我要输入的内容: t = np.arange(-10,10,1) x = la
我对为什么以下代码的答案是 10 而不是 1 感到困惑。有人可以帮助我了解 lambdify 发生了什么或者是什么导致了错误答案吗? import sympy from sympy.utilities
我想绘制一个分段函数,例如: import sympy as sym x = sym.symbols("x") f = sym.Piecewise((-1, x = 1)) sym.plotting.
我是一名优秀的程序员,十分优秀!