在SymPy中对一个函数进行点求值

11

我正在尝试编写各种优化方法,作为复习的一种方式。我希望能够使用SymPy在给定点处评估具有任意变量数量的函数,其中点的坐标存储在数组中。

例如,我想要在点b = [1,2]处评估f(x,y) = 3*x**2 - 2*x*y + y**2 + 4*x + 3*y。但我真正想要的是一种通用的方法,可以处理具有任意数量变量和适当长度数组的函数作为要评估的点,所以sympy.evalf(f, subs = {foo})并不非常有用。


你能否只使用map()函数?http://docs.python.org/2/library/functions.html#map - Samizdis
http://Whathaveyoutried.com - Snakes and Coffee
欢迎来到SO!在这里,我们建议您发布代码和一些您尝试过的具体内容,请阅读常见问题解答,希望您能得到更好的答案! - span
地图一开始看起来很有前途,但我认为它不相关,遗憾的是 - 它为参数的几个特定值评估一个函数。我想做的是在一个通用的多元点上评估SymPy表达式。谢谢你提供链接,虽然我以前没有接触过它,但我相信它将在未来有用。我已经查看了SymPy文档,主要是数值评估和代数部分,但没有找到任何有用的东西。这让我感到有些惊讶,因为我觉得这是经常需要的事情。 - Tam Coton
如果你的所有表达式都是多项式,你也可以尝试使用 Poly。 - asmeurer
3个回答

5

您正在使用SymPy表达式树而非函数。在任何表达式上,都可以执行以下操作:

>>> vars = sorted(expression.free_symbols)
>>> evaluated = expression.subs(*zip(vars, your_values))

1
非常感谢 - 我在哪里可以找到有关这些命令的文档?我宁愿了解它们的作用,而不是只是机械地复制而不理解! - Tam Coton
1
https://docs.sympy.org/latest/tutorials/intro-tutorial/basic_operations.html - Benjamin Smus

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

2
map(sympy.Symbol,['x','y']) 可以写成 symbols('x, y') - Krastanov
2
如果你收到了“不可调用”错误,那么你可能忘记了“s”:symbols('x y')。 - smichr

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接