使用Python解決對非線性方程式的(最佳)方法是什麼?(numpy的,SciPy的或Sympy)如何使用Python解決一對非線性方程?
例如:
- X + Y^2 = 4
- E 1 X + XY = 3
的代碼段,其解決上述對會很大
使用Python解決對非線性方程式的(最佳)方法是什麼?(numpy的,SciPy的或Sympy)如何使用Python解決一對非線性方程?
例如:
- X + Y^2 = 4
- E 1 X + XY = 3
的代碼段,其解決上述對會很大
爲數值解,你可以使用fsolve:
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))
如果你喜歡sympy你可以使用nsolve。
>>> nsolve([x+y**2-4, exp(x)+x*y-3], [x, y], [1, 1])
[0.620344523485226]
[1.83838393066159]
第一個參數是方程列表,第二個是變量列表,而第三種是一個初始猜測。
您可以使用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,它你可以從中選擇。
後面的一些算法可以解決約束非線性規劃問題。 所以,你可以介紹一下你的方程系統openopt.NLP()具有這樣的功能:
lambda x: x[0] + x[1]**2 - 4, np.exp(x[0]) + x[0]*x[1]
我的Broyden的方法耦合非線性方程(通常涉及多項式工作和指數)的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的好方法」。
這是爲什麼被低估?看起來像一個合法的方式繼續... – aquirdturtle 2017-04-24 03:33:03
試試這個,我向你保證它會完美的工作。
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
僅供參考。如上所述,您也可以用'broyden1'代替'fsolve'來使用'Broyden's approximation'。有用。我做的。
我不確切知道Broyden的逼近是如何工作的,但它花了0。02 s。
我建議你不要使用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 2012-01-05 07:51:40
是的,我知道這一點..我希望在python中做到這一點,因爲我想重複做不同的方程組 – AIB 2012-01-05 07:53:11
您可以從任何Python腳本中導入sage。 – Blender 2012-01-05 15:03:10