<p>这个问题的答案很简单。当然,在另一个答案中给出的<code>subs</code>选项可用于计算某个数的导数,但如果要绘制导数,则不起作用。有一种方法可以解决这个问题:lambdify,如下所述。</p>
<p>使用lambdify将所有sympy函数(可以区分但不能计算)转换为它们的numpy对应函数(可以计算、绘制等,但不能区分)。例如,sym.sin(x)将替换为np.sin(x)。其思想是:使用symphy函数定义函数,根据需要进行区分,然后定义一个新的函数,它是原始函数的lambdified版本。</p>
<p>在下面的代码中,sym.lambdify接受以下输入:</p>
<p><code>sym.lambdify(variable, function(variable), "numpy")</code></p>
<p>第三个输入“numpy”是用numpy对应函数替换sympy函数的内容。例如:</p>
<pre><code>def f(x):
return sym.cos(x)
def fprime(x):
return sym.diff(f(x),x)
fprimeLambdified = sym.lambdify(x,f(x),"numpy")
</code></pre>
<p>然后函数<code>fprime(x)</code>返回<code>-sym.sin(x)</code>,函数<code>fprimeLambdified(x)</code>返回<code>-np.sin(x)</code>。我们现在可以在特定的输入值处“调用”或“求值”,而不能“调用”或“求值”,因为前者由numpy表达式和后者的sympy表达式组成。换句话说,输入<code>fprimelambdified(math.pi)</code>是有意义的,这将返回一个输出,而<code>fprime(math.pi)</code>将返回一个错误。</p>
<p>下面是在多个变量中使用<code>sym.lambdify</code>的示例。</p>
<pre><code>import sympy as sym
import math
def f(x,y):
return x**2 + x*y**2
x, y = sym.symbols('x y')
def fprime(x,y):
return sym.diff(f(x,y),x)
print(fprime(x,y)) #This works.
DerivativeOfF = sym.lambdify((x,y),fprime(x,y),"numpy")
print(DerivativeOfF(1,1))
</code></pre>