Python:如何找到给定输入的等式值

Python: How do i find an equation's value for a given input

比如说,我有一个等式 f(x) = x**2 + 1,我需要找到 f(2) 的值。

最简单的方法是创建一个函数,接受一个参数和 return 值。

但问题是,f(x)是动态创建的,所以不能事先写一个函数来获取值。

我正在使用 cvxpy 作为优化值。该等式如下所示:

x = cvx.Variable()
Si = [(cvx.square(prev[i] + cvx.sqrt(200 - cvx.square(x))) for i in range(3)]

prev 是一个数字数组。会有Si[0] Si[1] Si[2].

如何找到 Si[0] for x=20 的值?

基本上,在使用 cvxpy 时,有什么方法可以替换上述变量并找到方程的值吗?

在 Python 中即时解释代码的一般解决方案是使用内置 eval() 但是 eval 对于用户提供的输入是危险的 这可能会对您的系统造成各种不良影响。

幸运的是,有一些方法可以 "sandbox" eval 使用它的附加参数来只给表达式访问已知的 "safe" 操作。 an example 如何将 eval 的访问权限限制为仅列入白名单的操作,并明确拒绝其对内置函数的访问权限。快速浏览一下该实现看起来很接近正确,但我不会说它是万无一失的。

我在评论中提到的 sympy.sympify 在内部使用 eval() 并带有相同的警告。

与您的 cvx 版本并行,您可以使用 lambda 动态定义函数:

f=[lambda x,i=j : (prev[i] + (200 - x*x)**.5)**2 for j in range(3)] #(*)

然后可以计算f[0](20)f[1](20),依此类推。

(*) 需要 i=j 来适应相关函数中的每个 j

设置变量的值,然后就可以得到表达式的值,像这样:

>>> x.value = 3
>>> Si[0].value
250.281099844341

(尽管它不适用于 x = 20,因为那样你会取负数的平方根)。