我正在尝试编写各种优化方法,作为复习的一种方式。我希望能够使用SymPy在给定点处评估具有任意变量数量的函数,其中点的坐标存储在数组中。
例如,我想要在点b = [1,2]
处评估f(x,y) = 3*x**2 - 2*x*y + y**2 + 4*x + 3*y
。但我真正想要的是一种通用的方法,可以处理具有任意数量变量和适当长度数组的函数作为要评估的点,所以sympy.evalf(f, subs = {foo})
并不非常有用。
我正在尝试编写各种优化方法,作为复习的一种方式。我希望能够使用SymPy在给定点处评估具有任意变量数量的函数,其中点的坐标存储在数组中。
例如,我想要在点b = [1,2]
处评估f(x,y) = 3*x**2 - 2*x*y + y**2 + 4*x + 3*y
。但我真正想要的是一种通用的方法,可以处理具有任意数量变量和适当长度数组的函数作为要评估的点,所以sympy.evalf(f, subs = {foo})
并不非常有用。
您正在使用SymPy表达式树而非函数。在任何表达式上,都可以执行以下操作:
>>> vars = sorted(expression.free_symbols)
>>> evaluated = expression.subs(*zip(vars, your_values))
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))
'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)))
map(sympy.Symbol,['x','y'])
可以写成 symbols('x, y')
。 - Krastanov