首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Sympy简化逻辑

Sympy简化逻辑
EN

Stack Overflow用户
提问于 2016-04-06 23:38:56
回答 1查看 1.2K关注 0票数 1

我最近开始使用Sympy,从一开始它的行为在我看来就很奇怪。

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

代码语言:javascript
复制
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)

以下是一个输出:

代码语言:javascript
复制
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 for python3.5在OS下面是pip show sympy信息

代码语言:javascript
复制
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

那么,在简化表达式时,是否存在bug或Sympy有一些非平凡的逻辑?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-04-07 00:55:56

没有窃听器。如果你简化最后三个表达式,你会发现它们都被抵消了。

代码语言:javascript
复制
>>> 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术语展开,它就可以了。为什么会发生这种事?一开始,你

代码语言:javascript
复制
>>> 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

所以,自然,

代码语言:javascript
复制
>>> p2_ethalon + tn_shifted
x**3 - 2*x**2 + 1.0*x + 1.0

当您从fx中减去它时,它会使所有的东西都很好地抵消掉。但是,对于p2_simplified,您要求它独立地简化p2_ethalon,这将返回

代码语言:javascript
复制
>>> p2_simplified
0.75*x**3 - 0.5*x**2 - 1.25*x + 1.5

这里的问题是,当您将它添加到tn_shifted中时,as并没有意识到,通过从tn_shifted中扩展立方体,它将允许一切变得更加简化,因此它们仍然是一个更复杂的表达式。

代码语言:javascript
复制
>>> 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

代码语言:javascript
复制
>>> tn_expanded = tn_shifted.expand()
>>> p2_simplified + tn_expanded
1.0*x**3 - 2.0*x**2 + 1.0*x + 1.0

总之,每次添加、乘、减等新术语时,交感并不能积极地简化表达式。而孤立地简化表达式的一部分,可能会阻止以后出现更大的模式,从而导致更全面的简化。

我也有过类似的经验,在枫树,在那里,为了使公式达到我想要的形式,我不得不嵌套类似的函数(收集(展开(Expr)。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36464184

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档