Методы исключения Гаусса
Материал из MachineLearning.
м (викификация) |
(категория) |
||
(17 промежуточных версий не показаны.) | |||
Строка 25: | Строка 25: | ||
:: 1. Предполагаем, что <tex>a_{11} \neq 0</tex> . Тогда первое уравнение системы {{eqref|2}} делим на коэффициент <tex>a_{11}</tex>, в результате получаем уравнение | :: 1. Предполагаем, что <tex>a_{11} \neq 0</tex> . Тогда первое уравнение системы {{eqref|2}} делим на коэффициент <tex>a_{11}</tex>, в результате получаем уравнение | ||
<center><tex>x_{1}+\sum_{j=2}^n a_{ij}^{1}x_{j} = b_{i}^{1}</tex></center>. | <center><tex>x_{1}+\sum_{j=2}^n a_{ij}^{1}x_{j} = b_{i}^{1}</tex></center>. | ||
- | ::Затем из каждого из | + | ::Затем из каждого из оставшихся уравнений вычитается первое, умноженное на соответствующий коэффициент <tex>a_{i1}</tex>. В результате система преобразуются к виду: |
<center><tex>\left( \begin{array}{ccc} 1 & a_{12}^{1} & \ldots & a_{1n}^{1}\\ \\ 0 & a_{22}^{1} & \ldots & a_{2n}^{1}\\ \\ \vdots & \vdots & \ddots & \vdots\\ \\ 0 & a_{n2}^{1} & \ldots & a_{nn}^{1} \end{array}\right) \left( \begin{array}{c}x_1 \\ \\ x_2 \\ \\ \vdots \\ \\ \\ x_n \end{array}\right) = \left( \begin{array}{c}b_1^1 \\ \\ b_2^1 \\ \\ \vdots \\ \\ b_n^1 \end{array}\right)</tex></center> | <center><tex>\left( \begin{array}{ccc} 1 & a_{12}^{1} & \ldots & a_{1n}^{1}\\ \\ 0 & a_{22}^{1} & \ldots & a_{2n}^{1}\\ \\ \vdots & \vdots & \ddots & \vdots\\ \\ 0 & a_{n2}^{1} & \ldots & a_{nn}^{1} \end{array}\right) \left( \begin{array}{c}x_1 \\ \\ x_2 \\ \\ \vdots \\ \\ \\ x_n \end{array}\right) = \left( \begin{array}{c}b_1^1 \\ \\ b_2^1 \\ \\ \vdots \\ \\ b_n^1 \end{array}\right)</tex></center> | ||
:: 2. В предположении, что <tex>a_{22}^1 \neq 0</tex>, делим второе уравнение на коэффициент <tex>a_{22}^1</tex> и исключаем неизвестное <tex>x_2</tex> из всех последующих уравнений и т.д. | :: 2. В предположении, что <tex>a_{22}^1 \neq 0</tex>, делим второе уравнение на коэффициент <tex>a_{22}^1</tex> и исключаем неизвестное <tex>x_2</tex> из всех последующих уравнений и т.д. | ||
Строка 37: | Строка 37: | ||
:: 2. Из <tex>(n-1)-</tex>го - определяем <tex>x_{n-1}:\: \quad x_{n-1}=b_{n-1}^n-a_{(n-1)n}^n x_n</tex> и т.д. | :: 2. Из <tex>(n-1)-</tex>го - определяем <tex>x_{n-1}:\: \quad x_{n-1}=b_{n-1}^n-a_{(n-1)n}^n x_n</tex> и т.д. | ||
- | == Анализ метода и | + | == Анализ метода == |
- | == Числовой пример == | + | |
- | == Рекомендации | + | Данный метод относится к классу прямых методов решения системы уравнений, а это значит, что за конечное число шагов можно получить точное решение, при условии, что входные данные ( матрица <tex>A</tex> и правая часть уравнения - <tex>b</tex>) заданы точно и вычисление ведется без округлений. |
- | == | + | Для получения решения требуется <tex>\frac{m^3}{3}+ m^2 - \frac{m}{3}</tex> умножений и делений, то есть порядка <tex>O(\frac{m^3}{3})</tex> операций. |
+ | |||
+ | Условия, при которых метод выдает точное решение, на практике не выполнимы - неизбежны как ошибки входных данных, так и ошибки округления. | ||
+ | Тогда встает вопрос: насколько точное решение можно получить, используя метод Гаусса, насколько метод корректен? | ||
+ | Определим устойчивость решения относительно входных параметров. Наряду с исходной системой {{eqref|1}} рассмотрим возмущенную систему: | ||
+ | <center><tex>(A + \delta A)(x + \delta x)=b + \delta b</tex></center> | ||
+ | Пусть введена некоторая норма <tex>|| . ||</tex>. <tex>CondA=|| A || * || A^{-1}||</tex> - называется числом обусловленности матрицы <tex>A</tex>. | ||
+ | |||
+ | Возможны 3 случая: | ||
+ | |||
+ | 1) <tex>\delta A = 0 , \quad \delta b \neq 0</tex> : | ||
+ | :<tex>\frac{||\delta x||}{||x||} &\leq& Cond A \frac{||\delta b ||}{|| b ||}</tex> | ||
+ | 2) <tex>\delta A \neq 0 , \quad \delta b = 0</tex> : | ||
+ | :<tex><tex>\frac{||\delta x||}{||x||} \leq Cond A \frac{||\delta A ||}{|| A ||}</tex> | ||
+ | 3) <tex>\delta A \neq 0 , \quad \delta b \neq 0</tex> : | ||
+ | :<tex><tex>\frac{||\delta x||}{||x||} \leq \frac{Cond A}{1-Cond A\frac{||\delta A ||}{|| A ||}}(\frac{||\delta A ||}{|| A ||}+ \frac{||\delta b ||}{|| b ||})</tex> | ||
+ | |||
+ | Число обусловленности матрицы <tex>A</tex> всегда <tex>\geq 1</tex>. Если оно велико ( <tex>Cond A \approx 10^k k \geq 2</tex> ) , то говорят, что матрица <tex>A</tex> плохо обусловлена. В этом случае малые возмущения правых частей системы {{eqref|1}}, вызванные либо неточностью задания исходных данных, либо вызванные погрешностями вычисления, существенно влияют на решение системы. Грубо говоря, если погрешность правых частей <tex>10^{-l}</tex> , то погрешность решения будет <tex>10^{-l+k}</tex> . | ||
+ | |||
+ | Проиллюстрируем полученные результаты на следующем числовом примере: | ||
+ | Дана система | ||
+ | |||
+ | :<tex>\left\{\begin{array}{lcr}5x_1+7x_2 &=& 12 \\ \\ 7x_1+10x_2 &=& 17 \\ \end{array} \right.</tex> | ||
+ | |||
+ | Она имеет решение <tex>(1, \quad 1)</tex>. | ||
+ | |||
+ | Теперь рассмотрим возмущенную систему: | ||
+ | |||
+ | :<tex>\left\{\begin{array}{lcr}5x_1+7x_2 &=& 12.075 \\ \\ 7x_1+10x_2 &=& 16.905 \\ \end{array} \right.</tex> | ||
+ | |||
+ | Решением такой системы будет вектор <tex>(2.415, \quad 0)</tex>. | ||
+ | |||
+ | При совсем малом возмущении правой части получили несоизмеримо большое возмущение решения. | ||
+ | Объяснить такую "ненадежность" решения можно тем, что матрица <tex>A</tex> почти вырожденная: прямые, соответствующие двум уравнениям, почти совпадают, что видно на графике: | ||
+ | |||
+ | [[Изображение:Слау.jpg|center|Геометрическое представление системы двух линейных алгебраических уравнений, которая является почти вырожденной. Прямые, соответствующие двум уравнениям, почти совпадают.]] | ||
+ | |||
+ | |||
+ | |||
+ | Такой результат можно было предвидеть в силу плохой обусловленностью матрицы <tex>A = \left( \begin{array}{ccc} 5 & 7\\ \\ 7 & 10 \end{array}\right)</tex> : | ||
+ | <tex>Cond A = 17^2</tex> <ref>Здесь и далее в числовых примерах будем рассматривать метрику <tex>||.||_1</tex> : <tex>||x||_1=\sum_{i=1}^n | x_i |, \quad || A ||_1 = \max_{j} \left( \sum_{i=1}^n | a_{ij} |\right)</tex></ref> | ||
+ | |||
+ | Вычисление <tex>Cond A </tex> является достаточно сложным, сравнимо с решением всей системы, поэтому для оценки пограшности применяются более грубые, но простые в реализации методы. | ||
+ | |||
+ | == Способы оценки ошибок == | ||
+ | |||
+ | :1) <u>'''Контрольная сумма:'''</u> обычно применяется для предупреждения случайных погрешностей в процессе вычисления без помощи компьютеров. | ||
+ | |||
+ | Составляем контрольный столбец <tex>a_{n+1} = \left( a_{1,n+1}, \ldots, a_{n, n+1}\right)</tex>, состоящий из контрольных элементов системы: | ||
+ | :<tex>a_{i, n+1} = \sum_{j=1}^n a_{i, j} + b_i</tex> | ||
+ | |||
+ | При преобразовании уравнений над контрольными элементами производятся те же операции, что и над свободными членами уравнеий. В результате этого контрольный элемент каждого нового уравнения должен равняться сумме коэффициентов этого уравнения. Большое расхождение между ними указывает на погрешности в вычислениях или на неустойчивость алгоритма вычислений по отношению к вычислительной погрешности. | ||
+ | |||
+ | :2) <u>'''Относительная погрешность известного решения'''</u> позволяет без существенных дополнительных затрат получить суждение о погрешности решения. | ||
+ | |||
+ | Задается некоторый ветор <tex>z</tex> с компонентами, имеющими по возможности тот же порядок и знак, что и компоненты искомого решения <ref>Часто из-за отсутствия доплнительной информации берут <tex>z=\left(1, \ldots, 1\right)</tex></ref>. Вычисляется вектор <tex>c=Az</tex>, и на ряду с исходной системой уравнения решается система <tex>Az=c</tex>. | ||
+ | |||
+ | Пусть <tex>x'</tex> и <tex>z'</tex> - реально получаемые решения этих систем. Суждение о погрешности <tex>x-x'</tex> искомого решения можно получить, основываясь на гипотезе: относительные погрешности при решении методом исключения систем с одной и той же матрицей и различными правыми частями, которыми являются соответственно величины <tex>\frac{||x-x'||}{||x'||}</tex> и <tex>\frac{||z-z'||}{||z'||}</tex>, отличаются не в очень большое число раз. | ||
+ | |||
+ | :3) <u>'''Изменение масштабов'''</u> - прием, применяющийся для получения представления о реальной величине погрешности, возникающей за счет округлений при вычислениях. | ||
+ | |||
+ | Наряду с исходной системой тем же методом решается система | ||
+ | :<tex>\left( \alpha A\right)x' = \beta b</tex>, где <tex>\alpha</tex> и <tex>\beta</tex> - числа | ||
+ | |||
+ | Если бы не было погрешности округления, то выполнялось бы равенство для решений исходной и масштабированной систем: <tex>x=\alpha \beta^{-1}x'</tex>. Поэтому при <tex>\alpha</tex> и <tex>\beta</tex>, не являющихся степенями двойки, сравнение векторов <tex>x</tex> и <tex>\alpha \beta^{-1}x'</tex> дает представление о величине вычислительной погрешности <ref>Например, можно взять <tex>\alpha=\sqrt{2}, \quad \beta=\sqrt{3}</tex></ref> | ||
+ | |||
+ | == Улучшение метода исключения Гаусса== | ||
+ | |||
+ | Рассмотренные ниже модификации метода Гаусса позволяют уменьшить погрешность результата. | ||
+ | |||
+ | === Выбор главного элемента === | ||
+ | Основное увеличение ошибки в методе происходит во время прямого хода, когда ведущая <tex>k</tex>-я строка умножается на коэффициенты <tex>\frac{a_{i, k}}{a_{k, k}}, \quad i=k+1, \ldots, n</tex>.Если коэффициенты <tex> >1 </tex>, то ошибки, полученные на предыдущих шагах накапливаются. Чтобы этого избежать, применяется модификация метода Гаусса с выбором главного элемента. На каждом шаге к обычной схеме добавляется выбор максимального элемента по столбцу следующим образом: | ||
+ | |||
+ | Пусть по ходу исключения неизвестных получена система уравнений: | ||
+ | |||
+ | :<tex>x_i+\sum_{j=i+1}^{n}a_{ij}^i x^j = b_i^i, \quad \quad i=1, \ldots, k-1</tex>, | ||
+ | :<tex>\sum_{j=k}^{n}a_{ij}^{k-1}x_j = b_i^{k-1}, \quad \quad i=k, \ldots, n</tex>. | ||
+ | |||
+ | Найдем такое <tex>l</tex>, что <tex>|a_{l,k}^{k-1}|=\max_{j=k,...,n} |a_{j,k}^{k-1}|</tex> и поменяем местами <tex>k</tex>-е и <tex>l</tex>-е уровнения. | ||
+ | |||
+ | Такое преобразование во многих случаях существенно уменьшает чувствительность решения к погрешностям округления при вычислениях. | ||
+ | |||
+ | === Итеративное улучшение результата === | ||
+ | |||
+ | Если есть подозрение, что полученное решение <tex>x^{1}</tex> сильно искажено, то можно улучшить результат следующим образом. Величина <tex>b^1=b-Ax^{0}</tex> называется невязкой. Погрешность <tex>r^1=x-x^{1}</tex> удовлетворяет системе уравнений | ||
+ | :<tex>Ar^1=Ax-Ax^1=b^1</tex>. | ||
+ | Решая эту систему, получаем приближение <tex>r^{(1)}</tex> к <tex>r^1</tex> и полагаем | ||
+ | :<tex>x^2=x^1+r^{(1)}</tex>. | ||
+ | Если точность данного приближения неудовлетворительна, то повторяем эту операцию. | ||
+ | |||
+ | Процесс можно продолжать до тех пор, пока все компоненты <tex>r^{(i)}</tex> не станут достаточно малыми. При этом нельзя останавливать вычисления только потому, что все компоненты вектора невязки стали достаточно малыми: это может быть результатом плохой обусловленности матрицы коэффициентов. | ||
+ | |||
+ | ==Числовой пример== | ||
+ | |||
+ | Рассмотрим для примера матрицу Вандермонда размером 7х7 и 2 различные правые части: | ||
+ | <center><tex>\left( \begin{array}{ccc} 1 & 1 & 1 & 1 & 1 & 1 & 1 \\ \\ 64 & 32 & 16 & 8 & 4 & 2 & 1\\ \\ 729 & 243 & 81 & 27 & 9 & 3 & 1 \\ \\ 4096 & 1024 & 256 & 64 & 16 & 4 & 1 \\ \\ 15625 & 3125 & 625 & 125 & 25 & 5 & 1 \\ \\ 46656 & 7776 & 1296 & 216 & 36 & 6 & 1 \\ \\ 117649 & 16807 & 2401 & 343 & 49 & 7 & 1\end{array}\right) \left( \begin{array}{c}x_1 \\ \\ x_2 \\ \\ x_3 \\ \\ x_4 \\ \\ x_5 \\ \\ x_6 \\ \\ x_7 \end{array}\right) = \left( \begin{array}{ccc}7 & 4 \\ \\ 127 & 85\\ \\ 1093 & 820\\ \\ 5461 & 4369 \\ \\ 19531 & 16276\\ \\ 55987 & 47989\\ \\ 137257 & 120100 \end{array}\right)</tex></center> | ||
+ | |||
+ | Данные системы были решены двумя способами. Тип данных - float. B итоге получили следующие результаты: | ||
+ | |||
+ | {| class="standard" | ||
+ | | | ||
+ | {| class="standard" | ||
+ | ! Способ решения | ||
+ | |- | ||
+ | ! Номер столбца в <tex>b</tex> | ||
+ | |- | ||
+ | ! Номер итерации | ||
+ | |- | ||
+ | ! x1 | ||
+ | |- | ||
+ | ! x2 | ||
+ | |- | ||
+ | ! x3 | ||
+ | |- | ||
+ | ! x4 | ||
+ | |- | ||
+ | ! x5 | ||
+ | |- | ||
+ | ! x6 | ||
+ | |- | ||
+ | ! x7 | ||
+ | |- | ||
+ | ! Абс. погрешность | ||
+ | |- | ||
+ | ! Отн. погрешность | ||
+ | |- | ||
+ | ! Невязка | ||
+ | |} | ||
+ | | | ||
+ | {| class="standard" width=40% | ||
+ | ! colspan=4| Обычный метод | ||
+ | |- | ||
+ | ! colspan=2 | 1 | ||
+ | ! colspan=2 | 2 | ||
+ | |- | ||
+ | ! 1 || 2 || 1 || 2 | ||
+ | |- | ||
+ | |0.999991 || 1 || 0.999996 || 1 | ||
+ | |- | ||
+ | |1.00019 || 1 || 7.4774e-005 || 2,33e-008 | ||
+ | |- | ||
+ | |0.998404 || 1 || 0.999375 || 1 | ||
+ | |- | ||
+ | |1.00667 || 1 || 0.00263727 || 1,12e-006 | ||
+ | |- | ||
+ | |0.985328 || 1 || 0.994149 || 1 | ||
+ | |- | ||
+ | |1.01588 || 1 || 0.00637817 || 3,27e-006 | ||
+ | |- | ||
+ | |0.993538 || 1 || 0.99739 || 1 | ||
+ | |- | ||
+ | | 0,045479 || 2,9826e-006 || 0,01818 ||8,8362e-006 | ||
+ | |- | ||
+ | | 0,006497 || 4,2608e-007 || 0,0045451 ||2,209e-006 | ||
+ | |- | ||
+ | | 0,040152 || 4,344e-005 || 0,083938 ||2,8654e-006 | ||
+ | |} | ||
+ | | | ||
+ | {| class="standard" width=40% | ||
+ | ! colspan=4| С выбором ведущего элемента по строке | ||
+ | |- | ||
+ | ! colspan=2 | 1 | ||
+ | ! colspan=2 | 2 | ||
+ | |- | ||
+ | ! 1 || 2 || 1 || 2 | ||
+ | |- | ||
+ | | 1 || 1 || 1 || 1 | ||
+ | |- | ||
+ | |1 || 1|| -3.57628e-005 || 1,836e-007 | ||
+ | |- | ||
+ | |1.00001 || 1|| 1.00031 || 1 | ||
+ | |- | ||
+ | |0.999942 || 1|| -0.00133276 || 7,16e-006 | ||
+ | |- | ||
+ | |1.00005 || 1|| 1.00302 || 0,99998 | ||
+ | |- | ||
+ | |1.00009 || 1|| -0.0033505 || 1,8e-005 | ||
+ | |- | ||
+ | |0.99991 || 1|| 1.00139 || 0,99999 | ||
+ | |- | ||
+ | |0,000298 || 4,3835e-007 || 0,009439 || 5,0683e-005 | ||
+ | |- | ||
+ | | 4,2571e-005 || 6,2622e-008 || 0,0023542 || 1,2671e-005 | ||
+ | |- | ||
+ | | 0,010622 || 9,8016e-007 || 0,29402 ||1,4768e-006 | ||
+ | |} | ||
+ | | | ||
+ | {| class="standard" | ||
+ | ! colspan=2| Реальные результаты | ||
+ | |- | ||
+ | ! 1 | ||
+ | ! 2 | ||
+ | |- | ||
+ | ! - || - | ||
+ | |- | ||
+ | |1 || 1 | ||
+ | |- | ||
+ | |1 || 0 | ||
+ | |- | ||
+ | |1 || 1 | ||
+ | |- | ||
+ | |1 || 0 | ||
+ | |- | ||
+ | |1 || 1 | ||
+ | |- | ||
+ | |1 || 0 | ||
+ | |- | ||
+ | |1 || 1 | ||
+ | |- | ||
+ | | 0 || 0 | ||
+ | |- | ||
+ | | 0 || 0 | ||
+ | |- | ||
+ | | 0 || 0 | ||
+ | |} | ||
+ | |} | ||
+ | |||
+ | == Программа, реализующая метод на C++ == | ||
+ | |||
+ | [[Медиа:Gauss_Elimination.zip| Gauss_Elimination.zip [30КБ] ]] - В архиве содержится исходный код, exe-файл и пример файла с входными данными | ||
+ | |||
+ | ==Рекомендации пользователю== | ||
+ | *Метод Гаусса удобно применять для систем маленькой и средней размерности (до порядка <tex>10^4</tex>). Для больших же размерностей или разреженных матриц более эффективными представляются итерационные методы. | ||
+ | |||
+ | *Рекомендуется использовать '''метод Гаусса с выбором главного элемента''' по столбцу, как более устойчивый к ошибкам, но при этом не требующий больших дополнительных затрат. В этом плане метод выбора главного элемента по строке и столбцу представляется менее эффективным, так как требует гораздо больше вычислительных затрат, но дает небольшую прибавку в точности. | ||
+ | |||
+ | *Итерационное улучшение результата стоит провести 2-3 раза, если погрешность уменьшается очень медленно - возможно, матрица плохо обусловлена, тогда метод в любом случае даст не лучшие результаты - лучше попробовать применить итерационные методы. | ||
+ | |||
+ | *Важно, чтобы данные считывались из файла правильно. | ||
+ | При записи данных помните, что, '''целая и дробная части числа отделяются точкой''', а не запятой. В последнем случае данные будут считаны неправильно, но не будет выведено никакого сообщения об ошибке. | ||
+ | |||
+ | *Есть возможность менять точность вычислений (float и double), но в исходниках. | ||
+ | |||
+ | ==Сноски== | ||
+ | <references/> | ||
+ | |||
== Список литературы == | == Список литературы == | ||
* ''Н.С.Бахвалов, Н.П.Жидков, Г.М.Кобельков'' Численные методы | * ''Н.С.Бахвалов, Н.П.Жидков, Г.М.Кобельков'' Численные методы | ||
+ | * ''Д. Мак-Кракен, У.Дорн'' Численные методы и программирование на фортране | ||
+ | * ''J.C.Nash'' Compact numerical methods for computers. Linear algebra anf function minimization. Second edition. | ||
+ | * ''Nicholas J.Higham'' How Accurate is Gaussian Elimination? | ||
+ | |||
== Внешние ссылки == | == Внешние ссылки == | ||
+ | *[http://unn.ru/rus/books/met_files/metgauss.doc Лабораторная работа по методу Гаусса в НГУ им. Лобачевского] | ||
+ | *[http://ru.wikipedia.org/wiki/Метод_Гаусса Метод Гаусса на Википедии] | ||
*[http://ru.wikipedia.org/wiki/%D0%9E%D0%B1%D1%80%D0%B0%D1%82%D0%BD%D0%B0%D1%8F_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D0%B0 Обратная матрица] | *[http://ru.wikipedia.org/wiki/%D0%9E%D0%B1%D1%80%D0%B0%D1%82%D0%BD%D0%B0%D1%8F_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D0%B0 Обратная матрица] | ||
Строка 50: | Строка 291: | ||
{{stub}} | {{stub}} | ||
- | [[Категория: | + | [[Категория:Линейная алгебра]] |
[[Категория:Учебные задачи]] | [[Категория:Учебные задачи]] |
Текущая версия
Содержание |
Постановка задачи
Дана система линейных алгебраических уравнений (СЛАУ), состоящая из уравнений с неизвестными :
Предполагается, что существует единственное решение системы, то есть .
В данной статье будут рассмотрены причины погрешности, возникающей во время решения системы с помощью метода Гаусса, способы выявления и ликвидации(уменьшения) этой погрешности.
Описание метода
Процесс решения системы линейных уравнений
по методу Гаусса состоит из 2х этапов:
- Прямой ход
- Система (2) приводится к треугольному виду
- 1. Предполагаем, что . Тогда первое уравнение системы (2) делим на коэффициент , в результате получаем уравнение
- Затем из каждого из оставшихся уравнений вычитается первое, умноженное на соответствующий коэффициент . В результате система преобразуются к виду:
- 2. В предположении, что , делим второе уравнение на коэффициент и исключаем неизвестное из всех последующих уравнений и т.д.
- 3. Получаем систему уравнений с треугольной матрицей:
- Обратный ход
- Непосредственное определение неизвестных
- 1. Из го уравнения системы (3) определяем
- 2. Из го - определяем и т.д.
Анализ метода
Данный метод относится к классу прямых методов решения системы уравнений, а это значит, что за конечное число шагов можно получить точное решение, при условии, что входные данные ( матрица и правая часть уравнения - ) заданы точно и вычисление ведется без округлений. Для получения решения требуется умножений и делений, то есть порядка операций.
Условия, при которых метод выдает точное решение, на практике не выполнимы - неизбежны как ошибки входных данных, так и ошибки округления. Тогда встает вопрос: насколько точное решение можно получить, используя метод Гаусса, насколько метод корректен? Определим устойчивость решения относительно входных параметров. Наряду с исходной системой (1) рассмотрим возмущенную систему:
Пусть введена некоторая норма . - называется числом обусловленности матрицы .
Возможны 3 случая:
1) :
2) :
3) :
Число обусловленности матрицы всегда . Если оно велико ( ) , то говорят, что матрица плохо обусловлена. В этом случае малые возмущения правых частей системы (1), вызванные либо неточностью задания исходных данных, либо вызванные погрешностями вычисления, существенно влияют на решение системы. Грубо говоря, если погрешность правых частей , то погрешность решения будет .
Проиллюстрируем полученные результаты на следующем числовом примере: Дана система
Она имеет решение .
Теперь рассмотрим возмущенную систему:
Решением такой системы будет вектор .
При совсем малом возмущении правой части получили несоизмеримо большое возмущение решения. Объяснить такую "ненадежность" решения можно тем, что матрица почти вырожденная: прямые, соответствующие двум уравнениям, почти совпадают, что видно на графике:
Такой результат можно было предвидеть в силу плохой обусловленностью матрицы : [1]
Вычисление является достаточно сложным, сравнимо с решением всей системы, поэтому для оценки пограшности применяются более грубые, но простые в реализации методы.
Способы оценки ошибок
- 1) Контрольная сумма: обычно применяется для предупреждения случайных погрешностей в процессе вычисления без помощи компьютеров.
Составляем контрольный столбец , состоящий из контрольных элементов системы:
При преобразовании уравнений над контрольными элементами производятся те же операции, что и над свободными членами уравнеий. В результате этого контрольный элемент каждого нового уравнения должен равняться сумме коэффициентов этого уравнения. Большое расхождение между ними указывает на погрешности в вычислениях или на неустойчивость алгоритма вычислений по отношению к вычислительной погрешности.
- 2) Относительная погрешность известного решения позволяет без существенных дополнительных затрат получить суждение о погрешности решения.
Задается некоторый ветор с компонентами, имеющими по возможности тот же порядок и знак, что и компоненты искомого решения [1]. Вычисляется вектор , и на ряду с исходной системой уравнения решается система .
Пусть и - реально получаемые решения этих систем. Суждение о погрешности искомого решения можно получить, основываясь на гипотезе: относительные погрешности при решении методом исключения систем с одной и той же матрицей и различными правыми частями, которыми являются соответственно величины и , отличаются не в очень большое число раз.
- 3) Изменение масштабов - прием, применяющийся для получения представления о реальной величине погрешности, возникающей за счет округлений при вычислениях.
Наряду с исходной системой тем же методом решается система
- , где и - числа
Если бы не было погрешности округления, то выполнялось бы равенство для решений исходной и масштабированной систем: . Поэтому при и , не являющихся степенями двойки, сравнение векторов и дает представление о величине вычислительной погрешности [1]
Улучшение метода исключения Гаусса
Рассмотренные ниже модификации метода Гаусса позволяют уменьшить погрешность результата.
Выбор главного элемента
Основное увеличение ошибки в методе происходит во время прямого хода, когда ведущая -я строка умножается на коэффициенты .Если коэффициенты , то ошибки, полученные на предыдущих шагах накапливаются. Чтобы этого избежать, применяется модификация метода Гаусса с выбором главного элемента. На каждом шаге к обычной схеме добавляется выбор максимального элемента по столбцу следующим образом:
Пусть по ходу исключения неизвестных получена система уравнений:
- ,
- .
Найдем такое , что и поменяем местами -е и -е уровнения.
Такое преобразование во многих случаях существенно уменьшает чувствительность решения к погрешностям округления при вычислениях.
Итеративное улучшение результата
Если есть подозрение, что полученное решение сильно искажено, то можно улучшить результат следующим образом. Величина называется невязкой. Погрешность удовлетворяет системе уравнений
- .
Решая эту систему, получаем приближение к и полагаем
- .
Если точность данного приближения неудовлетворительна, то повторяем эту операцию.
Процесс можно продолжать до тех пор, пока все компоненты не станут достаточно малыми. При этом нельзя останавливать вычисления только потому, что все компоненты вектора невязки стали достаточно малыми: это может быть результатом плохой обусловленности матрицы коэффициентов.
Числовой пример
Рассмотрим для примера матрицу Вандермонда размером 7х7 и 2 различные правые части:
Данные системы были решены двумя способами. Тип данных - float. B итоге получили следующие результаты:
|
|
|
|
Программа, реализующая метод на C++
Gauss_Elimination.zip [30КБ] - В архиве содержится исходный код, exe-файл и пример файла с входными данными
Рекомендации пользователю
- Метод Гаусса удобно применять для систем маленькой и средней размерности (до порядка ). Для больших же размерностей или разреженных матриц более эффективными представляются итерационные методы.
- Рекомендуется использовать метод Гаусса с выбором главного элемента по столбцу, как более устойчивый к ошибкам, но при этом не требующий больших дополнительных затрат. В этом плане метод выбора главного элемента по строке и столбцу представляется менее эффективным, так как требует гораздо больше вычислительных затрат, но дает небольшую прибавку в точности.
- Итерационное улучшение результата стоит провести 2-3 раза, если погрешность уменьшается очень медленно - возможно, матрица плохо обусловлена, тогда метод в любом случае даст не лучшие результаты - лучше попробовать применить итерационные методы.
- Важно, чтобы данные считывались из файла правильно.
При записи данных помните, что, целая и дробная части числа отделяются точкой, а не запятой. В последнем случае данные будут считаны неправильно, но не будет выведено никакого сообщения об ошибке.
- Есть возможность менять точность вычислений (float и double), но в исходниках.
Сноски
Список литературы
- Н.С.Бахвалов, Н.П.Жидков, Г.М.Кобельков Численные методы
- Д. Мак-Кракен, У.Дорн Численные методы и программирование на фортране
- J.C.Nash Compact numerical methods for computers. Linear algebra anf function minimization. Second edition.
- Nicholas J.Higham How Accurate is Gaussian Elimination?
Внешние ссылки
- Лабораторная работа по методу Гаусса в НГУ им. Лобачевского
- Метод Гаусса на Википедии
- Обратная матрица