2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




 
 Кто знает как MATLAB решает переопределённые СЛАУ?
Сообщение04.01.2012, 13:06 
Привет всем.
Есть проблема которая представляет собой переопределённую СЛАУ
дальше код

load Pw.txt; Pw
load Pi.txt; Pi

% Pw = [ 0.0 11.0 8.25 2.75 5.5 5.0 0.0 11.0 2.0 2.0 9.0 8.25 2.75;
% 0.0 0.0 0.0 0.0 0.0 6.0 0.0 0.0 0.0 6.0 0.0 0.0 0.0;
% 0.0 0.0 -4.5 -4.5 -3.5 -3.5 -0.75 -0.75 0.0 0.0 0.0 -1.81 -1.81 ]
% Pi = [ 95.0 592.0 472.0 232.0 350.0 362.0 97.0 592.0 184.0 263.0 501.0 467.0 224.0 ;
% 336.0 368.0 168.0 155.0 205.0 323.0 305.0 336.0 344.0 431.0 363.0 279.0 266.0 ]


m = 20
Q(1:4, 1) = [0; 0; 0; 1];
Q(1:4, 2) = [m; 0; 0; 1];
Q(1:4, 3) = [0; m; 0; 1];
Q(1:4, 4) = [m; m; 0; 1];
Q(1:4, 5) = [0; 0; m; 1];
Q(1:4, 6) = [m; 0; m; 1];
Q(1:4, 7) = [0; m; m; 1];
Q(1:4, 8) = [m; m; m; 1];


for i = 1:size(Pi, 2)
B(2*i - 1:2*i, 1) = Pi(1:2, i);
end

A1 = A_mat(Pw, Pi)

% 1 ) Вариант
% A1t = A1'
% AA1 = A1' * A1
% AB1 = A1' * B
% x1 = AA1 \ AB1

% 2 ) Вариант
x1 = A1 \ B

C(1:3, 1:4) = 0;

for i = 1:3
for j = 1:4
nn = (i - 1) * 4 + j;
if nn < 12
C(i, j) = x1(nn);
else
C(i, j) = 1;
end
end
end

C

Pw(4, 1:size(Pw, 2)) = 1

R = C * Pw

for i = 1:size(R, 2)
R1(1:2, i) = [(R(1, i)/ R(3, i)) ;(R(2, i) / R(3, i))];
end

%save out.txt R1 -ascii

for i = 1:size(R1, 2)
plot(R1(1, i), R1(2, i), 'o'), hold on, grid on
end

C

%R2 = B - A1*x1

Q2 = C * Q
for i = 1:size(Q2, 2)
Q3(1, i) = Q2(1, i) / Q2(3, i);
Q3(2, i) = Q2(2, i) / Q2(3, i);
end

%for i = 1:4
% plot(Q3(1, 1), Q3(2, 1), 'ob' ), grid on, hold on
% plot(Q3(1, 2), Q3(2, 2), 'og' ), grid on % green x
% plot(Q3(1, 3), Q3(2, 3), 'or' ), grid on % red y
% plot(Q3(1, 4), Q3(2, 4), 'ob' ), grid on % blue z
% axis([0 640 0 480])
%end
for i = 1:size(Q3, 2)
plot(Q3(1, i), Q3(2, i), '+'), grid on, hold on
end

там выделены 2 участка
1) это решение методом наименьших квадратов
2) это решение МАТЛАБА
так вот матлаб может решить эту систему, а МНК почему то нет((
если что не понятно пишите я ещё обьясню.

 
 
 
 Re: Кто знает как MATLAB решает переопределённые СЛАУ?
Сообщение07.01.2012, 13:54 
Ingener74 в сообщении #522848 писал(а):
Кто знает как MATLAB решает переопределённые СЛАУ?

Подайте команду help mldivide -- там всё написано.

Выражение типа A\B по-разному интерпретируется для квадратных и для неквадратных систем. Если система переопределена или недоопределена (неважно), то Матлаб пытается решать её именно методом наименьших квадратов, т.е. ищет именно псевдорешение. Но при этом (видимо, имея в виду, что система в любом случае в каком-то смысле, да некорректна) пытается сделать максимум возможного. Он решает систему A'A*X=A'B с помощью QR-разложения, и если видит, что матрица этой системы оказалась (с его точки зрения) вырожденной, т.е. что в системе оказались нулевые строчки, то просто зануляет свободные переменные, а оставшуюся часть системы дорешивает честно. В результате получается нечто удобоваримое -- если, конечно, матрица хорошо обусловлена в том смысле, что её нулевые (в пределах машинной точности) сингулярные числа существенно отделены от ненулевых, которые, в свою очередь, не сильно различаются по порядку.

Но вот квадратные системы она пытается решать тупо методом Гаусса. И если матрица вырождена, то получается, естественно, чёрт-те что.

Так вот: у Вас, судя по всему, матрица переопределённой системы оказалась именно неполного ранга (т.е. её столбцы -- линейно зависимыми; возможно -- просто одинаковыми или нулевыми по какой-либо рассеянности). И когда Вы просите Матлаб сосчитать A\B, тот охотно соглашается (но обязательно должен выдать при этом предупреждение о неполноте ранга). Но когда выписываете МНК самостоятельно в явном виде, подавая команду типа (A'A)\(A'B) -- то это уже решение квадратной системы, и ничего хорошего уже не получится.

 
 
 [ Сообщений: 2 ] 


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group