Scipy - 非线性方程组的所有解法

时间:2015-06-16 20:26:28

标签: python numpy scipy equation-solving nonlinear-functions

我有一个非线性方程组,可以选择任何 n ,因此矢量 x =(x1,...,xn)的长度可以与众不同。例如,系统可以是这样的:

    f1(x1,...,xn) = sum( xi + xi^2 ) = 0, i={1,n}
    f2(x1,...,xn) = sum( e^xi + xi + sin(xi*pi) ) = 0, i={1,n}

根据this example,我使用scipy库的fsolve()来解决这样的NLE,但是对于每个* x = x0的初始近似,它只返回一个解。但由于 n 可能很大(例如, n = 100 ),并且可能有很多解决方案,因此初始化不是很有用条件 x = x0 用于查找每个解决方案。

那么,请你给我一个例子,如何在这种情况下通过fsolve()找到 所有 解决方案?或者通过任何其他简单的方法?

其他 例如,我有一个简单的系统:

def equations(p):
    x, y = p
    return (x**2-1, x**3-1)

根据不同的初始条件,我有不同的解决方案:     x,y = fsolve(方程式,(0,0))     (0.0,0.0)

x, y =  fsolve(equations, (1, 1))
(1.0, 1.0)

x, y =  fsolve(equations, (-1, 1))
(-0.47029706057873205, 0.41417128904566508)

是否可以使用任何Scipy函数(如fsolve())来查找所有解决方案(根),例如:     x,y = some_scipy_solver(方程式,(x0,y0))     1.(1.0,1.0)     2.(0.0,0.0)     3.(-0.47029706057873205,0.41417128904566508)     ...

其中(x0,y0)=任何初始近似值:(0,0),(1,1),( - 1,1),(0.1,10.0)等,其中我只确定x0的约束,y0,像那样:-1.0< = x0< 1.0,0.0< = x0< 11.0。

1 个答案:

答案 0 :(得分:1)

即使对于单个非线性方程,也很难(或不可能)在数字上找到所有解。例如,考虑等式,

sin(1/x) = 0

在区间[0, 1]中具有无限的解决方案:使用典型的根查找算法无法解决此问题。

特别是,scipy.optimize.fsolve使用局部优化方法来找到给定方程的一个解。从概念上讲,您无法使用它(或scipy模块中的任何其他内容)来查找所有可能的解决方案。当然,如果您知道系统具有给定数量的解决方案,您可以随意将初始条件设置为fsolve(正如您所做的那样),直到您找到所有这些解决方案。但是,没有一般方法可以解决这个问题。

相反,如果它足够简单,那么使用sympy分析解决系统可能会更好。