gpt4 book ai didi

python - Sympy 简化逻辑

转载 作者:行者123 更新时间:2023-12-01 04:01:13 25 4
gpt4 key购买 nike

我最近开始使用 Sympy,从我的角度来看,它从一开始就表现得很奇怪。

考虑一个变量的两个多项式:fx 和 tn_shifted。我将一个与另一个相减,得到多项式 p2。然后我对其进行化简,得到完全不同的表达式,如下所示。

import sympy as spy
from sympy import Symbol

x = Symbol('x')
a, b = 1, 3
n = 3
tn = lambda x: x**3 - 3*x
fx = spy.simplify(x**3 - 2*x**2 + x + 1)

tn_shifted = (b - a)**n / (2**(2*n - 1)) * tn((2*x - (b + a)) / (b - a))
tn_shifted = spy.simplify(tn_shifted)

p2_ethalon = fx - tn_shifted
print(fx - p2_ethalon - tn_shifted)

p2_simplified = spy.simplify(fx - tn_shifted)
print(fx - p2_simplified - tn_shifted)

p2_expanded = spy.expand(fx - tn_shifted)
print(fx - p2_expanded - tn_shifted)

print(p2_ethalon - p2_simplified)

这是一个输出:

0
0.25*x**3 - 1.5*x**2 + 3.0*x - 0.25*(x - 2)**3 - 2.0
0.25*x**3 - 1.5*x**2 + 3.0*x - 0.25*(x - 2)**3 - 2.0
0.25*x**3 - 1.5*x**2 + 3.0*x - 0.25*(x - 2)**3 - 2.0

Sympy 附带 anaconda,适用于 OS X Yosemite 下的 python 3.5这是pip show sympy信息

Name: sympy
Version: 0.7.6.1
Summary: Computer algebra system (CAS) in Python
Home-page: http://sympy.org
Author: SymPy development team
Author-email: sympy@googlegroups.com
License: BSD
Location: /Users/cnst/anaconda/lib/python3.5/site-packages

那么,Sympy 在简化表达式时是否存在错误或存在一些不平凡的逻辑?

最佳答案

没有错误。如果您简化最后三个表达式,您会发现它们全部抵消。

>>> print(fx - p2_simplified - tn_shifted)
0.25*x**3 - 1.5*x**2 + 3.0*x - 0.25*(x - 2)**3 - 2.0
>>> print((fx - p2_simplified - tn_shifted).simplify())
0

一旦您强制 (x - 2)**3 项展开,一切都会成功。为什么会发生这种情况呢?最初,您有

>>> fx
x**3 - 2*x**2 + x + 1
>>> tn_shifted
-0.75*x + 0.25*(x - 2)**3 + 1.5
>>> p2_ethalon
x**3 - 2*x**2 + 1.75*x - 0.25*(x - 2)**3 - 0.5

所以,自然地,

>>> p2_ethalon + tn_shifted
x**3 - 2*x**2 + 1.0*x + 1.0

当你从 fx 中减去它时,一切都会很好地抵消。但是,对于 p2_simplified,您要求它单独简化 p2_ethalon,这将返回

>>> p2_simplified
0.75*x**3 - 0.5*x**2 - 1.25*x + 1.5

这里的问题是,当您将其添加到 tn_shifted 时,sympy 没有意识到通过从 tn_shifted 扩展三次方将使一切变得更加简化,所以它们作为一个更复杂的表达而停留在边缘。

>>> p2_simplified + tn_shifted
0.75*x**3 - 0.5*x**2 - 2.0*x + 0.25*(x - 2)**3 + 3.0

但是,如果您要从 tn_shifted 展开三次,上面的内容将简化为 fx

>>> tn_expanded = tn_shifted.expand()
>>> p2_simplified + tn_expanded
1.0*x**3 - 2.0*x**2 + 1.0*x + 1.0

底线是,每次添加、相乘、相减等新项时,sympy 不会积极简化表达式。单独简化表达式的一部分可能会阻止 sympy 稍后看到更大的模式,从而导致更加全局化的简化。

我在 Maple 上也有过几次类似的经历,为了将公式变成我想要的精确形式,我必须嵌套像 Simply(collect(expand(expr))) 这样的函数。

关于python - Sympy 简化逻辑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36464184/

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