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。