使用 SymPy 将符号表达式转换为 Python 函数
Convert symbolic expressions to Python functions using SymPy
我有一个相当大的符号函数,它针对循环中参数的不同值进行评估。在每次迭代中,找到函数的表达式后,推导出偏导数。像这样:
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)
你想要lambdify
.
f = lambdify(((x, y, z),), lagrange_eqs(a))
会给你一个 Python 函数 f
,你可以像 f((1, 2, 3))
那样计算它(对于 x=1
、y=2
、z=3
) .我在一个元组中创建了参数,以便它可以与 scipy 的 fsolve
一起使用。
您可以将 modules
标志设置为 lambdify 以确定 exp
函数的来源。例如,要使用 numpy
,请使用 lambdify((x, y, z), lagrange_eqs(a), modules="numpy")
。要使用标准库数学库,请使用 modules="math"
。默认情况下,如果安装了 numpy,则使用它,否则使用 math。
我有一个相当大的符号函数,它针对循环中参数的不同值进行评估。在每次迭代中,找到函数的表达式后,推导出偏导数。像这样:
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)
你想要lambdify
.
f = lambdify(((x, y, z),), lagrange_eqs(a))
会给你一个 Python 函数 f
,你可以像 f((1, 2, 3))
那样计算它(对于 x=1
、y=2
、z=3
) .我在一个元组中创建了参数,以便它可以与 scipy 的 fsolve
一起使用。
您可以将 modules
标志设置为 lambdify 以确定 exp
函数的来源。例如,要使用 numpy
,请使用 lambdify((x, y, z), lagrange_eqs(a), modules="numpy")
。要使用标准库数学库,请使用 modules="math"
。默认情况下,如果安装了 numpy,则使用它,否则使用 math。