2017-06-19 9 views
1

与えられた式は、未知の変数(y)とパラメータのセットに依存します。私は、パラメータの値を持つグリッドの各要素を与えられたとき、yについて数値的に解いてみたいと思います。私の未遂ソリューションのPython - Sympy - グリッド内の複数のパラメータに対して数式を数値的に解く

簡略化した例は以下のように(yは未知の変数、xはパラメータである)されています。しかし、私は次のエラーを取得しています

import numpy as np 
import sympy as sp 
x,y=sp.symbols('x y') 
xgrid=np.arange(1,6) 
f = sp.lambdify(x,sp.nsolve(x**2+y,y,2),"numpy") 
print(f(xgrid)) 

:「一次元期待と数値関数 "である。私はxgridのすべての値xに対してy = -x ** 2のベクトルを受け取ることを期待していました。

実際の関心関数は、例のようにy = -x ** 2ではなく、yのxの両方に暗黙の非線形関数であることに注意してください。

グリッド内の各値をループする必要がありますか、それとも何とかlambdifyを使用できますか?前もって感謝します!

答えて

1

sympy.lambdifyの目的は、シンボリックの表現を数値に変換することです。後者は(デフォルトでは)数値関数であるため、「ラムディファー」の意味はありません。sympy.nsolvesympy.nsolveの "ラッパー"関数を定義する必要がある場合は、標準的なpythonの方法を使用してください。関数は、スカラー引数を受け付けて今xfridndarrayあるf(xgrid)を呼び出す

def f(x): 
    y = sp.symbols('y') 
    return float(sp.nsolve(x**2+y,y,2)) 

は意味がありません。ループを書く必要があります。あなたが怠け者だと思うなら、便利なnp.vectorize関数を使うことができます。関数はスカラー引数に対してのみ定義されていても、ndarraysのために評価されます。しかし、このアプローチは本質的にループの短縮形である、すなわち、明示的にループを記述したのと全く同じ計算を実行することに留意されたい。

f = np.vectorize(f) 
f(xgrid) 

array([ -1., -4., -9., -16., -25.])

1

この行f = sp.lambdify(x, sp.nsolve(x**2+y,y,2),"numpy")が実行されている場合、最初のpythonはsp.nsolve(x**2+y, y, 2)を実行します。それはあなたのコード上の問題であり、SymPyは2つの未知数で解決する1つの方程式を持っています。

+0

ありがとうございます!グリッド内の各値をループさせなければならないのでしょうか、それとも何とかlambdifyを使用できますか? – CarlosH

+0

私は悲しいことにループを言うだろう – glegoux

+0

ありがとう。質問を編集して、誰かがより効率的なソリューションを提案できるかどうかを確認しました。今から1週間以内に返事がない人がいれば、私はあなたが解決したように質問します。再度、感謝します。 – CarlosH

関連する問題