如何用Python求解一对非线性方程组?

2024-04-26 21:55:02 发布

您现在位置:Python中文网/ 问答频道 /正文

使用Python解决一对非线性方程的(最好的)方法是什么。(Numpy、Scipy或Sympy)

例如:

  • x+y^2 = 4
  • e^x+ xy = 3

一个代码片段可以解决上述问题


Tags: 方法代码numpyscipy方程sympyxy
3条回答

如果您喜欢sympy,可以使用nsolve

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

第一个参数是方程组,第二个是变量组,第三个是初始猜测。

试试这个,我向你保证它会工作得很好。

    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

仅供参考。如上所述,您还可以使用“Broyden近似”将“fsolve”替换为“broyden1”。它起作用了。我做到了。

我不知道Broyden的近似是如何工作的,但它花了0.02s

我建议您不要使用Sympy的功能<;-确实很方便,但在速度方面,它相当慢。你会明白的。

对于数值解,可以使用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))

相关问题 更多 >