関数 (y = x**2 など) を取り込んでおり、x について解く必要があります。これを手動で骨の折れる方法で解決できることはわかっていますが、代わりに使用する方法を見つけようとしています。numpy、scipy、sympy を閲覧しましたが、探しているものが見つからないようです。現在、関数からラムダを作成しているので、メソッドのフォーマットを維持できればいいのですが、必須ではありません。
ありがとう!
数値解を探している場合 (つまり、記号的な閉じた形式の解ではなく、数値にのみ関心がある場合)、SciPy.optimizeモジュールにはいくつかのオプションがあります。単純なものの場合、newton
単純な多項式の開始点としてはかなり適切ですが、そこから取得することもできます。
シンボリック ソリューション (つまり、y = x**2 -> x = +/- sqrt(y) を取得する) の場合、 SymPy ソルバーはおおよそ必要なものを提供します。SymPy パッケージ全体は、シンボリック操作を行うことを目的としています。
Pythonインタープリターを使用して、質問で言及されている方程式を解く例を次に示します。SymPy パッケージがインストールされていることを確認する必要があります。
>>>> from sympy import * # we are importing everything for ease of use
>>>> x = Symbol("x")
>>>> y = Symbol("y") # create the two variables
>>>> equation = Eq(x ** 2, y) # create the equation
>>>> solve(equation, x)
[y**(1/2), -y**(1/2)]
ご覧のように、インタラクティブな代数システムとしても、基本はかなり機能します。Mathematicaほど良くはありませんが、無料で自分のプログラムに組み込むことができます。適切な方程式をエンコードする方法については、SymPy ドキュメントの落とし穴と落とし穴のセクションを必ずお読みください。
これがすべて、方程式の迅速で汚い解を得るためのものである場合、常にWolfram Alphaがあります。
scipy.optimize.newton経由で Newton-Raphson を使用します。方程式の根、つまりf( x ) = 0 となるxの値を見つけます。この例では、関数 f( x ) = x ² - yの根を探すように問題をキャストできます。yを計算するラムダを指定すると、次のように一般的なソリューションを提供できます。
def inverse(f, f_prime=None):
def solve(y):
return newton(lambda x: f(x) - y, 1, f_prime, (), 1E-10, 1E6)
return solve
この関数の使い方はとても簡単です:
>>> sqrt = inverse(lambda x: x**2)
>>> sqrt(2)
1.4142135623730951
>>> import math
>>> math.sqrt(2)
1.4142135623730951
入力関数によっては、パラメーターを に調整する必要がある場合がありますnewton()
。現在のバージョンは、1 の開始推測、10 -10の許容誤差、および 10 6の最大反復回数を使用します。
さらに高速化するために、問題の関数の導関数を指定できます。
>>> sqrt = inverse(lambda x: x**2, lambda x: 2*x)
実際、それがなければ、関数は微分を知ることに依存するニュートン・ラフソン法ではなく、正割法を実際に使用します。
SymPy、特にソルバーをチェックしてください。