2016-02-25 4 views
-1

Я пытаюсь решить систему уравнений в 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 должен иметь возможность найти решение правильно?

+1

Предупреждение [поясняется здесь] (http://www.mathworks.com/matlabcentral/answers/106744-solve-function-solution-question#answer_115763) – Daniel

+1

Существует множество ситуаций, в которых «N уравнений в N неизвестные "будут вызывать дополнительные или неточные решения. Это неизбежно из-за разницы между математической (абсолютной точностью) и реальными данными, не говоря уже о прецизионных ограничениях цифровой обработки данных. –

ответ

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

Который дал мне переменные, которые я искал.

Смежные вопросы