Квадратный корень особой матрицы в R

Мне нужно вычислить матрицу A в степени -1/2, что в основном означает квадратный корень из обратной исходной матрицы.

Если A является сингулярным, то обобщенное обратное значение Мура-Пенроуза вычисляется с помощью функции ginv из пакета MASS, в противном случае обычное обратное вычисляется с помощью функции решить.

Матрица A определена ниже:

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)

Функция возвращает следующую ошибку:

Ошибка в файле resolve.default (X [ii, ii] + X [ij, ij], S [ii, ij] - sumU):
Процедура Lapack zgesv: система в точности сингулярна

Итак, как мы можем вычислить квадратный корень в этом случае? Обратите внимание, что матрица A не всегда является сингулярной, поэтому мы должны предоставить общее решение проблемы.


person GyD    schedule 30.01.2015    source источник
comment
Вычислите разложение по сингулярным числам. Делайте все, что хотите, с диагональной матрицей посередине.   -  person tmyklebu    schedule 30.01.2015


Ответы (1)


Ваш вопрос касается двух разных проблем:

  1. Обратная матрица
  2. Квадратный корень из матрицы

Обратный

Обратного не существует для сингулярных матриц. В некоторых приложениях подход Мура-Пенроуза или другой обобщенный обратный ход можно использовать в качестве подходящей замены обратного. Однако учтите, что компьютерные числа в большинстве случаев приводят к ошибкам округления; и эти ошибки могут сделать сингулярную матрицу регулярной для компьютера или наоборот.

Если 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.

Квадратный корень из обратного

Квадратный корень из обратного (или, что то же самое, из обратного корня sqare) может быть легко вычислен после вычисления диагональной жордановой нормальной формы. Вместо J используйте

Jinvsqrt = Diagonal( x=1/sqrt( X$values ) )

и вычислим, аналогично предыдущему,

A3invsqrt = T %*% Jinvsqrt %*% Tinv

и наблюдать

A3 · A3invsqrt² =… = T · (Дж / √J / √J) · T⁻¹ = 1

единичная матрица, так что A3invsqrt является желаемым результатом.

В случае, если A3 не является обратимым, можно вычислить обобщенное обратное (не обязательно Мура-Пенроуза), заменив все неопределенные записи в Jinvsqrt на 0, но, как я сказал выше, это следует делать с должной осторожностью в свете общее приложение и его устойчивость к ошибкам округления.

В случае, если A3 не имеет диагональной жордановой нормальной формы, квадратный корень отсутствует, поэтому приведенные выше формулы дадут другой результат. Чтобы не столкнуться с этим случаем во время неудач, лучше всего выполнить проверку,

A3invsqrt %*% A3 %*% A3invsqrt

достаточно близко к тому, что вы бы считали матрицей 1 (это применимо только в том случае, если A3 изначально была обратимой).

PS: Обратите внимание, что вы можете поставить знак ± для каждой диагональной записи Jinvsqrt по своему вкусу.

person Bernhard Bodenstorfer    schedule 10.08.2015
comment
что касается вашего ответа; как вы можете быть уверены, что, переходя от A к A3, вы не потеряете истинный контекст? А именно, те же выводы и с A, и с A3 - потом? - person Erdogan CEVHER; 31.08.2017
comment
A имеет вид * 0 * * 0 0 0 1 0 0 0 0 * 0 * * 0 0 * 0 * * 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 (подумайте о переносе строки после каждой строки из 6 ), где * отмечает то, что я называю интересными элементами матрицы A, которые составляют матрицу A3 3 × 3. Помимо этого, A - диагональная матрица. Таким образом, потерянный контекст легко восстанавливается в конце, потому что квадрат, обратный квадратному корню из 1, равен 1, и то же самое верно для одной диагональной матрицы: все, что вам нужно сделать, это просто объединить матрицу A3invsqrt с приведенной выше формы, вставив ее номера в позиции * в прямом порядке. - person Bernhard Bodenstorfer; 01.09.2017
comment
Ошибка: я должен исправить ошибку, относящуюся к исключительному случаю: даже в случае недиагональной жордановой нормальной формы квадратные корни существуют, если только ассоциированное собственное значение не равно 0. Квадратный корень из заданной жордановой клетки размерности n для собственного значения λ ≠ 0 является треугольным и имеет все элементы, равные по диагонали и каждой наддиагонали. Их можно вычислить из системы уравнений, где n определяет количество переменных. Система может быть решена шаг за шагом (переменная за переменной) аналогично треугольной системе линейных уравнений. - person Bernhard Bodenstorfer; 25.05.2018