Python:如何找到给定输入的等式值
Python: How do i find an equation's value for a given input
比如说,我有一个等式 f(x) = x**2 + 1
,我需要找到 f(2)
的值。
最简单的方法是创建一个函数,接受一个参数和 return 值。
但问题是,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 时,有什么方法可以替换上述变量并找到方程的值吗?
在 Python 中即时解释代码的一般解决方案是使用内置 eval() 但是 eval 对于用户提供的输入是危险的 这可能会对您的系统造成各种不良影响。
幸运的是,有一些方法可以 "sandbox" eval 使用它的附加参数来只给表达式访问已知的 "safe" 操作。 an example 如何将 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
。
设置变量的值,然后就可以得到表达式的值,像这样:
>>> x.value = 3
>>> Si[0].value
250.281099844341
(尽管它不适用于 x = 20
,因为那样你会取负数的平方根)。
比如说,我有一个等式 f(x) = x**2 + 1
,我需要找到 f(2)
的值。
最简单的方法是创建一个函数,接受一个参数和 return 值。
但问题是,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 时,有什么方法可以替换上述变量并找到方程的值吗?
在 Python 中即时解释代码的一般解决方案是使用内置 eval() 但是 eval 对于用户提供的输入是危险的 这可能会对您的系统造成各种不良影响。
幸运的是,有一些方法可以 "sandbox" eval 使用它的附加参数来只给表达式访问已知的 "safe" 操作。 an example 如何将 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
。
设置变量的值,然后就可以得到表达式的值,像这样:
>>> x.value = 3
>>> Si[0].value
250.281099844341
(尽管它不适用于 x = 20
,因为那样你会取负数的平方根)。