求解方程组时的伪解

Spurious solutions when solving system of equations

我正在尝试在 Matlab 中求解方程组。

方程组定义如下:

syms x1 x2 lambda
Grad =

2*lambda*x1 + (8*x1*(((x2 - 10)^2 + x1^2)^(1/2) - 10))/((x2 - 10)^2 + x1^2)^(1/2) + (4*x1*(((x2 + 10)^2 + x1^2)^(1/2) - 10))/((x2 + 10)^2 + x1^2)^(1/2) - 5
2*lambda*x2 + (4*(((x2 - 10)^2 + x1^2)^(1/2) - 10)*(2*x2 - 20))/((x2 - 10)^2 + x1^2)^(1/2) + (2*(((x2 + 10)^2 + x1^2)^(1/2) - 10)*(2*x2 + 20))/((x2 + 10)^2 + x1^2)^(1/2) - 10
x1^2 + x2^2 - 36

我尝试使用以下方法解决它:

[X1 X2 LAMBDA] = solve([Grad(1) == 0, Grad(2) == 0, Grad(3) == 0],[x1, x2, lambda]);

[X1 X2 LAMBDA] = solve(Grad,[x1, x2, lambda]);

但是我得到错误:

Warning: Possibly spurious solutions. 
> In symengine
In mupadengine/evalin (line 102)
In mupadengine/feval (line 158)
In solve (line 292)
In Ex (line 63) 

我不明白为什么Matlab会这样,我有三个方程三个变量,所以Matlab应该能找到解吧?

可以通过将值代回等式并检查值是否正确来确定答案:

[X1, X2, LAMBDA] = solve([Grad(1) == 0, Grad(2) == 0, Grad(3) == 0],[x1, x2, lambda]);
clc;
X1 = double(X1); X2 = double(X2); LAMBDA = double(LAMBDA);
X1 = real(X1); X2 = real(X2); LAMBDA = real(LAMBDA);

i = 1;
while i < 17
Sub(i,:) = subs(Grad,[x1, x2, lambda],[X1(i),X2(i),LAMBDA(i)]);
if abs(Sub(i,1)) < 0.00001 & abs(Sub(i,2)) < 0.00001 & abs(Sub(i,3)) < 0.00001
    I(i,:) = i; 
    Var(i,1) = X1(i); Var(i,2) = X2(i); Var(i,3) = LAMBDA(3);
end
i = i + 1;
end

我已经知道我的 x1 和 x2 值的近似值(来自我使用的另一种优化技术),因此我可以轻松地 运行 检查是否找到了正确的值(它们是)。我也知道只有真实的部分是相关的。

FF = find(Var(:,1)>5&Var(:,1)<6&Var(:,2)>1&Var(:,2)<2);
RealVar = Var(FF,:)

这给了我正在寻找的变量。