当前位置:  开发笔记 > 编程语言 > 正文

使用SymPy将符号表达式转换为Python函数

如何解决《使用SymPy将符号表达式转换为Python函数》经验,为你挑选了1个好方法。

我有一个相当大的符号函数,可以针对循环中参数的不同值进行评估。在每次迭代中,在找到函数的表达式之后,将导出偏导数。像这样:

from sympy import diff, symbols,exp

def lagrange_eqs(a):
    x,y,z= symbols('x y z')
    FUNC=x**2-2*x*y**2+z+a*exp(z)
    d_lgrng_1=diff(FUNC,x)
    d_lgrng_2=diff(FUNC,y)
    d_lgrng_3=diff(FUNC,z)
    return [d_lgrng_1,d_lgrng_2,d_lgrng_3]

接下来,我需要将此函数的输出转换为Python函数,以便可以fsolve用来查找导数为零的x,y,z值。该函数必须以x,y,z作为列表。

现在这是我的问题:如何将上述函数的输出转换为可以传递给求解器的Python函数。这样的函数应如下所示(对于a = 3):

def lagrange_eqs_solve(X): 
    x,y,z=X
    return [2*x - 2*y**2, -4*x*y, 3*exp(z) + 1]

我只是复制了第一个函数的输出以构建第二个函数。有什么办法可以编码吗?(Matlab为此提供了一个内置函数,称为matlabFunction)



1> asmeurer..:

你要lambdify

f = lambdify(((x, y, z),), lagrange_eqs(a))

会给你一个Python函数f,你可以像评估f((1, 2, 3))(对x=1y=2z=3)。我已经在元组中进行了论证,以便它可以与scipy的一起使用fsolve

您可以将modules标志设置为lambdify以确定exp函数的来源。例如,要使用numpy,请使用lambdify((x, y, z), lagrange_eqs(a), modules="numpy")。要使用标准库数学库,请使用modules="math"。默认情况下,如果已安装,则使用numpy,否则使用math。

推荐阅读
N个小灰流_701
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有