Python:如何找到一个等式';给定输入的s值

Python:如何找到一个等式';给定输入的s值,python,numpy,cvxpy,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] 如何找到

比如说,我有一个方程
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]

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


基本上,在使用cvxpy时,是否有任何方法可以替代上述变量并找到方程的值?

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

幸运的是,有一些方法可以“沙盒”eval,使用它的附加参数只允许表达式访问已知的“安全”操作。如何将
eval
的访问权限限制为仅白名单上的操作,并明确拒绝其对内置操作的访问,还有很多问题需要解决。快速查看一下该实现看起来几乎是正确的,但我不会声称它是万无一失的


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

在Python中动态解释代码的一般解决方案是使用内置的eval,但用户提供的输入会对系统造成各种恶劣影响

幸运的是,有一些方法可以“沙盒”eval,使用它的附加参数只允许表达式访问已知的“安全”操作。如何将
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
安装到相关函数中。

与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
,因为这样你将取一个负数的平方根)。

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

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

(虽然它对
x=20
不起作用,因为这样你就需要取一个负数的平方根)。

尝试并
sympy.evalf
@msw谢谢你的快速回复。我正在使用cvxpy创建方程,sympy不是我的选项。无法在使用cvxpy创建的方程式上使用sympy.sympify。您要解决的最大问题是什么?cvxpy用于寻找最大值和最小值,而不是简单地计算表达式。我试图使用DC编程解决一个优化问题。在这里,我需要找到g(x)在x=k处的值,问题也是如此,那么为什么需要在某一点计算表达式呢?cvxpy应该为您做优化。请尝试并
sympy.evalf
@msw感谢您的快速回复。我正在使用cvxpy创建方程,sympy不是我的选项。无法在使用cvxpy创建的方程式上使用sympy.sympify。您要解决的最大问题是什么?cvxpy用于寻找最大值和最小值,而不是简单地计算表达式。我试图使用DC编程解决一个优化问题。在这里,我需要找到g(x)在x=k处的值,问题也是如此,那么为什么需要在某一点计算表达式呢?cvxpy应该为您进行优化。我如何告诉eval()为变量x使用特定值?只需分配它<编码>x=3;eval('x+2')#=>5
。如何告诉eval()对变量x使用特定值?只需赋值即可<编码>x=3;eval('x+2')#=>5。