Как работает приближение равенства Matlab?
В следующем коде я следовал процедуре для создания случайной положительно определенной матрицы P.
Сначала я создал разложение по единственному значению [U,S,V] случайного массива A, и я пытаюсь проверить, что на самом деле U '* U == U * U' = I (где I - единичная матрица) который известен из теории. Проблема в том, что если я сам проверяю содержимое матриц, я могу это проверить, но Matlab создает логическую матрицу, которая не проверяет, что, поскольку ноль представлен как -0.000 или 0.0000, так что результат равен 1, только если знаки совпадают. Это почему?
Но большая проблема возникает в несколько строк ниже этого, где создается положительно определенная (все ее собственные значения положительны) матрица P, и я просто хочу проверить, что P = P '. Нажав на x и y, я вижу, что их содержимое точно такое же, но Matlab также не может это проверить. Я не понимаю, почему это происходит, поскольку в данном случае речь идет об одной и той же переменной P, которая просто транспонируется.
Вот код:
%Dimension of the problem
n = 100;
%Random matrix A
A = rand(n, n)*10 - 5;
%Singular value decomposition
[U, S, V] = svd(A);
%Verification that U*U'=U'*U=I
U'*U == U*U'
%Minimum eigenvalue of S
l_min = min(diag(S));
%Maximum eigenvalue of S
l_max = max(diag(S));
%The rest of the eigenvalues are distributed randomly between the minimum
%and the maximum value
z = l_min + (l_max - l_min)*rand(n - 2, 1);
%The vector of the eigenvalues
eig_p = [l_min; l_max; z];
%The Lambda diagonal matrix
Lambda = diag(eig_p);
%The P matrix
P = U*Lambda*U';
%Verification that P is positive definite
all(eig(P) > 0)
%Verification that P=P'
x=P;
y=P';
x==y
1 ответ
Ваша проблема не в том 0
представляется как -0.000
или же 0.0000
(вы можете проверить это, запустив (-0) == 0
), а скорее, что значения на самом деле просто очень малы (по сравнению с другими числами в матрице). Такие операции, как то, что вы делаете, всегда будут иметь небольшие ошибки из-за способа представления чисел с плавающей запятой и манипулирования ими.
Вместо того, чтобы проверить это P=P'
попробуйте проверить это abs(P-P') < 0.000000001
или какой-либо порог, подходящий для вас с учетом заявления.