5.3: Поворотний
У нашому описі алгоритму гаусової елімінації до цих пір ви, можливо, помітили проблему. Під час процесу скорочення рядків ми повинні помножити рядки на коефіцієнтA′mn/A′nn (деA′ позначає поточну матрицю). ЯкщоA′nn трапляється нуль, коефіцієнт виривається, і алгоритм виходить з ладу.
Щоб обійти цю складність, додаємо додатковий крок до процедури зменшення рядів. Коли ми крокуємо вперед через номери рядківn=0,1,⋯,N−1, ми робимо наступне для кожногоn:
- Поворотні: пошук елементів матриці на і нижче діагонального елемента в(n,n), і знайти рядокn′ з найбільшим значенням|A′n′n|. Потім поміняти місцями рядn і рядn′.
- Продовжуйте з іншим алгоритмом, усунувшиA′mn елементи нижче діагоналі.
Ви повинні бути в змозі переконати себе, що (i) поворот не змінює рішення, і (ii) це не змінює масштабування часу виконання фази скорочення рядків, яка залишаєтьсяO(N3).
Окрім запобігання надмірному виходу алгоритму з ладу, поворот покращує його числову стабільність. ЯкщоA′nn ненульовий, але дуже малий за величиною, поділ на нього дасть дуже великий результат, що призводить до втрати числової точності з плаваючою комою. Отже, вигідно міняти місцями ряди навколо, щоб гарантувати, щоA′nn величина була якомога більшою.
При спробі повороту може статися, що всі значення діагоналі та нижче діагоналі дорівнюють нулю (або досить близькі до нуля в межах нашого допуску з плаваючою|A′n′n| комою). Якщо це станеться, то це вказує на те, що наша вихіднаA матриця є одниною, тобто вона не має зворотного. Отже, процедура повороту має додаткову перевагу, допомагаючи нам вловити випадки, коли немає дійсного рішення системи рівнянь; у таких випадках алгоритм гаусової елімінації повинен перервати.
5.3.1 Приклад
Давайте попрацюємо на прикладі гаусової елімінації з поворотом, використовуючи задачу в попередньому розділі:
[123363224826242].
Фаза скорочення рядів йде наступним чином:
- (n=0): Pivot, міняючи рядки0 та рядки1:
[322481233626242]. - (n=0): Усунути елемент за адресою(1,0):
[3224804/37/35/310/326242]. - (n=0): Усунути елемент за адресою(2,0):
[3224804/37/35/310/3014/32/34/3−10/3]. - (n=1): Pivot, міняючи рядки1 та рядки2:
[32248014/32/34/3−10/304/37/35/310/3]. - (n=1): Усунути елемент за адресою(2,1):
[32248014/32/34/3−10/30015/79/730/7].
Потім фаза зворотного заміщення триває як зазвичай. Ви можете перевірити, чи дає він ті самі результати, які ми отримували раніше.