说,我有一个等式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时?
答案 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
适合。