Вычисление обратной матрицы в Matlab

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

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

A = B^-1 * C

Или в Матлабе:

A = B\C;

Я использую это, потому что Matlab сказал мне, что 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)?


person user1259832    schedule 09.03.2012    source источник
comment
Это поможет, если вы вычислите B как B = eye(N) \ invB?   -  person AVH    schedule 09.03.2012
comment
Когда я использую B = eye(N) \ invB, я больше не получаю эту ошибку для этого уравнения, но она дает мне ошибку каждый раз, когда вычисляется A = B\C...   -  person user1259832    schedule 09.03.2012


Ответы (2)


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

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)

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

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

Удачи, Эндрю

person Sevenless    schedule 09.03.2012

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

person jkt    schedule 09.03.2012