【发布时间】:2017-05-31 12:21:19
【问题描述】:
I asked a question yesterday 关于区分 python 函数,然后当我发现发布的答案都不能满足我评估(在某些变量中)然后绘制导数的需要时,我能够找出自己的解决方案。
之前的代码:
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.
print(fprime(1,1))
新代码:
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))
如您所见,我克服了无法评估导数 fprime 的问题,方法是创建一个新函数 DerivativeOfF,它是 fprime 的“lambdified”版本。从那里,我能够评估 DerivativeOfF,并将其绘制在其中一个变量中。
我的问题是:为什么会这样?我到底做了什么?这种方法有什么缺点?我曾尝试阅读lambdify 文档,但这让我非常困惑(我是Python 的初学者)。我的猜测是我将 Python 函数 fprime 转换为 Sympy 表达式 DerivativeOfF 或类似的东西。任何帮助解释发生的事情和原因,以及lambdify 究竟做了什么(用外行的话),将不胜感激。
【问题讨论】:
-
这可能是因为第一个版本先替换了x和y,然后尝试进行导数。
-
您的
fprime是一个sympy.Add对象。它不是 Python 函数(“可调用”)。您已经使用sympy提供的方法或函数来“评估”它。lambdify就是这样一种功能。.subs是另一个,请尝试:fp.sums([(x,1), (y,2)])。我感觉您正在尝试使用sympy而不阅读它的大部分教程。不要将sympy与基本的 Python 或 numpy 混淆。 -
@hpaulj 你说得对,我没有阅读所有教程就进入了 sympy。我什至对这些教程中的许多基础知识都感到非常困惑。以lambdify为例:它的教程页面我一个字都看不懂。我觉得有时深入研究代码会更好,尤其是当您对阅读它感到困惑时。当我感到困惑并且教程没有帮助时,我就会在这里提出问题。
-
@hpaulj 我上面的lambdify代码是做什么的?它真的将 sympy 函数转换为对应的 numpy 函数吗?如果这是真的,为什么我能够使用 sympy 来区分lambdify 结果,如果 numpy 函数无法区分?感谢您的宝贵时间。
-
更正。
f是一个 Python 函数。f(x,y)是一个同情对象。它是由sym.symbols('x y')隐式创建的。sym.diff使用f(x,y),而不是f。你不能打电话给f(x,y),但你可以lambdify它。
标签: python python-3.x numpy sympy lambdify