Квадратный корень сингулярной матрицы в R
Мне нужно вычислить матрицу A по степени -1/2, что в основном означает квадратный корень из инверсии исходной матрицы.
Если A является сингулярным, то обобщенное обратное значение Мура-Пенроуза вычисляется с помощью функции ginv из пакета MASS, в противном случае регулярное обратное вычисляется с использованием функции решения.
Матрица А определена ниже:
A <- structure(c(604135780529.807, 0, 58508487574887.2, 67671936726183.9,
0, 0, 0, 1, 0, 0, 0, 0, 58508487574887.2, 0, 10663900590720128,
10874631465443760, 0, 0, 67671936726183.9, 0, 10874631465443760,
11315986615387788, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1), .Dim = c(6L,
6L))
Я проверяю сингулярность сравнением ранга и размерности.
rankMatrix(A) == nrow(A)
Приведенный выше код возвращает FALSE, поэтому я должен использовать ginv, чтобы получить обратное. Обратное значение A выглядит следующим образом:
A_inv <- ginv(A)
Квадратный корень обратной матрицы вычисляется с помощью функции sqrtm из пакета expm.
library(expm)
sqrtm(A_inv)
Функция возвращает следующую ошибку:
Ошибка в solve.default(X[ii, ii] + X[ij, ij], S[ii, ij] - sumU):
Лапак рутина zgesv: система точно единственная
Итак, как мы можем вычислить квадратный корень в этом случае? Обратите внимание, что матрица А не всегда является единственной, поэтому мы должны дать общее решение проблемы.
1 ответ
Ваш вопрос касается двух разных проблем:
- Обратная матрица
- Квадратный корень из матрицы
обратный
Обратного не существует для особых матриц. В некоторых приложениях, подход Мура-Пенроуза или другое обобщенное обратное может быть взято в качестве подходящей замены обратного. Тем не менее, обратите внимание, что в большинстве случаев компьютерные числа будут вызывать ошибки округления; и эти ошибки могут привести к тому, что единственная матрица будет выглядеть регулярно для компьютера или наоборот.
Если A
всегда показывает блочную структуру матрицы, которую вы даете, я предлагаю рассмотреть только ее недиагональный блок
A3 = A[ c( 1, 3, 4 ), c( 1, 3, 4 ) ]
A3
[,1] [,2] [,3]
[1,] 6.041358e+11 5.850849e+13 6.767194e+13
[2,] 5.850849e+13 1.066390e+16 1.087463e+16
[3,] 6.767194e+13 1.087463e+16 1.131599e+16
вместо всего A
для лучшей эффективности и меньшего количества вопросов округления. Оставшиеся 1-диагональные записи останутся 1 в обратном корне квадратного, поэтому нет необходимости загромождать вычисления с ними. Чтобы получить представление о влиянии этого упрощения, обратите внимание, что R может рассчитать
A3inv = solve(A3)
пока не смог вычислить
Ainv = solve(A)
Но нам не понадобится A3inverse, как станет ясно ниже.
Квадратный корень
Как правило, квадратный корень из матрицы A
будет существовать только в том случае, если матрица имеет диагональную жорданову нормальную форму ( https://en.wikipedia.org/wiki/Jordan_normal_form). Следовательно, по-настоящему общего решения проблемы не существует.
К счастью, подобно тому, как "большинство" (вещественных или комплексных) матриц являются обратимыми, "большинство" (вещественных или комплексных) матриц имеют диагональную комплексную жорданову нормальную форму. В этом случае жорданова нормальная форма
A3 = T·J·T⁻¹
можно рассчитать в R как таковой:
X = eigen(A3)
T = X$vectors
J = Diagonal( x=X$values )
Чтобы проверить этот рецепт, сравните
Tinv = solve(T)
T %*% J %*% Tinv
с A3
, Они должны совпадать (до ошибок округления), если A3
имеет диагональную жорданову нормальную форму.
поскольку J
является диагональным, его квадратный корень является просто диагональной матрицей квадратных корней
Jsqrt = Diagonal( x=sqrt( X$values ) )
чтобы Jsqrt·Jsqrt = J
, Более того, это подразумевает
(T·Jsqrt·T⁻¹)² = T·Jsqrt·T⁻¹·T·Jsqrt·T⁻¹ = T·Jsqrt·Jsqrt·T⁻¹ = T·J·T⁻¹ = A3
так что на самом деле мы получаем
√A3 = T·Jsqrt·T⁻¹
или в коде R
A3sqrt = T %*% Jsqrt %*% Tinv
Чтобы проверить это, рассчитайте
A3sqrt %*% A3sqrt
и сравнить с A3
,
Квадратный корень из обратного
Квадратный корень обратного корня (или, в равной степени, обратный корень квадратного) можно легко вычислить после вычисления диагональной жордановой нормальной формы. Вместо J
использование
Jinvsqrt = Diagonal( x=1/sqrt( X$values ) )
и рассчитать, аналогично приведенному выше,
A3invsqrt = T %*% Jinvsqrt %*% Tinv
и наблюдать
A3·A3invsqrt² = … = T·(J/√J/√J)·T⁻¹ = 1
единичная матрица, так что A3invsqrt является желаемым результатом.
В случае, если A3 не является обратимым, обобщенный обратный (не обязательно Moore-Penrose) может быть рассчитан путем замены всех неопределенных записей в Jinvsqrt
на 0, но, как я уже сказал выше, это следует делать с должной осторожностью в свете общего применения и его устойчивости к ошибкам округления.
В случае, когда A3 не имеет диагональной йордановой нормальной формы, квадратного корня нет, поэтому приведенные выше формулы приведут к другому результату. Чтобы не столкнуться с этим случаем во времена неудачи, лучше всего выполнить тест
A3invsqrt %*% A3 %*% A3invsqrt
достаточно близко к тому, что вы бы посчитали матрицей 1 (это применимо только в том случае, если A3 был обратим в первую очередь).
PS: обратите внимание, что вы можете поставить префикс знака ± для каждой диагональной записи Jinvsqrt
на ваш вкус.