Вычисление обратной матрицы в Matlab - PullRequest
2 голосов
/ 09 марта 2012

Я использую алгоритм оптимизации, который требует вычисления обратной матрицы. Цель алгоритма - исключить отрицательные значения из матрицы A и получить новую матрицу B. По сути, я начинаю с известных квадратных матриц B и C одинакового размера.

Я начинаю с вычисления матрицы A, которая равна:

A = B ^ -1 * C

Или в Matlab:

A = B\C;

Я использую это, потому что Матлаб сказал мне, что B\C точнее, чем inv(B)*C.

Отрицательные значения в A затем делятся на два, и A затем нормализуется, так что его строки имеют длину 1. Используя этот новый A, я вычисляю новый B с помощью:

(1 / N) * A * C '= B ^ -1

где N - это просто коэффициент масштабирования (количество столбцов в A). Затем этот новый B будет снова использоваться на первом этапе, и эти итерации будут продолжаться до тех пор, пока не исчезнут негативы в A.

Моя проблема в том, что мне нужно вычислить B из второго уравнения, а затем нормализовать его.

invB = (1/N)*A*C';
B = inv(invB);

Я вычислял B, используя inv(B^-1), но после нескольких итераций я начинаю получать сообщения, которые B^-1 "близки к единственному или плохо масштабированы".

Этот алгоритм действительно работает для меньших матриц (около 70x70), но когда он достигает примерно 500x500, я начинаю получать эти сообщения.

Есть ли лучшие способы для вычисления inv(B^-1)?

Ответы [ 2 ]

3 голосов
/ 10 марта 2012

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

A*b_1 = c

и мы фактически решаем проблему (потому что мы используем приблизительные числа, когда мы используем компьютеры)

(A + matrix error)*b_2 = (c + vector error)

насколько близки b_1 и b_2 как функция ошибок матрицы и вектора? Когда A имеет малое число условий, b_1 и b_2 близки. Когда A имеет большое число условий, b_1 и b_2 не близки.

Существует информативный анализ, который вы могли бы выполнить по вашему алгоритму. На каждой итерации, после того, как вы нашли B, найдите использование Matlab, чтобы найти номер условия этого. Это

cond(B)

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

Подобные проблемы все время возникают в числовой математике. Если вы будете часто работать с числовыми алгоритмами, вам нужно некоторое время, чтобы ознакомиться с ролью чисел условий в поле и техникой предобработки, как упомянуто выше. Мой предпочтительный текст для этого - «Численная линейная алгебра» Ллойда Трефетена, но любой текст по числовой алгебре должен решить некоторые из этих проблем.

Удачи, Andrew

1 голос
/ 09 марта 2012

Основная проблема заключается в том, что ваша матрица имеет большое число условий (т. Е. Действительно малая секунда (B) в вашем случае).Я полагаю, это связано с итеративной структурой в вашем алгоритме.По мере того, как вы выполняете каждую итерацию, ваши небольшие сингулярные значения становятся все меньше и меньше, поэтому число ваших условий растет в геометрической прогрессии.Вы должны проверить preconditioning , чтобы избежать такого поведения.

...