2012-01-05 112 views
46

使用Python解决对非线性方程式的(最佳)方法是什么?(numpy的,SciPy的或Sympy)如何使用Python解决一对非线性方程?

例如:

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

的代码段,其解决上述对会很大

+1

'sage'可以做到这一点。 – Blender 2012-01-05 07:51:40

+0

是的,我知道这一点..我希望在python中做到这一点,因为我想重复做不同的方程组 – AIB 2012-01-05 07:53:11

+0

您可以从任何Python脚本中导入sage。 – Blender 2012-01-05 15:03:10

回答

25

如果你喜欢sympy你可以使用nsolve

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

第一个参数是方程列表,第二个是变量列表,而第三种是一个初始猜测。

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,它你可以从中选择。
后面的一些算法可以解决约束非线性规划问题。 所以,你可以介绍一下你的方程系统openopt.NLP()具有这样的功能:

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

0

我的Broyden的方法耦合非线性方程(通常涉及多项式工作和指数)的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的好方法”。

+1

这是为什么被低估?看起来像一个合法的方式继续... – aquirdturtle 2017-04-24 03:33:03

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 

仅供参考。如上所述,您也可以用'broyden1'代替'fsolve'来使用'Broyden's approximation'。有用。我做的。

我不确切知道Broyden的逼近是如何工作的,但它花了0。02 s。

我建议你不要使用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])