擅长:python、mysql、java
<p>如果要将SymPy表达式转换为可以数值计算的函数,则应使用<code>lambdify</code>。由于您在这里的兴趣是进行符号计算(微分),所以不应该使用lambdify(无论如何,在计算的这一点上)。在</p>
<p>问题出在这个代码上</p>
<pre><code>x, y = sym.symbols('x y')
def fprime(x,y):
return sym.diff(f(x,y),x)
</code></pre>
<p>当您将变量名设置为函数时,如“def fprime(<strong>x</strong>,<strong>y</strong>)”,这些变量名会有效地覆盖函数上方为函数内的任何代码定义的<code>x</code>和{<cd3>}的变量名。因此,代码<code>sym.diff(f(x,y),x)</code>不会对从<code>symbols('x y')</code>返回的符号对象进行操作,而是对传入<code>fprime</code>的任何值进行操作。当然,如果你把这些对象作为参数传入,它将是相同的,但是你可以传入任何东西。对于<code>f(x, y)</code>,它是完全相同的。在</p>
<p>相反,我会完全避免使用函数。相反,创建两个符号表达式。在</p>
^{pr2}$
<p>现在,要对<code>fprime</code>求值,可以使用<code>subs</code>。在</p>
<pre><code>fprime.subs({x: 1, y: 1})
</code></pre>
<p>如果此时要创建一个快速函数,该函数使用NumPy将表达式求值为一个数字或一个数字数组,则可以在此处使用<code>lambdify</code>。在</p>
<pre><code>f = lambdify((x, y), expr, 'numpy')
import numpy as np
f(np.array([1]), np.array([2]))
</code></pre>
<p>(另外,作为一般规则,如果<code>lambdify</code>一个带有<code>'numpy'</code>的表达式,则应该将NumPy数组作为lambdified函数的参数传入)</p>