- •§ 3. Методы решения систем линейных и нелинейных уравнений
- •§ 3. Методы решения систем линейных и нелинейных уравнений
- •3.1. Метод исключения гаусса для систем линейных уравнений
- •3.2. Метод главных элементов
- •3.3. Решение систем нелинейных уравнений методом ньютона
- •3.4. Решение систем линейных уравнений методом квадратного корня
- •3.5. Решение систем линейных уравнений методом итераций
- •3.6. Решение систем линейных уравнений методом зейделя
- •§ 4. Алгебра матриц
- •4.1. Вычисление собственных векторов и собственных значений матриц по методу крылова
3.1. Метод исключения гаусса для систем линейных уравнений
Из курса линейной алгебры [Крылов и др., 1972; Курош, 1962; Фадеев, Фадеева, 1963 и др.] известно, что решение системы линейных уравнений можно просто найти по правилу Крамера - через отношение определителей. Но этот способ не очень удобен для решения систем уравнений с числом неизвестных > 5, т.е. когда найти определитель сложно, а при числе неизвестных > 10 нахождение определителя с достаточно высокой степенью точности становится самостоятельной вычислительной задачей. В этих случаях применяют иные методы решения, среди которых самым распространенным является метод Гаусса.
Запишем систему линейных уравнений (1.22) в виде
(1.24)
Если матрица системы верхняя треугольная, т.е. ее элементы ниже главной диагонали равны нулю, то все хj можно найти последовательно, начиная с хn, по формуле
.
(1.25)
При j > k и аjj 0 этот метод дает возможность найти решение системы.
Метод Гаусса для произвольной системы (1.22) основан на приведении матрицы А системы к верхней или нижней треугольной. Для этого вычитают из второго уравнения системы первое, умноженное на такое число, при котором а21 = 0, т.е. коэффициент при х1 во второй строке должен быть равен нулю. Затем таким же образом исключают последовательно а31 , а41 , ..., аm1 . После завершения вычислений все элементы первого столбца, кроме а11, будут равны нулю.
Продолжая этот процесс, исключают из матрицы А все коэффициенты аij, лежащие ниже главной диагонали.
Построим общие формулы этого процесса. Пусть исключены коэффициенты из k - 1 столбца. Тогда ниже главной диагонали должны остаться уравнения с ненулевыми элементами:
Умножим k-ю строку на число
и вычтем ее из m-й строки. Первый ненулевой элемент этой строки обратится в нуль, а остальные изменятся по формулам
(1.26)
Произведя вычисления по формулам (1.26) при всех указанных индексах, исключим элементы k-го столбца. Такое исключение назовем циклом, а выполнение всех циклов назовем прямым ходом исключения.
После выполнения всех циклов получим верхнюю треугольную матрицу А системы (1.24), которая легко решается обратным ходом по формулам (1.25). Если при прямом ходе коэффициент аjj оказался равен нулю, то перестановкой строк перемещаем на главную диагональ ненулевой элемент и продолжаем расчет.
Если предположить, что аjj 0, то тогда можно применить подпрограмму gaus, решающую систему из n линейных уравнений. Это одна из подпрограмм, традиционно использующаяся в библиотеках стандартных программ для ЕС-ЭВМ. Ее перевод на язык PASCAL выполнен авторами.
Формальные параметры процедуры. Входные: n (тип integer) - порядок системы; а (тип real) - массив коэффициентов системы размером n´n; b (тип real) - массив-строка свободных членов. Выходные: х (тип real) - массив-строка, в который помещается решение системы.
procedure gaus (n:integer; a : mas; b : mas1;
var x : mas1);
type mst = array [1..n] of real;
mss = array [1..n] of mst;
var a1 : mss; b1 : mst;
i, j, m, k : integer; h : real;
begin
for i := 1 to n do
begin
b1[i] := b[i];
for j := 1 to n do
a1 [i,j] := a[i,j];
end;
for i := 1 to n-1 do
for j := i+1 to n do
begin
a1[j,i] :=- a1[j,i] / a1[i,i];
for k := i+1 to n do
a1[j,k] := a1 [j,k] + a1[j,i]*a1[i,k];
b1[j] := b1[j] + b1[i]*a1[j,i];
end;
x[n] := b1[n] / a1[n,n];
for i := n-1 downto 1 do
begin
h := b1[i];
for j := i+1 to n do
h := h - x[j]*a1[i,j];
x[i] := h / a1[i,i];
end;
end.
Если контроль за невырожденностью матрицы А необходим, то можно предложить воспользоваться другой процедурой gaus1.
В отличие от первой процедуры здесь в выходных параметрах есть переменная tol, возвращающая 0 при нормальном завершении работы процедуры, или 1, если на главной диагонали один из элементов равен 0, или 2, если матрица А размерностью больше, чем 50´50.
procedure gaus1 (n:integer; a : mas; b : mas1;
var x : mas1; var tol : integer);
type mst = array [1..50] of real;
mss = array [1..50] of mst;
var a1 : mss; b1 : mst;
i, j, m, k : integer; h : real;
begin
for i := 1 to n do
begin
b1[i] := b[i];
for j := 1 to n do a1 [i,j] := a[i,j];
end;
tol := 0;
if n > 50 then
begin
tol := 2;
exit;
end;
for i := 1 to n-1 do
for j := i+1 to n do
begin
if abs(a1[i,i])< 1.0e-10 then
begin
tol := 1;
exit;
end;
a1[j,i] :=- a1[j,i] / a1[i,i];
for k := i+1 to n do
a1[j,k] := a1 [j,k] + a1[j,i]*a1[i,k];
b1[j] := b1[j] + b1[i]*a1[j,i]
end;
if abs(a1[n,n]) < 1.0e-10 then
begin
tol := 1;
exit;
end;
x[n] := b1[n] / a1[n,n];
for i := n-1 downto 1 do
begin
if abs(a1[i,i]) < 1.0e-10 then
begin
tol := 1;
exit;
end;
h := b1[i];
for j := i+1 to n do h := h - x[j]*a1[i,j];
x[i] := h / a1[i,i];
end;
end.
По поводу приведенных алгоритмов можно сказать, что они не самые эффективные и пригодны для решения систем, имеющих невырожденные матрицы А и В с рангом не более 50, составленные из приблизительно одинаковых коэффициентов. Если между наибольшим и наименьшим из коэффициентов расстояние более чем 104, то эти алгоритмы применять не рекомендуется, так как погрешность вычислений будет такова, что может либо привести к вырожденной матрице А, либо дать в результате вектор Х с большой вычислительной погрешностью.
Для проверки работы процедур решим систему линейных уравнений методом Гаусса с точностью до 0.0001:
Коэффициенты, промежуточные результаты и окончательное решение приводятся в табл. 1.14. Подобные таблицы удобно использовать для ручного счета и проверки хода решения.
Таблица 1.14
-
Коэффициенты при неизвестных
Cвободные
Cтрочные
x1
x2
x3
x4
члены
суммы
0.68
0.21
0.11
-0.08
0.55
-0.13
0.84
0.15
-0.11
0.27
0.28
0.50
0.88
0.80
-0.06
0.12
2.15
0.44
0.83
1.16
2.85
-0.01
1.44
0.61
1
0.0735
-0.1618
0.1176
3.1618
4.1912
-0.1454
-0.18319
0.15590
0.30398
0.26220
-0.51290
-0.8247
0.0729
-0.1106
-0.22398
-0.48220
1.41290
-0.88015
-0.97847
0.94530
1
-2.09060
5.6719
1.54040
6.1217
-1.47643
-0.18697
4.79139
-0.99480
0.79920
1.17230
4.1136
-0.0095
1
-3.24410
-0.54110
-2.7851
-1.60130
1.07110
-0.5302
1
-0.66890
0.3311
2.8264
-0.3337
-2.7110
-0.6689
: РЕШЕНИЕ
