擅长:python、mysql、java
<p>SymPy中有一个主要的问题,那就是,由于Python的工作方式,<code>number/number</code>给出了一个浮点(如果使用python2而不使用<code>from __future__ import division</code>),则进行整数除法。在</p>
<p>在第一种情况下,在原始表达式中,Python从左到右计算<code>1/12*b</code>。<code>1/12</code>由Python计算得出<code>0.08333333333333333</code>,然后乘以{<cd6>}。在第二种情况下,<code>b*1</code>被计算为<code>b</code>。然后,<code>b/12</code>被SymPy求值(因为<code>b</code>是一个SymPy对象),得到{<cd11>}。在</p>
<p>由于浮点数的不精确性,SymPy并不认为浮点<code>0.08333333333333333</code>等于有理<code>1/12</code>。在</p>
<p>这个问题还有更多的讨论<a href="http://docs.sympy.org/latest/tutorial/gotchas.html" rel="noreferrer">here</a>。作为一种解决方法,您应该避免直接<code>integer/integer</code>而不以某种方式包装它,这样SymPy就可以创建一个rational。以下都将创建一个理性的:</p>
<pre><code>b/12
Rational(1, 12)*b
S(1)/12*b
</code></pre>
<hr/>
<p>对于<code>(((x+1)**2-x).expand()).subs(x**2+2*x, y+1)</code>,问题是<code>x**2 + 2*x</code>并没有完全出现在表达式中,即<code>x**2 + x + 1</code>。SymPy通常只替换它所看到的东西。在</p>
<p>似乎您不介意加减一个<code>x</code>以使替换生效。所以我建议改成{<cd19>}。通过只替换单个项(<code>x**2</code>),替换将始终有效,<code>2*x</code>将取消,留下任何{<cd18>}项(在本例中,<code>-x</code>)。在</p>