求解方程组时的虚假解

时间:2016-02-25 12:18:57

标签: matlab solver

我试图在Matlab中解决方程组。

方程组定义如下:

B

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

from __future__ import print_function

class A(object):
    def __init__(self):
        print("A")
        super(A, self).__init__()

class B(object):
    def __init__(self):
        print("B")
        super(B, self).__init__()

class C(A,B):
    def __init__(self):
        print("C")
        super(C, self).__init__()

>>> C.mro()
[__main__.C, __main__.A, __main__.B, object]
>> C()
C
A
B

但我收到错误:

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

我不明白为什么Matlab会这样做,我有三个带有三个变量的方程式,所以Matlab应该能够找到合适的解决方案吗?

1 个答案:

答案 0 :(得分:0)

可以通过将值替换回等式并检查值是否正确来解决答案:

[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,:)

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