0

说,我有一个方程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 时,有什么方法可以替换上述变量并找到方程的值?

4

3 回答 3

2

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

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

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

于 2016-03-25T13:18:28.453 回答
0

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

幸运的是,有一些方法可以使用其附加参数来“沙箱”评估,以仅让表达式访问已知的“安全”操作。有一个示例说明如何将访问限制eval为仅列入白名单的操作,并明确拒绝它访问内置程序。快速浏览一下该实现看起来接近正确,但我不会声称它是万无一失的。

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

于 2016-03-25T12:34:53.993 回答
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相关函数。

于 2016-03-25T12:53:14.223 回答