2012-01-05 25 views
46

対の非線形方程式をPythonで解く(最良の)方法は何ですか?(numpyの、scipyのダウンロードまたはSympy)Pythonを使って一対の非線形方程式を解く方法は?

例えば:

  • X + Y^2 = 4
  • E^X + XY = 3

コードスニペットれます上記のペアを解決すると、数値解決のためには

+1

'sage'できます。 – Blender

+0

yea私はそれを知っています...私は式の異なるセットに対してそれを繰り返し実行したいので、Pythonでやりたいと思います。 – AIB

+0

Pythonスクリプトから 'sage'をインポートできます。 – Blender

答えて

25

>>> nsolve([x+y**2-4, exp(x)+x*y-3], [x, y], [1, 1]) 
[0.620344523485226] 
[1.83838393066159] 

最初の引数が式のリストであり、第二は、変数のリストであり、第3の初期推定です。

1

openoptパッケージとそのNLPメソッドを使用できます。これは、からなる非線形代数方程式を解くために多くの動的なプログラミングアルゴリズムを持っています
goldenSection、scipy_fminbound、scipy_bfgs、scipy_cg、scipy_ncg、amsg2p、scipy_lbfgsb、scipy_tnc、bobyqa、ralg、ipopt、scipy_slsqp、scipy_cobyla、lincher、algencan、いることができますから選ぶ。
後者のアルゴリズムのいくつかは、制約付き非線形計画問題を解くことができます。私は結合された非線形方程式(一般的に関与する多項式のために働くブロイデン法を得た

lambda x: x[0] + x[1]**2 - 4, np.exp(x[0]) + x[0]*x[1]

0

: だから、あなたはこのような機能をopenopt.NLP()に方程式のシステムを導入することができますそして、IDLで指数)が、私はPythonでそれを試していない:

http://docs.scipy.org/doc/scipy/reference/generated/scipy.optimize.broyden1.html#scipy.optimize.broyden1

scipyのダウンロードを。 optimize.broyden1

scipy.optimize.broyden1(F, xin, iter=None, alpha=None, reduction_method='restart', max_rank=None, verbose=False, maxiter=None, f_tol=None, f_rtol=None, x_tol=None, x_rtol=None, tol_norm=None, line_search='armijo', callback=None, **kw)[source] 

Broyden初のヤコビアンの近似を使用して、機能のルートを検索します。

この方法は、 "Broyden's good method"とも呼ばれます。

+1

なぜこれがダウン投票されていますか?進める正当な方法のようです... – aquirdturtle

0

これを試してみてください。完全に動作することをお約束します。

import scipy.optimize as opt 
    from numpy import exp 
    import timeit 

    st1 = timeit.default_timer() 

    def f(variables) : 
     (x,y) = variables 

     first_eq = x + y**2 -4 
     second_eq = exp(x) + x*y - 3 
     return [first_eq, second_eq] 

    solution = opt.fsolve(f, (0.1,1)) 
    print(solution) 


    st2 = timeit.default_timer() 
    print("RUN TIME : {0}".format(st2-st1)) 

-> 

[ 0.62034452 1.83838393] 
RUN TIME : 0.0009331008900937708 

FYI。上記のように、 'broydenの近似'を 'fsolve'を 'broyden1'に置き換えることもできます。できます。やったよ。

Broydenの近似の仕組みは正確にはわかりませんが、0になりました。02秒。

そして、私は、あなたがSympyの機能を使用しないことをお勧めします。< - 実際には便利ですが、スピードに関してはかなり遅いです。あなたが表示されます。

0
from scipy.optimize import fsolve 

def double_solve(f1,f2,x0,y0): 
    func = lambda x: [f1(x[0], x[1]), f2(x[0], x[1])] 
    return fsolve(func,[x0,y0]) 

def n_solve(functions,variables): 
    func = lambda x: [ f(*x) for f in functions] 
    return fsolve(func, variables) 

f1 = lambda x,y : x**2+y**2-1 
f2 = lambda x,y : x-y 

res = double_solve(f1,f2,1,0) 
res = n_solve([f1,f2],[1.0,0.0]) 
関連する問題