Обращение матрицы nхn с использованием метода Гаусса
По определению, обратная матрица матрицы A размерности n*n должна удовлетворять соотношению:
A×A-1=E (6)
Уравнение (6) представляет собой систему n систем линейных уравнений вида:
(7)
Здесь Z1, Z2,… Zn – столбцы искомой обратной матрицы, E1=(1,0,0,…,0), E2=(0,1,0,…,0), …En=(0,0,…,1) – соответствующие столбцы единичной матрицы.
Решая n систем линейных уравнений (7) получаем столбцы обратной матрицы A.
Находить решение систем линейных уравнений (7) можно любым подходящим численным методом. Основной принцип метода Гаусса – приведение матрицы к треугольному виду – может быть использован для решения задачи нахождения обратной матрицы n*n элементов. Если в методе Гаусса, при каждом проходе по строкам системы в качестве правой части использовать вектор с единственным единичным элементом, соответствующим текущей обрабатываемой строке, то получим алгоритм обращения матрицы n*n с использованием метода Гаусса.
Описание алгоритма вычисления обратной матрицы n*n методом Гаусса:
Задаем коэффициенты исходной системы линейных уравнений a(n,n) и правые части b(n).
Задаем цикл по j от 1 до n.
Задаем цикл по k от 1 до n.
В цикле по k зануляем все значения правой части системы b(k)=0.
Конец цикла по k.
В цикле по j:
Задаем значение для текущего уравнения j значение правой части уравнения равное 1 (b(j)=1).
По имеющейся системе уравнений с помощью метода Гаусса вычисляем решения системы x(1..n).
Задаем цикл по k от 1 до n.
Копируем в цикле по k только что найденные значения x(k=1….k=n) в j-й столбец временной матрицы с(n,n).
Конец цикла по k.
Конец цикла по j.
Задаем цикл по i от 1 до n.
Задаем цикл по j от 1 до n.
В цикле по j копируем найденные значения обратной матрицы, содержащиеся во временной матрице с(n,n), в матрицу a(n,n).
Конец цикла по j.
Конец цикла по i.
Конец алгоритма.
Пример алгоритма вычисления обратной матрицы n×n методом Гаусса на естественном языке:
lb=нижняя_граница_диапазона_случайных_чисел
ub=верхняя_граница_диапазона_случайных_чисел
dec=количество_знаков_после_запятой
n=размерность_системы
Определить Массив a(n,n),x(n),b(n)
* формируем матрицу коэффициентов уравнения и выводим их на печать
Печать " Матрица коэффициентов a(n,n)"
Вызвать Случ_Матирица(@a,n,lb,ub,dec,1)
* формируем правую часть системы и выводим ее на печать
Печать" Правые частии системы b(n)"
Вызвать Случ_Вектор(@b,n,lb,ub,dec,1)
* "Выводим коэффициенты исходной системы"
Вызвать Печать_Системы(@a,@b,n,dec)
* "Находим обратную матрицу методом Гаусса"
Вызвать Обратить_Матрицу(@a,n)
* "Выводим обратную матрицу"
Вызвать Печать_Системы(@a,@b,n,dec)
Печать" Конец программы "
Определить Процедуру Обратить_Матрицу
Параметры a,n
Определить Локальный Массив c(n,n),b(n),x(n)
Определить Локальную Переменную i,j,k,l,m
Цикл по j от 1 до n
Цикл по k от 1 до n
b(k)=0
Конец Цикла
b(j)=1
Вызвать Метод_Гаусса(@a,@b,@x,n)
FOR k=1 TO n
c(k,j)=x(k)
Конец Цикла
Конец Цикла
Цикл по i от 1 до n
Цикл по j от 1 до n
a(i,j)=c(i,j)
Конец Цикла
Конец Цикла
Конец Определения Процедуры
Определить Функцию Случ_Матирица
Параметры a,n,lb,ub,dec,prnt
Определить Массив a(n,n)
Цикл по i от 1 до n
Цикл по j от 1 до n
a(i,j)=(ub-lb)*Случайный()+lb
a(i,j)=Округлить(a(i,j),dec)
Конец Цикла
Конец Цикла
Если prnt=1 Тогда
Цикл по i от 1 до n
Цикл по j от 1 до n
Печать a(i,j)
Конец Цикла
Печать
Конец Цикла
Конец Если
Возврат
Конец Определения Функции
Определить Функцию Случ_Вектор
Параметры a,n,lb,ub,dec,prnt
Определить Массив a(n)
Цикл по i от 1 до n
a(i)=(ub-lb)*Случайный()+lb
a(i)=Округлить(a(i),dec)
Конец Цикла
Если prnt=1 Тогда
Цикл по i от 1 до n
Печать a(i)
Конец Цикла
Конец Если
Конец Определения Функции
Определить Функцию Метод_Гаусса
Параметры a_tmp,b,x,n
Определить локальный Массив a(n,n)
Цикл по j от 1 до n
Цикл по i от 1 до n
a(i,j)=a_tmp(i,j)
Конец Цикла
Конец Цикла
* приводим к треугольному виду
Цикл по k от 1 до n-1
Цикл по l от k+1 до n
p=a(l,k)/a(k,k)
Цикл по m от k до n
a(l,m)=a(l,m)-a(k,m)*p
Конец Цикла
b(l)=b(l)-b(k)*p
Конец Цикла
Конец Цикла
* вычисляем x
Цикл по k от n до 1 с шагом -1
s=0
Цикл по l от k+1 до n
s=s+a(k,l)*x(l)
Конец Цикла
x(k)=(b(k)-s)/a(k,k)
Конец Цикла
Возврат
Конец Определения Функции
Определить Функцию Печать_Системы
Параметры a,b,n,dec
Цикл по i от 1 до n
Цикл по j от 1 до n
Печать a(i,j)
Конец Цикла
Печать " :" + b(i)
Конец Цикла
Возврат
Конец Определения Функции
Пример реализации алгоритма вычисления обратной матрицы NxN методом Гаусса на VFP:
CLEAR
lb=-0.5
ub=0.5
dec=6
n=3
DIMENSION a(n,n),x(n),b(n)
* формируем матрицу коэффициентов уравнения и выводим их на печать
? " Матрица коэффициентов a(n,n)"
CreateRNDMartix(@a,n,lb,ub,dec,1)
?
* формируем правую часть системы и выводим ее на печать
?" Правые частии системы b(n)"
CreateRNDVector(@b,n,lb,ub,dec,1)
?
* "Выводим коэффициенты исходной системы"
PrintSystem(@a,@b,n,dec)
* "Находим обратную матрицу методом Гаусса"
Reverse_Matrix(@a,n)
?
* "Выводим обратную матрицу"
PrintSystem(@a,@b,n,dec)
?
?" Конец программы !!!"
PROCEDURE Reverse_Matrix
LPARAMETERS a,n
LOCAL ARRAY c(n,n),b(n),x(n)
LOCAL i,j,k,l,m
FOR j=1 TO n
FOR k=1 TO n
b(k)=0
ENDFOR
b(j)=1
Gauss_Classic(@a,@b,@x,n)
FOR k=1 TO n
c(k,j)=x(k)
ENDFOR
ENDFOR
FOR i=1 TO n
FOR j=1 TO n
a(i,j)=c(i,j)
ENDFOR
ENDFOR
ENDPROC
FUNCTION CreateRNDMartix
LPARAMETERS a,n,lb,ub,dec,prnt
FOR i=1 TO n
FOR j=1 TO n
a(i,j)=(ub-lb)*RAND()+lb
a(i,j)=ROUND(a(i,j),dec)
ENDFOR
ENDFOR
IF prnt=1 then
?
FOR i=1 TO n
FOR j=1 TO n
?? a(i,j)
ENDFOR
?
ENDFOR
ENDIF
RETURN
ENDFUNC
FUNCTION CreateRNDVector
LPARAMETERS a,n,lb,ub,dec,prnt
FOR i=1 TO n
a(i)=(ub-lb)*RAND()+lb
a(i)=ROUND(a(i),dec)
ENDFOR
IF prnt=1 then
FOR i=1 TO n
? a(i)
ENDFOR
ENDIF
ENDFUNC
FUNCTION Gauss_Classic
LPARAMETERS a_tmp,b,x,n
LOCAL ARRAY a(n,n)
FOR j=1 TO n
FOR i=1 TO n
a(i,j)=a_tmp(i,j)
ENDFOR
ENDFOR
* приводим к треугольному виду
FOR k=1 TO n-1
FOR l=k+1 TO n
p=a(l,k)/a(k,k)
FOR m=k TO n
a(l,m)=a(l,m)-a(k,m)*p
ENDFOR
b(l)=b(l)-b(k)*p
ENDFOR
ENDFOR
* вычисляем x
FOR k=n TO 1 STEP -1
s=0
FOR l=k+1 TO n
s=s+a(k,l)*x(l)
ENDFOR
x(k)=(b(k)-s)/a(k,k)
ENDFOR
RETURN
ENDFUNC
FUNCTION PrintSystem
LPARAMETERS a,b,n,dec
FOR i=1 TO n
?
FOR j=1 TO n
?? STR(a(i,j),dec*2+2,dec)
ENDFOR
?? " :" + STR(b(i),dec*2+2,dec)
ENDFOR
RETURN
ENDFUNC
В данной реализация использован прием формирования матрицы коэффициентов системы уравнений случайным образом из заданного диапазона, при этом границы диапазона определяются значениями lb (low bound – нижняя граница) и ub (upper bound – верхняя граница).
Запись Округлить() и Случайный() означают соответственно вызовы стандартных встроенных функций округления и возврата псевдослучайного значения из диапазона от 0 до 1.
Пример реализации алгоритма вычисления обратной матрицы nxn методом Гаусса на VBA:
Sub Find_Reverse_Matrix()
Dim a(), b(), x()
n = 3
dec = 4
ReDim a(n, n): ReDim b(n): ReDim x(n)
Call Read_Matrix("C:\Temp\system.txt", a(), b(), n)
' Выводим на экран исходную систему
Call Print_Matrix(a(), b(), n, dec)
' Вычисляем обратную матрицу методом Гаусса
Call Reverse_Matrix(a(), b(), x(), n)
' "Выводим обратную матрицу"
Call Print_Matrix(a(), b(), n, dec)
MsgBox "Конец программы !!!"
End Sub
Sub Reverse_Matrix(a(), b(), x(), n)
Dim i, j, k, l, m
Dim c()
ReDim c(n, n)
For j = 1 To n
For k = 1 To n
b(k) = 0
Next k
b(j) = 1
Call Gauss_Classic(a(), b(), x(), n)
For k = 1 To n
c(k, j) = x(k)
Next k
Next j
For i = 1 To n
For j = 1 To n
a(i, j) = c(i, j)
Next j
Next i
End Sub
Sub Gauss_Classic(a_tmp(), b(), x(), n)
Dim i, j, k, l, m
Dim a()
Redim a(n,n)
a()=a_tmp()
' приводим к треугольному виду
For k = 1 To n - 1
For l = k + 1 To n
p = a(l, k) / a(k, k)
For m = k To n
a(l, m) = a(l, m) - a(k, m) * p
Next m
b(l) = b(l) - b(k) * p
Next l
Next k
' вычисляем x
For k = n To 1 Step -1
s = 0
For l = k + 1 To n
s = s + a(k, l) * x(l)
Next l
x(k) = (b(k) - s) / a(k, k)
Next k
End Sub
Sub Read_Matrix(file_path, a(), b(), n)
Dim s, s1, i, j
nf = FreeFile
Open file_path For Input As #nf
For i = 1 To n
pos1 = 1
Input #nf, s
For j = 1 To n
pos2 = InStr(pos1, s, ";")
s1 = Mid(s, pos1, pos2 - pos1)
a(i, j) = Val(s1)
pos1 = pos2 + 1
Next j
pos2 = InStr(pos1, s, ";")
s1 = Mid(s, pos1, pos2 - pos1)
b(i) = Val(s1)
Next i
Close #nf
End Sub
Sub Print_Matrix(a(), b(), n, dec)
Dim i
Dim DStr, str
DStr = "0."
For i = 1 To dec
DStr = DStr + "0"
Next i
str = ""
For i = 1 To n
str = str & vbCrLf
For j = 1 To n
str = str & Format(a(i, j), DStr) & " : "
Next j
str = str & " : " & Format(b(i), DStr)
Next i
Debug.Print str
End Sub
Данная реализация алгоритма использует чтение коэффициентов системы уравнений из текстового файла. Текстовый файл, например, для системы с тремя уравнениями, должен быть следующего вида:
"0.34;0.71;0.63;2.08;"
"0.71;-0.36;-0.18;0.17;"
"1.17;-2.35;0.75;1.28;"
т.е. в каждой строке файла записываются коэффициенты первой строки системы (i=1, a(i,j), b(i)), при этом вся строка заключена в кавычки (т.е. рассматривается VBA как текстовая строка) и после каждого коэффициента ставиться разделитель – точка с запятой (;).
Контрольные вопросы
1. Что такое система линейных уравнений?
2. Что такое решение системы линейных уравнений?
3. Что такое совместность и полнота системы линейных уравнений?
4. Что такое вырожденная система линейных уравнений?
5. Что такое определитель матрицы системы линейных уравнений?
6. Что такое однородная система линейных уравнений?
7. Что такое собственные значения матрицы?
8. Что такое характеристическая функция системы линейных уравнений?
9. Привести алгоритм табуляции характеристической функции системы линейных уравнений.
10. Как найти собственный вектор системы линейных уравнений?
11. Как найти ненулевое решение однородной системы линейных алгебраических уравнений?
12. Привести алгоритм решения системы линейных уравнений методом простой итерации.
13. В чем состоит условие сходимости метода простой итерации для системы линейных уравнений?
14. Как определить точность вычисления решений системы линейных уравнений методом простой итерации?
15. Привести алгоритмы вычисления разностей векторов и длин разностей векторов (норм).
16. Привести алгоритм определения степени сходимости метода простой итерации для системы линейных уравнений.
17. Привести алгоритм модифицированного (с параметром, улучшающим сходимость) метода простой итерации для системы линейных уравнений.
18. Привести алгоритм метода Гаусса-Зейделя.
19. Привести алгоритм обращения матрицы nxn.
Задания
Методами Зейделя и Гаусса-Зейделя решить с точностью до 0,001 систему линейных уравнений. Численным методом найти обратные матрицы к матрицам коэффициентов систем линейных уравнений. Матрицы коэффициентов и векторы правых частей считывать из:
а) текстовых файлов;
б) dbf-таблицы;
в) MS’Excel;
г) MS’Word.
№1 | 2,7x1+3,3x2+1,3x3=2,1; 3,5x1–1,7x2+2,8x3=1,7; 4,1x1+5,8x2–1,7x3=0,8. | №2 | 1,7x1+2,8x2+1,9x3=0,7; 2,1x1+3,4x2+1,8x3=1,1; 4,2x1–1,7x2+1,3x3=2,8. |
№3. | 3,1x1+2,8x2+1,9x3=0,2; 1,9x1+3,1x2+2,1x3=2,1; 7,5x1+3,8x2+4,8x3=5,6. | №4. | 9,1x1+5,6x2+7,8x3=9,8; 3,8x1+5,1x2+2,8x3=6,7; 4,1x1+5,7x2+1,2x3=5,8. |
№5. | 3,3x1+2,1x2+2,8x3=0,8; 4,1x1+3,7x2+4,8x3=5,7; 2,7x1+1,8x2+1,1x3=3,2. | №6. | 7,6x1+5,8x2+4,7x3=10,1; 3,8x1+4,1x2+2,7x3=9,7; 2,9x1+2,1x2+3,8x3=7,8. |
№7. | 3,2x1–2,5x2+3,7x3=6,5; 0,5x1+0, 34x2+1,7x3=0,24; 1,6x1+2,3x2–1,5x3=4,3. | №8. | 5,4x1–2,3x2+3,4x3= –3,5; 4,2x1+1,7x2–2,3x3=2,7; 3,4x1+2,4x2+7,4x3=1,9. |
№9. | 3,6x1+1,8x2–4,7x3=3,8; 2,7x1–3,6x2+1,9x3=0,4; 1,5x1+4,5x2+3,3x3= –1,6. | №10. | 5,6x1+2,7x2–1,7x3=1,9; 3,4x1–3,6x2–6,7x3= –2,4; 0,8x1+1,3x2+3,7x3=1,2. |
№11. | 2,7x1+0,9x2–1,5x3=3,5; 4,5x1–2,8x2+6,7x3=2,6; 5,1x1+3,7x2–1,4x3= –0,14. | №12. | 4,5x1–3,5x2+7,4x3=2,5; 3,1x1–0,6x2–2,3x3= –1,5; 0,8x1+7,4x2–0,5x3=6,4. |
№13. | 3,8x1+6,7x2–1,2x3=5,2; 6,4x1+1,3x2–2,7x3=3,8; 2,4x1–4,5x2+3,5x3= –0,6. | №14. | 5,4x1–6,2x2–0,5x3=0,52; 3,4x1+2,3x2+0,8x3= –0,8; 2,4x1–1,1x2+3,8x3=1,8. |
№15. | 7,8x1+5,4x2+4,8x3=1,8; 3,3x1+1,1x2+1,8x3=2,3; 4,5x1+3,3x2+2,8x3=3,4. | №16. | 3,8x1+4,1x2–2,3x3=4,8; –2,1x1+3,9x2–5,8x3=3,3; 1,8x1+1,1x2–2,1x3=5,8. |
№17. | 1,7x1–2,2x2+3,0x3=1,8; 2,1x1+1,9x2–2,3x3=2,8; 4,2x1+3,9x2–3,1x3=5,1. | №18. | 2,8x1+3,8x2–3,2x3=4,5; 2,5x1–2,8x2+3,3x3=7,1; 6,5x1–7,1x2+4,8x3=6,3. |
№19. | 3,3x1+3,7x2+4,2x3=5,8; 2,7x1+2,3x2–2,9x3=6,1; 4,1x1+4,8x2–5,0x3=7,0. | №20. | 7,1x1+6,8x2+6,1x3=7,0; 5,0x1+4,8x2+5,3x3=6,1; 8,2x1+7,8x2+7,1x3=5,8. |
№21. | 3,7x1+3,1x2+4,0x3=5,0; 4,1x1+4,5x2–4,8x3=4,9; –2,1x1–3,7x2+1,8x3=2,7. | №22. | 4,1x1+5,2x2–5,8x3=7,0; 3,8x1–3,1x2+4,0x3=5,3; 7,8x1+5,3x2–6,3x3=5,8. |
№23. | 3,7x1–2,3x2+4,5x3=2,4; 2,5x1+4,7x2–7,8x3=3,5; 1,6x1+5,3x2+1,3x3= –2,4. | №24. | 6,3x1+5,2x2–0,6x3=1,5; 3,4x1–2,3x2+3,4x3=2,7; 0,8x1+1,4x2+3,5x3= –2,3. |