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

问题描述 投票:0回答:2

我有一个非线性方程组(NLE),其中可以选择任何 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}

根据这个例子,我使用 scipy 库的 fsolve() 来求解这样一个 NLE 系统,但它对于 x = x0 的每个初始近似值仅返回一个解。但由于 n 可能很大(例如,n = 100),并且可能有很多解,因此为找到每个解而设定初始条件 x = x0 并不是很有用。

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

补充 例如,我有以下简单的系统:

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

不同的初始条件我有不同的解决方案:

x, y =  fsolve(equations, (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(equations, (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.

python numpy scipy equation-solving nonlinear-functions
2个回答
4
投票

即使对于单个非线性方程,从数值上找到所有解也可能很困难(或不可能),更不用说系统了。例如,考虑方程,

sin(1/x) = 0

在区间内有无穷多个解

[0, 1]
:你无法用典型的求根算法来解决这个问题。

特别是,

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

相反,如果它足够简单,您可能会更幸运地使用 sympy 分析解决系统问题。


0
投票

ipywidgets
你就可以做到。根将在 -100 .. 100

范围内无影响地改变
def root_finder(x):
    print('Root is %.3f' %fsolve(funct,x))
    
widgets.interact(root_finder,x=(-100,100,0.5));
© www.soinside.com 2019 - 2024. All rights reserved.