如何用Python解决一对非线性方程?
使用Python解决一对非线性方程式的(最佳)方法是什么? (Numpy,Scipy或Sympy)
例如:
- x + y ^ 2 = 4
- e ^ 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]
第一个参数是方程列表,第二个是variables列表,第三个是初始猜测。
你可以使用openopt包和它的NLP方法。 它有许多dynamic规划algorithm来解决非线性代数方程组成:
goldenSection,scipy_fminbound,scipy_bfgs,scipy_cg,scipy_ncg,amsg2p,scipy_lbfgsb,scipy_tnc,bobyqa,ralg,ipopt,scipy_slsqp,scipy_cobyla,lincher,algencan,您可以从中select。
后面的一些algorithm可以解决约束非线性规划问题。 所以,你可以引入你的系统方程openopt.NLP()这样的function:
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的第一个雅可比近似找出一个函数的根。
这种方法也被称为“Broyden的好方法”。
试试这个,我向你保证它会完美的工作。
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秒。
而且我build议你不要使用Sympy的function< – 确实方便,但在速度方面,这是相当缓慢的。 你会看见。