対の非線形方程式をPythonで解く(最良の)方法は何ですか?(numpyの、scipyのダウンロードまたはSympy)Pythonを使って一対の非線形方程式を解く方法は?
例えば:
- X + Y^2 = 4
- E^X + XY = 3
コードスニペットれます上記のペアを解決すると、数値解決のためには
対の非線形方程式をPythonで解く(最良の)方法は何ですか?(numpyの、scipyのダウンロードまたはSympy)Pythonを使って一対の非線形方程式を解く方法は?
例えば:
- X + Y^2 = 4
- E^X + XY = 3
コードスニペットれます上記のペアを解決すると、数値解決のためには
使用fsolveは:あなたはnsolveを使用することができますsympyご希望の場合は
http://docs.scipy.org/doc/scipy/reference/generated/scipy.optimize.fsolve.html#scipy.optimize.fsolve
from scipy.optimize import fsolve
import math
def equations(p):
x, y = p
return (x+y**2-4, math.exp(x) + x*y - 3)
x, y = fsolve(equations, (1, 1))
print equations((x, y))
。
>>> nsolve([x+y**2-4, exp(x)+x*y-3], [x, y], [1, 1])
[0.620344523485226]
[1.83838393066159]
最初の引数が式のリストであり、第二は、変数のリストであり、第3の初期推定です。
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]
: だから、あなたはこのような機能をopenopt.NLP()に方程式のシステムを導入することができますそして、IDLで指数)が、私はPythonでそれを試していない:
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"とも呼ばれます。
なぜこれがダウン投票されていますか?進める正当な方法のようです... – aquirdturtle
これを試してみてください。完全に動作することをお約束します。
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の機能を使用しないことをお勧めします。< - 実際には便利ですが、スピードに関してはかなり遅いです。あなたが表示されます。
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])
'sage'できます。 – Blender
yea私はそれを知っています...私は式の異なるセットに対してそれを繰り返し実行したいので、Pythonでやりたいと思います。 – AIB
Pythonスクリプトから 'sage'をインポートできます。 – Blender