在SymPy中评估函数值

11 投票
3 回答
12662 浏览
提问于 2025-04-17 19:30

我正在尝试编写各种优化方法,作为复习的一种方式。我想用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 和两个符号 xy

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))

撰写回答