首页 文章

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

提问于
浏览
1

我有一个非线性方程组,其中任何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()找到 All 解决方案?或者通过任何其他简单的方法?

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

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(equation,(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 回答

  • 1

    即使对于单个非线性方程,使用系统也很难(或不可能)找到所有解的数值 . 例如,考虑方程,

    sin(1/x) = 0
    

    [0, 1] 区间内有无穷无尽的解决方案:你无法用典型的根寻找算法来解决这个问题 .

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

    相反,如果它足够简单,你可能会更好地用sympy解析你的系统 .

相关问题