
- •Основы алгоритмизации и языки программирования Учебно-методическое пособие
- •Содержание
- •Лабораторная работа №1. Базовые языковые конструкции vfp и vba. Основы работы с данными
- •Контрольные вопросы
- •Задания
- •Лабораторная работа №2. Определение корней уравнений Определение корня уравнения методом деления отрезка пополам (дихотомии)
- •Определение корня одномерного уравнения методами касательных и секущих
- •Определение корня одномерного уравнения методом простой итерации
- •Контрольные вопросы
- •Задания
- •Определение максимального и минимального значения функции двух переменных методом градиентного спуска (подъема)
- •Контрольные вопросы
- •Задания
- •Лабораторная работа №4. Рекурсия. Рекурсивные алгоритмы Рекурсия. Рекурсивные алгоритмы
- •Графика и рекурсивные алгоритмы
- •Контрольные вопросы
- •Задания
- •Лабораторная работа №5. Аппроксимация, интерполяция и экстраполяция Простейшие способы интерполяции и экстраполяции данных
- •Аппроксимация выборки случайных чисел методом наименьших квадратов
- •Контрольные вопросы
- •Задания
- •Лабораторная работа №6. Решение систем линейных уравнений Решение систем линейных уравнений методом Гаусса
- •Решение систем линейных уравнений методом Гаусса с выбором максимального элемента
- •Контрольные вопросы
- •Задания
- •Лабораторная работа №7. Итерационные методы решения систем линейных уравнений. Приложения численных методов решения систем линейных уравнений Метод Зейделя
- •Метод Гаусса-Зейделя
- •Обращение матрицы nхn с использованием метода Гаусса
- •Контрольные вопросы
- •Задания
- •Лабораторная работа №8. Вычисление определенных интегралов Вычисление определенных интегралов методом прямоугольников
- •Вычисление определенных интегралов методом трапеций
- •Вычисление интеграла по методу Симпсона
- •Контрольные вопросы
- •Задания
- •Лабораторная работа №9. Численное решение дифференциальных уравнений Методы численного решения дифференциальных уравнений первого порядка
- •Метод Эйлера
- •Метод Кранка-Николсона
- •Метод Рунге-Кутты четвертого порядка для решения уравнения первого порядка
- •Методы численного решения систем дифференциальных уравнений Гармонические колебания
- •Затухающие колебания
- •Периодический процесс с затуханием и с внешней силой
- •Решение системы дифференциальных уравнений методом Эйлера
- •Решение системы дифференциальных уравнений первого порядка методом Рунге-Кутты
- •Контрольные вопросы
- •Задания
- •Лабораторная работа №10. Генерация равномерных и неравномерных распределений случайных чисел Использование гистограмм для отображения характера распределения случайной величины
- •Генератор дискретно-распределенных значений
- •Генерация дискретных распределений с заданным характером распределения вероятностей
- •Генерация непрерывных распределений вещественных величин Псевдонормальное распределение
- •Генерация линейно возрастающего распределения
- •Контрольные вопросы
- •Задания
- •Список рекомендуемой литературы и источников
Лабораторная работа №7. Итерационные методы решения систем линейных уравнений. Приложения численных методов решения систем линейных уравнений Метод Зейделя
Метод Зейделя относится к итерационным методам решения систем линейных уравнений.
Подробное описание метода Зейделя можно посмотреть в книге Самарский А.А. «Введение в численные методы». Для каждого итерационного метода решение системы линейных уравнений находится в результате многократного повторения одной и той же вычислительной процедуры, которая называется итерационной. Каждое выполнение этой процедуры называется итерацией. В каждой итерации из начального значения вектора решений X в результате выполнения итерационной процедуры получается «новое» приближенное значение вектора решений Z. Если итерационный процесс сходится, то для каждой следующей итерации разность между векторами Х и Z постоянно уменьшается и после достаточно большого количества итераций может стать меньше заданной погрешности определения вектора решений.
Если система N линейных алгебраических уравнений записана в виде:
,
i=1,
…, N (1)
где
– вектора
неизвестных и правых частей,
– матрица
коэффициентов.
Метод Зейделя применяется в одной из двух форм:
,
aij≠0,
i=1,
2, …, N (2)
или
,
aij≠0,
i=1,
2, …, N (3)
В расчетных формулах метода Зейделя (вариант (2), и (3)) Z – «новое» значение вектора неизвестных, а Х – начальное значение вектора Х для каждой итерации.
Рассмотрим вычислительную процедуру (2). Распишем формулу (2) для каждой строки i.
Для i=1:
,
Из этого уравнения легко находится первый элемент «нового» вектора решений z1.
Для i=2
,
из этого уравнения легко находится второй элемент «нового» вектора решений z2,
Для i=3
,
и т.д.
Для i=k
.
Уравнение для строки с номером k можно записать в виде:
,
где k=1,
…, N-1.
В этом уравнении
первое слагаемое –
состоит из известных величин матрицы
коэффициентов и уже вычисленных
элементов вектора решений zj.
Из него получаем значение k-й
компоненты вектора решений –
zk.
Все компоненты «нового» вектора решений получаем в результате выполнения следующего алгоритма:
Цикл по k от 1 до N-1
Конец Цикла
Распишем суммы в формуле в теле цикла. В результате получим более детализированный алгоритм:
Цикл по k от 1 до N
S1=0
Цикл по j от 1 до k-1
S1=S1+akj
Конец Цикла
S2=0
Цикл по j от k+1 до N
S2=S2+ akjxj
Конец Цикла
=(bk-S1-S2)/akk
Конец Цикла
Этот алгоритм представляет собой тело одной итерации. После получения «нового» значения вектора решений – Z, вычисляется разность векторов решений до и после итерации – d = |X-Z|. Если эта разность больше величины заданной допустимой погрешности – «новое» значение вектора решений присваивается начальному: X = Z и итерационный процесс продолжается. Начальные значение вектору X задают исходя из смысла задачи. Если d=|X-Z| меньше величины заданной допустимой погрешности – тогда итерационный процесс завершается.
Можно оптимизировать
последний алгоритм, объединив циклы
для вычислений S1
и S2.
Поскольку в цикле для вычисления S1
компоненты
получаются с предыдущей итерации,
можно заменить на
,
подобную же замену можно произвести в
выражении
=(bk-S1-S2)/akk
в теле
основного цикла.
Цикл по k от 1 до N
S=0
Цикл по j от 1 до N
Если j≠k
S=S+akjxj
Конец Если
Конец Цикла
xk=(bk-S)/akk
Конец Цикла
Теперь можно записать полный алгоритм метода Зейделя с учетом определения максимального количества итераций, требуемой погрешности и т.д.
Алгоритм решения неоднородной системы линейных уравнений методом Зейделя на естественном языке:
n=КоличествоУравнений
ОпределитьМассив a(n,n), b(n), x0(n), x(n)
Max_i = МаксимальноеЗначениеИтераций
ERR=ЗначениеПогрешности
ПолучитьКоэффициенты(@а, @b, n)
ЗадатьНачальноеЗначение(@X)
Цикл по L от 1 до Max_i
Цикл по k от l до N
x0(k)=x(k)
Конец Цикла
Цикл по k от 1 до N
S=0
Цикл по j от 1 до N
Если j≠k
S=S+a(k,j)*x(j)
Конец Если
Конец Цикла
x(k)=(b(k)-S)/a(k,k)
Конец Цикла
DX=0
Цикл по k от 1 до N
DX = DX + (x(k)-Х0(k))^2
Конец Цикла
DX = КвадратныйКорень(DX)
Если DX < ERR Тогда
ПечатьРешения (@x)
ВыходИзЦикла
Иначе
Цикл по k от l до N
x0(k)=x(k)
Конец Цикла
Конец Если
Конец Цикла
Замечание. Матрица коэффициентов в методе Зейделя не должна иметь нулевые диагональные элементы, более того, для лучшей сходимости, можно преобразовать систему уравнений к виду, когда на главной диагонали находятся максимальные по модулю элементы соответствующих подматриц.
Пример реализации алгоритма решения неоднородной системы линейных уравнений методом Зейделя на VFP:
clear
local i, j, k, l, n
local lb, ub, DX
n = 3
max_i = 100
ErrX = 0.01
lb = -0.5
ub = 0.5
dec = 4
LOCAL ARRAY a(n,n), b(n), x(n), x0(n)
? "МАТРИЦА КОЕФИЦИЕНТОВ СИСТЕМЫ А(N,N)"
CreateRNDMartix(@a, n, lb, ub, dec, 1)
? "ВЕКТОР ПРАВОЙ ЧАСТИ СИСТЕМЫ B(N)"
CreateRNDVector(@b, n, lb, ub, dec, 1)
? "НАЧАЛЬНЫЕ ЗНАЧЕНИЯ ВЕКТОРА РЕШЕНИЙ X0(N)"
CreateRNDVector(@x0, n, lb, ub, dec, 1)
For l = 1 To max_i
For k = 1 To n
x(k) = x0(k)
ENDFOR
For k = 1 To n
s = 0
For j = 1 To n
If j <> k Then
s = s + a(k, j) * x(j)
EndIf
ENDFOR
x(k) = (b(k) - s) / a(k, k)
ENDFOR
DX = 0
For k = 1 To n
DX = DX + (x(k) - x0(k)) ^ 2
ENDFOR
DX = Sqrt(DX)
? " Итерация l = " + alltrim(STR(l)) + " : DX = " + TRANSFORM(DX,"99.99999999")
If DX < ErrX Then
?
? " РЕШЕНИЕ НАЙДЕНО "
Print_Vector(@x, n, dec)
EXIT For
Else
For k = 1 To n
x0(k) = x(k)
ENDFOR
ENDIF
ENDFOR
procedure 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
ENDPROC
procedure 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
ENDPROC
procedure Print_Vector
PARAMETERS x, n, dec
local DStr as String
DStr = "99."
For i = 1 To dec
DStr = DStr + "9"
ENDFOR
For i = 1 To n
? " X(" + ALLTRIM(STR(i)) + ") = " + TRANSFORM(x(i), DStr)
ENDFOR
ENDPROC
Пример реализации алгоритма решения неоднородной системы линейных уравнений методом Зейделя на VBA:
Sub Zeidel_test()
Dim i, j, k, l, n
Dim lb, ub, DX
Dim a(), b(), x(), x0()
n = 3
max_i = 100
ErrX = 0.01
lb = -0.5
ub = 0.5
dec = 4
ReDim a(n, n): ReDim b(n): ReDim x(n): ReDim x0(n)
Call CreateRNDMartix(a, n, lb, ub, dec, 1)
Call CreateRNDVector(b, n, lb, ub, dec, 1)
Call CreateRNDVector(x0, n, lb, ub, dec, 1)
For l = 1 To max_i
For k = 1 To n
x(k) = x0(k)
Next k
For k = 1 To n
s = 0
For j = 1 To n
If j <> k Then
s = s + a(k, j) * x(j)
End If
Next j
x(k) = (b(k) - s) / a(k, k)
Next k
DX = 0
For k = 1 To n
DX = DX + (x(k) - x0(k)) ^ 2
Next k
DX = Sqr(DX)
Debug.Print " Итерация l = " & l & " : DX = " & DX
If DX < ErrX Then
Debug.Print
Debug.Print " РЕШЕНИЕ НАЙДЕНО "
Call Print_Vector(x(), n, dec)
Exit For
Else
For k = 1 To n
x0(k) = x(k)
Next k
End If
Next l
End Sub
Sub CreateRNDMartix(a, n, lb, ub, dec, prnt)
Dim str
For i = 1 To n
For j = 1 To n
a(i, j) = (ub - lb) * Rnd() + lb
a(i, j) = Round(a(i, j), dec)
Next j
Next i
If prnt = 1 Then
str = ""
For i = 1 To n
For j = 1 To n
str = str & a(i, j) & " : "
Next j
str = str & vbCrLf
Next i
Debug.Print str
End If
End Sub
Sub CreateRNDVector(a, n, lb, ub, dec, prnt)
For i = 1 To n
a(i) = (ub - lb) * Rnd() + lb
a(i) = Round(a(i), dec)
Next i
If prnt = 1 Then
For i = 1 To n
Debug.Print a(i)
Next i
End If
End Sub
Sub Print_Vector(x(), 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 & "X(" & i & ") = " & Format(x(i), DStr) & vbCrLf
Next i
Debug.Print str
End Sub
Результат работы программ:
МАТРИЦА КОЕФИЦИЕНТОВ СИСТЕМЫ А(N,N)
0,4194 : 0,1317 : 0,1276 :
-0,0715 : -0,402 : 0,061 :
0,1945 : 0,4137 : 0,3348 :
ВЕКТОР ПРАВОЙ ЧАСТИ СИСТЕМЫ B(N)
-0,4774
0,0434
0,4162
НАЧАЛЬНЫЕ ЗНАЧЕНИЯ ВЕКТОРА РЕШЕНИЙ X0(N)
-0,0697
0,1779
0,0025
Итерация l = 1 : DX = 2,12836329279661
Итерация l = 2 : DX = 0,658840965997187
Итерация l = 3 : DX = 8,86987750634338E-02
Итерация l = 4 : DX = 1,74853648883518E-02
Итерация l = 5 : DX = 2,35213495124003E-03
РЕШЕНИЕ НАЙДЕНО
X(1) = -1,8062
X(2) = 0,4723
X(3) = 1,7088
Замечание: данные примеры реализаций алгоритмов используют системы уравнений, коэффициенты которых сформированы случайным образом, поэтому сходимость алгоритма зависит от «удачно сформированного» вектора начальных значений.