我正在使用MATLAB的fsolve
函数来求解非线性方程组。我有两个非线性方程,有两个变量(x,y);
我正在尝试为这两个变量找到所有可能的根。我注意到fsolve
只提供了一个根。怎么可能得到方程的所有根?
我的代码如下:
function F = fun(guess)
x = guess(1);
y = guess(2);
F = [2*x -y - exp(-x));
-x + 2*y - exp(-y) ];
end
调用函数:
guess = [-5 -5]
fsolve(@fun,guess);
答案 0 :(得分:0)
证明只有一个根,因此您无需进一步搜索。
从第二个等式,
-x + 2·y - exp(-y) = 0
⇒ x = 2·y - exp(-y)
将x
替换为第一个等式:
2·x - y - exp(-x) = 0
⇒ 2·(2y-exp(-y)) - y - exp(-(2y-exp(-y)) = 0
仅为y
的函数。标准微积分将显示此f(y)
单调递增,在y=-∞
处开始为负,在y=+∞
处为正。当您以相反的方式进行替换时,结果是相同的。这意味着两个方程只有1个同时的根。
QED。
答案 1 :(得分:0)
fsolve
不是全局解算器。有全局求解器(如遗传算法和模拟退火),但它们必须运行无限长的时间以保证返回的解决方案包含所有最小化器。另一方面,几乎所有其他优化求解器都是本地的,这意味着它们只能保证返回本地最小化器。
此外,除了不知道返回的解决方案是全局还是局部最小化器之外,通常无法确定问题有多少根。所以基本上,除了两个众所周知的案例之外,没有办法做你想做的事情:
1)如果问题是凸的,那么没有局部最小化器不是全局最小化器。因此,fsolve返回的任何内容都将成为全局最小化器。此外,这种最小化器几乎总是独一无二的。例外是技术上可以存在无数个解决方案,但它们都将被连接(如在特定平面上)。不存在有限数量的未连接的不同最小化器。
2)多项式具有我们可以唯一确定的明显数量的根。