2015-11-01 3 views
0

В следующем коде я выполнил процедуру для создания случайной положительно определенной матрицы P.Как работает аппроксимация равенства Matlab?

Во-первых, я создал разложение по сингулярным значениям [U, S, V] случайного массива и я пытаюсь проверить, что на самом деле 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 

ответ

2

Ваша проблема не в том 0 представлен как -0.000 или 0.0000 (вы можете проверить это, запустив (-0) == 0), а то, что ценности, на самом деле просто очень мало (по сравнению к другим числам в матрице). Операции, такие как то, что вы делаете, всегда будут иметь небольшие ошибки из-за того, что числа с плавающей запятой представлены и обрабатываются.

Вместо того, чтобы проверить, что P=P', попробуйте подтвердить, что abs(P-P') < 0.000000001, или какой-либо порог подходит для вас, учитывая приложение.

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