2016-03-25 4 views
0

私は式f(x) = x**2 + 1を持っています。f(2)の値を見つける必要があります。Python:与えられた入力の方程式の値を見つけるにはどうすればいいですか

最も簡単な方法は、関数を作成し、パラメータを受け入れて値を返すことです。

しかし、問題は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を使用する場合は、

+1

[sympy.sympify](http://docs.sympy.org/dev/tutorial/basic_operations.html#converting-strings-to-sympy-expressions)と 'sympy.evalf'を試してください。 – msw

+0

@msw素早い返信をありがとう。私は方程式を作成するためにcvxpyを使用しています。sympyは私の選択肢ではありません。 cvxpyを使用して作成された式でsympy.sympifyを使用できません。 – Sanjay

+0

あなたが解決しようとしているより大きな問題は何ですか? cvxpyは単に式を評価するのではなく、最大値と最小値を見つけるためのものです。 –

答えて

2

変数の値を設定して、あなたがそうのように、式の値を取得することができます:あなたは平方根をとることと思いますので、それはx = 20のために動作しませんが(

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

負の数)。

0

オンザフライでのPythonのコードを解釈するための一般的な解決策はeval()ビルトインを使用することですが、のevalは、お使いのシステムに厄介なのすべてのソートを行うことができ、ユーザが供給される入力と危険です。

幸いにも、追加パラメータを使用してevalを "サンドボックス"して、既知の "安全な"操作への式アクセスのみを与える方法があります。 evalのアクセスをホワイトリストに登録した操作のみに制限する方法については、an exampleがあり、特に組み込み機能へのアクセスを拒否しています。その実装をすばやく見て正しいように見えるが、私はそれが絶対確実だと主張しません。

sympy.sympify私のコメントに記載されているのはeval()で、同じ警告が表示されます。あなたのCVXのバージョンと並行して

+0

変数xに特定の値を使用するようeval()に指示するにはどうすればよいですか? – Sanjay

+0

それを割り当てるだけです。 'x = 3; eval( 'x + 2')#=> 5' –

0

、あなたはその場で関数を定義するためにラムダを使用することができます。

f=[lambda x,i=j : (prev[i] + (200 - x*x)**.5)**2 for j in range(3)] #(*) 

次に、あなたはそうでf[0](20)f[1](20)を評価し、することができます。

(*)対応する機能に各jを適合させるにはi=jが必要です。

関連する問題