在SymPy中评估函数值
我正在尝试编写各种优化方法,作为复习的一种方式。我想用SymPy这个工具来计算一个函数在某个特定点的值,这个点的坐标是存储在一个数组里的。
举个例子,我想在点 b = [1,2]
计算这个函数 f(x,y) = 3*x**2 - 2*x*y + y**2 + 4*x + 3*y
的值。不过我希望有一种通用的方法,可以处理任意数量的变量,并且能够接受一个合适长度的数组作为要计算的点。所以 sympy.evalf(f, subs = {foo})
这种方式对我来说并不是很有用。
3 个回答
1
lambdify
是一个很好的工具,可以用来生成可以在 Python 中调用的函数。
举个例子,假设你有一个函数 f
和两个符号 x
和 y
:
from sympy import lambdify
import numpy as np
callable_fct = lambdify((x, y), f)
xn = np.arange(0, 2, 0.1)
yn = 3
print(callable_fct(xn, yn))
1
我也觉得这应该更简单,不过这里有个不错的解决办法:
如果你知道符号的名字(比如 'x'
、'y'
之类的),你可以用 zip
来快速创建一个 dict
(字典):
fvars = sympy.symbols('x, y') #these probably already exist, use: fvars = [x,y]
b = [1,2]
sympy.evalf(f, subs = dict(zip(fvars,b)))
5
你正在使用SymPy的表达式树,而不是函数。对于任何表达式,你都可以这样做:
>>> vars = sorted(expression.free_symbols)
>>> evaluated = expression.subs(*zip(vars, your_values))