<p>{<cd1>}和{<cd2>}通常的工作方式是将表达式拆分为分子和分母,并返回不在另一个表达式中的表达式的解</p>
<p>让我们定义一个helper函数,将<code>nsolve</code>的解放入<code>FiniteSet</code>中,一个用于给出最终解:</p>
<pre><code>>>> from sympy import FiniteSet, nsolve, Add, Eq
>>> from sympy.abc import x
>>> rr = lambda x: FiniteSet(*[i[0] for i in real_roots(x, multiple=False)])
>>> sol = lambda n, d: list(rr(n) - rr(d))
>>> go = lambda eq: sol(*eq.rewrite(Add).as_numer_denom())
</code></pre>
<p>现在,我们在您的原始表达式上尝试以下操作:</p>
<pre><code>>>> eq = Eq(32/(x + 1)**60 + (1 - 1/(x + 1)**60)/x, 41.81)
>>> fsol = go(eq) # very slow
>>> [i.n(3) for i in fsol]
[-3.33, -2.56, -1.44, -0.568, -0.228, 0.0220]
</code></pre>
<p>如果您通过替换原始表达式(作为表达式编写)来检查这些内容,您将发现只有最后一个是有效的</p>
<pre><code>>>> expr = eq.rewrite(Add)
>>> [expr.subs(x, i).n(3) for i in fsol]
[-42.1, -42.2, 4.72e+22, 2.64e+23, 1.97e+8, 1.31e-15]
</code></pre>
<p>现在,让我们用一个Rational替换该浮点,并获得解决方案:</p>
<pre><code>>>> req = nsimplify(eq, rational=True); req
Eq(32/(x + 1)**60 + (1 - 1/(x + 1)**60)/x, 4181/100)
>>> rsol = go(_) # pretty fast
>>> [i.n(3) for i in rsol]
[-2.00, 0.0220]
</code></pre>
<p>我们知道第二种解决方案是正确的;让我们检查一下第一个:</p>
<pre><code>>>> req.subs(x, rsol[0]).rewrite(Add).n(3)
-0.e-114
</code></pre>
<p>因此,这两种解决方案似乎都是有效的,而且你不会得到任何虚假的解决方案,这(顺便说一句)是我从<code>nsolve</code>中没有想到的</p>