Вы находитесь на странице: 1из 15

МИНИСТЕРСТВО НАУКИ И ВЫСШЕГО ОБРАЗОВАНИЯ РФ

ФЕДЕРАЛЬНОЕ ГОСУДАРСТВЕННОЕ БЮДЖЕТНОЕ


ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ ВЫСШЕГО ОБРАЗОВАНИЯ
«НИЖЕГОРОДСКИЙ ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ
УНИВЕРСИТЕТ им. Р.Е. АЛЕКСЕЕВА»

Кафедра «Электроэнергетика, электроснабжение и силовая электроника»

РЕШЕНИЕ СИСТЕМ ЛИНЕЙНЫХ АЛГЕБРАИЧЕСКИХ


УРАВНЕНИЙ МЕТОДОМ ГАУССА И ЗЕЙДЕЛЯ СРЕДСТВАМИ
VBA В MICROSOFT OFFICE EXCEL
Методические указания к практической работе
по курсу «Оптимизация в ЭЭС»
для студентов по направлению
13.03.02 Электроэнергетика и электротехника.
Профиль подготовки «Электроснабжение и релейная защита»,
«Электроэнергетические системы, сети электропередачи, их режимы,
устойчивость и надежность»

Нижний Новгород
2020
Составители:

УДК 621.311.1

Решение систем линейных алгебраических уравнений методом Гаусса и


Зейделя средствами VBA в MS Office Excel: методические указания к
практической работе по курсу «Оптимизация в ЭЭС» для студентов по
направлению 13.03.02 Электроэнергетика и электротехника. Профиль
подготовки «Электроснабжение и релейная защита»,
«Электроэнергетические системы, сети электропередачи, их режимы,
устойчивость и надежность» / НГТУ им. Р.Е. Алексеева; сост.: -
Н.Новгород, 2020. – 15 с.

Научный редактор

Редактор

Подписано в печать . Формат 60х84/16. Печать офсетная.


Бумага газетная. Усл. печ. л. 1,5. Тираж 250 экз. Заказ
________________________________________________________________
Нижегородский государственный технический университет им. Р.Е. Алексеева.
Типография НГТУ, 603950, г. Нижний Новгород, ул. Минина, 24.

© Нижегородский государственный
технический университет им.
Р.Е. Алексеева, 2020
©, 2020
СОДЕРЖАНИЕ

Цель...............................................................................................................................4
Задание..........................................................................................................................4
Порядок выполнения, примеры.................................................................................4
1. Уравнения узловых напряжений........................................................................4
1.1. Алгоритм решения системы методом Гаусса..........................................4
1.2. Метод Зейделя - модификация метода Якоби.........................................5
2. Средства VBA, которые использовались при выполнении задания..............8
2.1. Макрос, выполняющий операцию ввода информации о матрице.........9
2.2. Макрос, очищающий область расчета......................................................9
2.3. Макрос, выполняющий расчет по методу Гаусса.................................10
2.4. Макрос, выполняющий расчет по методу Зейделя...............................11
Содержание отчета....................................................................................................13
Контрольные вопросы...............................................................................................14
Библиографический список......................................................................................15
Цель
Целью работы является повторение операции работ с матрицами,
составление макроса, позволяющего производить решение системы
линейных уравнений средствами VBA в MS Office Excel.
Задание
Составить макрос для ввода данных строк и столбцов, макрос для
расчета по методу Гаусса, по методу Зейделя.

Порядок выполнения, примеры


1. Уравнения узловых напряжений
Метод Гаусса — классический метод решения системы линейных
алгебраических уравнений (СЛАУ). Это метод последовательного
исключения переменных, когда с помощью элементарных преобразований
система уравнений приводится к равносильной системе
верхнетреугольного вида, из которой последовательно, начиная с
последних (по номеру), находятся все переменные системы.
Алгоритм решения системы методом Гаусса состоит из двух частей:
прямой ход метода Гаусса и обратный ход метода Гаусса. Прямой ход
метода Гаусса заключается в последовательном применении к системе
элементарных преобразований, приводящих к равносильной системе, но
имеющей треугольный вид. На обратном ходе происходит вычисление
искомых неизвестных величин, начиная с x n и до x1. К элементарным
преобразованиям относятся преобразования, не изменяющие решение
системы:
1) Перестановка местами двух строк матрицы.
2) Вычитание из одной строки матрицы другой, умноженной на
произвольное число μ не равное нулю.

1.1. Алгоритм решения системы методом Гаусса


Прямой ход.
1) Начало подпрограммы. K = 1.
2) Находим номер строки (LKmax), в которой размещен максимальный
элемент (AKmax) матрицы A в k-том столбце, начиная от диагонального
элемента Akk, и до элемента, стоящего в последней строке Ank.
3) Если AKmax = 0, то система не приводится к треугольному виду и,
следовательно, система не имеет решения.
4) Если LKmax не равен k, то меняем местами строку k и строку LKmax в
которой находится максимальный в столбце элемент.
5) Последовательно вычтем из k + 1-ого, k + 2-го, …, n-го уравнений
системы, k-ое уравнение, умноженное на коэффициент

4
μik = Aik / AKmax, где I номер строки, из которой происходит
вычитание. (I = k + 1, k + 2, …, n).
Aij = Aij – μik Akj, bi = bi – μikbk. (I = k + 1, …, n. J = k, …, n).
В результате выполнения этого пункта, все элементы матрицы A из
k-того столбца, стоящие ниже диагонали, превращаются в нулевые.
K = k + 1.
Если k меньше n, то перейти на пункт 2. Результатом работы
прямого хода метода Гаусса является верхняя треугольная матрица. Все
элементы, стоящие ниже главной диагонали, в преобразованной матрице
будут равны нулю.
Обратный ход.
xn = bn / Ann.
K = n – 1.
Найти сумму d = Akk + 1xk + 1 + … + Akn∙xn , и k-тую компоненту
решения xk = (bk – d) /Akk. k = k – 1.
Вывести полученный массив x. Конец подпрограммы.
1.2. Метод Зейделя - модификация метода Якоби
Метод Зейделя:
x1  b12  x2  b13  x3  ...  b1, m1  xm 1  b1m  xm  c1
x2  b21  x1  b23  x3  ...  b2, m 1  xm1  b2 m  xm  c2
x3  b31  x1  b32  x2  ...  b3, m1  xm1  b3 m  xm  c3
...
xm  bm1  x1  bm 2  x2  bm 3  x3  ...  bm ,m 1  xm 1  ...  cm

bi
aij
bij   ci  
aii , aij i, j  1, 2,..., m, j  i
  , .
Введем нижнюю и верхнюю треугольные матрицы:
 0 0 ... 0   0 b12 ... bm1 
   
b 21 0 ... 0  0 0 ... bm 2 
B1   B2  
 ...   ... 
   
 bm1 bm 2 ... 0  ,  0 0 ... 0  .

 B1, B2 - верхняя и нижняя треугольные матрицы.

5
x ( k 1)  B1  x ( k 1)  B2  x ( k )  c .

Так как B = B1 + B2, то решение x исходной системы удовлетворяет


равенству:
x  B1  x  B2  x  c .
Достаточные условия сходимости.

 Пусть || B || 1 , где || B || - одна из норм  1 . Тогда || B || ,|| B ||


при любом выборе начального приближения х(0) метод Зейделя
сходится со скоростью геометрической прогрессии,
знаменатель которой q  || B || .
 Пусть выполнено условие  1 2 || B ||  || B || 1
. Тогда при любом
выборе начального приближения метод Зейделя сходится и
верна оценка погрешности:

|| x ( n )  x ||  q n || x (0)  x || ,
|| B 2 ||
q  1.
где 1  || B1 ||

Доказательство:
x ( k 1)  x  B1  ( x ( k 1)  x)  B2  ( x ( k )  x ) ,

|| x ( k 1)  x || || B1 ||  || x ( k 1)  x ||  || B2 ||  || x ( k )  x ||,


|| B 2 ||
q .
|| x ( k 1)  x ||  q || x ( k )  x ||, 1  || B1 ||

Так как неравенство верно для всех k  1 , то из него следует:


|| x ( n )  x ||  q n  || x (0)  x ||, 0  q  1 ,

поэтому x   x при n   .
(n)

 A - симметричная положительно определенная матрица. Тогда при


любом выборе начального приближения х(0) метод Зейделя сходится
со скоростью геометрической прогрессии.
Апостериорная оценка погрешности:
если  выполнено условие || B || 1 , то для метода справедлива
апостериорная оценка погрешности:
6
|| B 2 ||
|| x ( n )  x ||  || x ( n )  x ( n 1) || , n  1.
1  || B1 ||
Возьмем k = n – 1 и запишем равенство в следующем виде:
x ( n )  x  B1  ( x ( n )  x)  B2  ( x ( n )  x ( n ) ) .
Тогда:
|| x ( n )  x || || B ||  || x ( n )  x ||  || B2 ||  || x ( n 1)  x ( n ) || .
Отсюда следует:
|| B 2 ||
|| x ( n )  x ||  .
1  || B ||
Полученное неравенство позволяет сформулировать простой
критерий окончания итерационного процесса. Если требуется найти
решение с точностью ε > 0, то итерации следует вести до выполнения
неравенства: 
|| x ( n )  x ( n 1) ||  ε2 ,
|| B 2 ||
ε2  ε
где 1  || B || .
Геометрическая интерпретация метода Зейделя.
Приведем геометрическую интерпретацию в случае m = 2, т.е. в
случае решения системы:
a 11 x 1+ a12 x 2=b1
{
a 21 x 1 +a 22 x 2=b2
.

Расчетные формулы:
x1( k 1)  b12  x1( k )  c1 ;
x1( k 1)  b12  x1( k )  c1 ;
a12 a
b12   ; b21   21 ;
a11 a22
b1 b
c1   ; c2   2 .
a11 a22
Первое уравнения задает на плоскости х1О х2 прямую l1, второе –
прямую l2.

7
Замечание: метод Якоби ориентирован на системы с матрицами,
близкими к диагональным, а метод Зейделя - на матрицы, близкие к
нижним треугольным.
2. Средства VBA, которые использовались при выполнении
задания
В ходе работы были использованы элементы управления формы –
«Кнопка». Вы бор этого элемента происходит следующим образом. На
панели разработчика необходимо нажать кнопку «Вставить», после чего
выбрать элемент «Кнопка». Этот элемент размещаем там, где необходимо,
предварительно изменяя его геометрические размеры до необходимых,
также задаем ему имя. (по картинкам передвигаемся строго по
направлению красных стрелок).

Рис. 2.1. Выполнение элемента «Кнопка»

Щелкнув правой кнопкой по «Кнопке 7», появится выпадающие


меню, в котором нас будет интересовать следующая команда «Назначить
макрос». После нажатия на команду «Назначить макрос» появится окно
где будет необходимо задать имя макроса и написать его вновь самому
или выбрать из уже написанных нами макросов, которым будет управлять
наша «Кнопка 7».

8
Рис. 2.2. Выполнение макроса

2.1. Макрос, выполняющий операцию ввода информации о


матрице
Sub Ввод_данных()
Cells(1, 1).Value = "Матрица"
Cells(1, 2).Value = Val(InputBox("Введите кол-во уравнений матрицы."))
'порядок Матрицы
Dim i, j, n As Double 'Задание переменных
n = Cells(1, 2) 'Порядок Матрицы
For i = 1 To n Step 1 'Закрашиваем необходимую область
For j = 1 To n Step 1 'ввод значений
Cells(i + 2, j).Interior.ColorIndex = 6
Next j
Next i 'Матрица коэффициентов
For i = 1 To n Step 1
Cells(i + 2, n + 1).Interior.ColorIndex = 7
Next i 'А это матрица свободных членов. Итак, закрасили
MsgBox "Введите в закрашенные желтым поля данные матрицы
коэффициентов и в поля, закрашенные розовым, данные матрицы
свободных членов", vbOKOnly
End Sub

2.2. Макрос, очищающий область расчета


Sub Очистка_страницы()
Dim i, j As Double 'макрос стирает заливку и значения из области 20x100
For i = 1 To 100 Step 1
For j = 1 To 20 Step 1
Cells(i, j) = ""
Cells(i, j).Interior.ColorIndex = 0
Next j

9
Next i
End Sub
2.3. Макрос, выполняющий расчет по методу Гаусса
Sub Метод_Гаусса()
Dim i, j, k, S, Sum, n, a, b As Double
n = Cells(1, 2) 'Порядок Матрицы
For k = 1 To n - 1 Step 1
For i = 1 To n Step 1 'Форма для записи промежуточных действий
For j = 1 To n + 1 Step 1
Cells(i + n * k + 2, j) = Cells(i + n * (k - 1) + 2, j)
Cells(i + n * k + 2, j).Interior.ColorIndex = 7 + k
Next j 'добавление ячеек, над которыми не производится никаких
действий
Next i
'Прямой ход метода Гаусса
For i = k + 1 To n Step 1
a = Cells(n * (k - 1) + k - 1 + 3, k)
b = Cells(i + 2 + n * (k - 1), k)
For j = k To n + 1 Step 1
Cells(i + n * k + 2, j) = Cells(n * (k - 1) + k + 2, j) * b / -a + Cells(i + 2 + n
* (k - 1), j)
Cells(i + n * k + 2, j).Interior.ColorIndex = 7 + k
Next j
Next i
Next k
'Обратный ход метода
MsgBox "Промежуточные преобразования матрицы вместе со свободными
членами выделены разными цветами!", vbOKOnly
Cells(1, 4).Value = "Решения"
Cells(1, 4).Interior.ColorIndex = 3
Cells(2, 4).Value = "Значения"
Cells(2, 4).Interior.ColorIndex = 3
Cells(1, n + 4).Value = "X_" & n
Cells(1, n + 4).Interior.ColorIndex = 3
Cells(2, n + 4) = Cells(n * n + 2, n + 1) / Cells(n * n + 2, n)
Cells(2, n + 4).Interior.ColorIndex = 3
For k = n - 1 To 1 Step -1
Sum = 0
For j = k + 1 To n Step 1
Sum = Sum + Cells(n * (n - 1) + k + 2, j) * Cells(2, j + 4)
Next j

10
Cells(1, k + 4).Value = "X_" & k
Cells(1, k + 4).Interior.ColorIndex = 3
Cells(2, k + 4) = (Cells(n * (n - 1) + k + 2, n + 1) - Sum) / Cells(n * (n - 1) + k
+ 2, k)
Cells(2, k + 4).Interior.ColorIndex = 3
Next k
End Sub
2.4. Макрос, выполняющий расчет по методу Зейделя
'1) Основная программа
Sub RESHENIE()
Dim C As Integer
C = Cells(1, 2)
ReDim a(C, C) As Single
ReDim b(C, 1) As Single
ReDim X(C) As Single
Call VVOD(1, 3, 1, C, C, a())
Call VVOD(1, 2, C + 1, C, 1, b())
Call PROVERKA(1, C, a())
Call ZEIDEL(1, C, a(), b(), X())
Call VIVOD(1, C, X())
End Sub
'2) Программа ввода данных
Sub VVOD(list As Integer, row As Integer, col As Integer, n As Integer, m As
Integer, M1() As Single)
Dim i As Integer
Dim j As Integer
For i = 1 To n
For j = 1 To m
M1(i, j) = Worksheets(list).Cells(row + i - 1, col + j - 1).Value
Next j
Next i
End Sub
'3) Программа проверки сходимости
Sub PROVERKA(list As Integer, n As Integer, M1() As Single)
Dim i As Integer
Dim j As Integer
Dim d As Integer
Dim sum As Integer
Worksheets(list).Cells(1, n + 3).Value = "Проверка сходимости"
d=0
For i = 1 To n

11
sum = 0
For j = 1 To n
If j <> i Then sum = sum + Abs(M1(i, j))
Next j
If Abs(M1(i, i)) > Abs(sum) Then d = d + 1
Next i
If d = n Then
Worksheets(list).Cells(2, n + 3).Value = "Сходится"
Else
Worksheets(list).Cells(2, n + 3).Value = "Не сходится"
End If
End Sub
'4) Программа решения СЛАУ методом Зейделя
Sub ZEIDEL(list As Integer, n As Integer, M1() As Single, M2() As Single, M3()
As Single)
Dim i As Integer
Dim j As Integer
Dim g As Integer
Dim S As Single
ReDim m(n) As Single
ReDim X(n) As Single
Dim e As Single
Dim f As Single
Dim v As Single
e = 0.001
g=o
‘Подсчет начальных приближений. Подготовка таблицы решения.
For i = 1 To n
X(i) = M2(i, 1) / M1(i, i)
Worksheets(list).Cells(n + 3, 1).Value = "1"
Worksheets(list).Cells(n + 3, 2).Value = Str(g)
Worksheets(list).Cells(n + 4 + i, 1).Value = "X" + Str(i)
Worksheets(list).Cells(2 * n + 5 + i, 1).Value = "раз-ть X" + Str(i)
Worksheets(list).Cells(3 * n + 7, 1).Value = "MAX разность"
Worksheets(list).Cells(n + 4 + i, g + 2).Value = CInt(X(i) * 1000) / 1000
Next i
Do
'Подсчет суммы решения
For i = 1 To n
For j = 1 To n
If i <> j Then S = S + M1(i, j) * X(j)
Next j
12
'Нахождение приближений
v = X(i)
X(i) = (1 / M1(i, i)) * (M2(i, 1) - S)
Worksheets(list).Cells(n + 4 + i, g + 3).Value = CInt(X(i) * 1000) / 1000
S=0
m(i) = Abs(X(i) - v)
Worksheets(list).Cells(2 * n + 5 + i, g + 3).Value = CInt(m(i) * 10000) / 10000
'Выбор наибольшей разности
f = m(1)
j=1
Do
If f < m(j) Then f = m(j)
j=j+1
Loop Until j > n
Worksheets(list).Cells(3 * n + 7, g + 3).Value = CInt(f * 10000) / 10000
Next i
g=g+1
Worksheets(list).Cells(n + 3, g + 2).Value = g
Loop Until f < e
For i = 1 To n
M3(i) = X(i)
Next i
End Sub
'5) Программа вывода корней СЛАУ
Sub VIVOD(list As Integer, n As Integer, M3() As Single)
Dim i As Integer
Dim col As Integer
col = n + 6
Worksheets(list).Cells(1, col).Value = "Корни СЛАУ"
For i = 1 To n
Worksheets(list).Cells(1 + i, col).Value = "X" + Str(i)
Worksheets(list).Cells(1 + i, col + 1).Value = CInt(M3(i) * 1000) / 1000
Next i
End Sub
Содержание отчета
Отчет должен содержать титульный лист, цель работы, методику
расчета систем уравнений методом Гаусса и методом Зейделя, код
макроса, выводы по работе; к отчёту должен быть приложен файл MS
Office Excel с выполненными макросами.

13
Контрольные вопросы
1. Методы расчета систем линейных уравнений.
2. В чем заключается метод Зейделя.
3. Преимущества и недостатки метода Зейделя.
4. В чем заключается метод Гаусса.
5. Преимущества и недостатки метода Гаусса.

14
Библиографический список

1. В.И.Калядин Решение задач в Excel на VBA применение


программных средств в проектировании. Рецензенты: с.н.с. ФГУП
«ЦНИРТИ им. академика А.И.Берга», к.т.н. В.Ф.Блохина; доцент
кафедры «Автоматизация процессов управления», к.т.н.
Ю.А.Савостьянок.
2. http://ru.wikipedia.org/wiki/Метод_Гаусса (дата обращения: 28.09.20).
3. http://www.taurion.ru/access/13/3 (дата обращения: 28.09.20).
4. http://knowledge.allbest.ru/programming/2c0a65635a3bc78b4c43b89421
206d26_0.html (дата обращения: 28.09.20).
5. Берков Н. А. Численные методы: Учебное пособие. – М: МГИУ,
2000 – 63 с.

15