Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Alg_Lang_All.doc
Скачиваний:
3
Добавлен:
01.07.2025
Размер:
3.3 Mб
Скачать

Обращение матрицы 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.

Конец алгоритма.

Пример алгоритма вычисления обратной матрицы nn методом Гаусса на естественном языке:

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 как текстовая строка) и после каждого коэффициента ставиться разделитель – точка с запятой (;).

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]