- •Основы алгоритмизации и языки программирования Учебно-методическое пособие
- •Содержание
- •Лабораторная работа №1. Базовые языковые конструкции vfp и vba. Основы работы с данными
- •Контрольные вопросы
- •Задания
- •Лабораторная работа №2. Определение корней уравнений Определение корня уравнения методом деления отрезка пополам (дихотомии)
- •Определение корня одномерного уравнения методами касательных и секущих
- •Определение корня одномерного уравнения методом простой итерации
- •Контрольные вопросы
- •Задания
- •Определение максимального и минимального значения функции двух переменных методом градиентного спуска (подъема)
- •Контрольные вопросы
- •Задания
- •Лабораторная работа №4. Рекурсия. Рекурсивные алгоритмы Рекурсия. Рекурсивные алгоритмы
- •Графика и рекурсивные алгоритмы
- •Контрольные вопросы
- •Задания
- •Лабораторная работа №5. Аппроксимация, интерполяция и экстраполяция Простейшие способы интерполяции и экстраполяции данных
- •Аппроксимация выборки случайных чисел методом наименьших квадратов
- •Контрольные вопросы
- •Задания
- •Лабораторная работа №6. Решение систем линейных уравнений Решение систем линейных уравнений методом Гаусса
- •Решение систем линейных уравнений методом Гаусса с выбором максимального элемента
- •Контрольные вопросы
- •Задания
- •Лабораторная работа №7. Итерационные методы решения систем линейных уравнений. Приложения численных методов решения систем линейных уравнений Метод Зейделя
- •Метод Гаусса-Зейделя
- •Обращение матрицы nхn с использованием метода Гаусса
- •Контрольные вопросы
- •Задания
- •Лабораторная работа №8. Вычисление определенных интегралов Вычисление определенных интегралов методом прямоугольников
- •Вычисление определенных интегралов методом трапеций
- •Вычисление интеграла по методу Симпсона
- •Контрольные вопросы
- •Задания
- •Лабораторная работа №9. Численное решение дифференциальных уравнений Методы численного решения дифференциальных уравнений первого порядка
- •Метод Эйлера
- •Метод Кранка-Николсона
- •Метод Рунге-Кутты четвертого порядка для решения уравнения первого порядка
- •Методы численного решения систем дифференциальных уравнений Гармонические колебания
- •Затухающие колебания
- •Периодический процесс с затуханием и с внешней силой
- •Решение системы дифференциальных уравнений методом Эйлера
- •Решение системы дифференциальных уравнений первого порядка методом Рунге-Кутты
- •Контрольные вопросы
- •Задания
- •Лабораторная работа №10. Генерация равномерных и неравномерных распределений случайных чисел Использование гистограмм для отображения характера распределения случайной величины
- •Генератор дискретно-распределенных значений
- •Генерация дискретных распределений с заданным характером распределения вероятностей
- •Генерация непрерывных распределений вещественных величин Псевдонормальное распределение
- •Генерация линейно возрастающего распределения
- •Контрольные вопросы
- •Задания
- •Список рекомендуемой литературы и источников
Обращение матрицы nхn с использованием метода Гаусса
По определению,
обратная матрица
матрицы A
размерности
n*n
должна удовлетворять соотношению:
AA-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 как текстовая строка) и после каждого коэффициента ставиться разделитель – точка с запятой (;).
