Python:如何找到给定输入的方程值

时间:2016-03-25 12:07:23

标签: python numpy cvxpy

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

最简单的方法是创建一个函数,接受一个参数并返回值。

但问题是,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时?

3 个答案:

答案 0 :(得分:2)

设置变量的值,然后您可以获取表达式的值,如下所示:

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

(虽然它不会对x = 20起作用,因为那样你就会采用负数的平方根。)

答案 1 :(得分:0)

在Python中即时解释代码的一般解决方案是使用内置的eval(),但 eval对用户提供的输入很危险可以做各种各样的讨厌你的系统。

幸运的是,有一些方法可以使用其附加参数来“沙盒”eval,只为表达式提供对已知“安全”操作的访问权限。有an example如何将eval的访问限制为仅列入白名单的操作,并明确拒绝其访问内置插件。快速查看该实现看起来接近正确,但我不会声称它是万无一失的。

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

答案 2 :(得分:0)

与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适合。