Как работает приближение равенства 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или какой-либо порог, подходящий для вас с учетом заявления.

Другие вопросы по тегам