- •Соглашения
- •Общие замечания
- •Порядок выполнения первого задания
- •Общий порядок выполнения очередного (не первого) задания
- •Признак успешности выполнения алгоритма
- •Практическое задание №1. Метод половинного деления
- •Методические указания
- •Порядок выполнения задания
- •Варианты решаемых функций
- •Практическое задание №2. Метод простых итераций
- •Методические указания
- •Порядок выполнения задания
- •Варианты решаемых функций
- •Практическое задание №3. Метод Ньютона
- •Методические указания
- •Порядок выполнения задания
- •Варианты решаемых функций
- •Практическое задание №4. Метод секущих
- •Методические указания
- •Порядок выполнения задания
- •Варианты решаемых функций
- •Практическое задание №5. Метод простых итераций (СЛАУ)
- •Методические указания
- •Порядок выполнения задания
- •Варианты СЛАУ
- •Практическое задание №6. Метод Зейделя (СЛАУ)
- •Методические указания
- •Порядок выполнения задания
- •Варианты СЛАУ
- •Практическое задание №7. Метод Гаусса (СЛАУ)
- •Методические указания
- •Порядок выполнения задания
- •Варианты СЛАУ
- •Практическое задание №8. Интерполяционный многочлен Лагранжа
- •Методические указания
- •Порядок выполнения задания
Практическое задание №6. Метод Зейделя (СЛАУ)
Краткое описание задания: задана система линейных алгебраических уравнений (СЛАУ) в виде A·X = B, здесь A — квадратная матрица коэффициентов при переменных, B — матрица (вектор-столбец) свободных элементов, X — матрица (вектор-строка) переменных. Методом Зейделя найти ее решение с заданной точностью ε = 0,001.
Методические указания
1.Программа ничего не принимает с клавиатуры. Все исходные данные задаются в коде программы, как правило, в основном модуле, во время вызова функции метода (внутри функции main).
2.Программа решает задачу тремя способами:
а) с помощью итераций и заданием матрицы коэффициентов; б) с помощью итераций и заданием решаемой функции; в) с помощью рекурсии и заданием решаемой функции.
3.Название модуля (файла типа .h) для функции метода — mzeidel.
4.Название функции метода — zeidel.
5.Сигнатура функции метода для способа 1 имеет следующий вид:
void zeidel1(int N, double X[], double X1[], double A[], double eps, int* success);
Здесь:
-N — число переменных (размерность СЛАУ);
-X — начальное приближение;
-X1 — новое приближение (результат);
-A — массив коэффициентов и свободных элементов СЛАУ;
-eps — заданная точность решения;
-success — возвращаемый признак успешного выполнения алгоритма.
Сигнатура функции метода для способов 2 и 3 имеет вид:
void zeidelM(int N, double X[], double X1[], slauc ef, double eps, int* success);
Здесь:
-M — номер способа (2 или 3);
-N — число переменных (размерность СЛАУ);
-X — начальное приближение;
-X1 — новое приближение (результат);
-slauc — тип функции, вычисляющей очередное приближение;
-ef — функция, вычисляющая очередное приближение;
36
-eps — заданная точность решения;
-success — возвращаемый признак успешного выполнения алгоритма.
7. Функция метода вызывается в основной функции.
После вызова выводятся строчки результата, число зависит от количества переменных, например:
SUCCESS=7
X1=0.360
X2=0.138
X3=-0.384
Здесь:
SUCCESS — успешность выполнения алгоритма (значение success); Xi — значение переменной xi, вывод должен соответствовать заданной
точности.
Порядок выполнения задания
1.Сначала выполните действие 1, описанное выше в разделе «Общий порядок выполнения очередного (не первого) задания».
2.Добавьте в решение новый модуль типа .h (заголовочный) с названием mzeidel. Процесс добавления нового модуля описан в практическом задании №1.
3.Добавьте в новый модуль файловый комментарий, например:
/* Файл mzeidel.h |
*/ |
/* ОТИ НИЯУ МИФИ |
*/ |
/* 1ПО-XXД |
*/ |
/* Пономарев Владимир Вадимович |
*/ |
/* Вычислительная математика |
*/ |
/* Программа VM1 |
*/ |
/* Метод Зейделя (СЛАУ) |
*/ |
/* 02.04.2013 |
*/ |
4. Для отладки будем решать систему уравнений, подробно рассмотренную в задании №5:
4x1 |
+ 3x2 |
– 3x3 |
= 3 |
|||
x1 |
– |
2x2 |
– |
5x3 |
= |
2 |
5x1 |
– |
3x2 |
+ |
x3 |
= |
1 |
Решение этой системы с точностью 0,001 равно:
x1 = 0,360 x2 = 0,138 x3 = –0,384
5. Скопируйте программный код модуля msiters.h и вставьте его в мо-
дуль mzeidel.h.
37
Замените название NOX на NOZ, а название matr на matz:
//Число неизвестных СЛАУ
#define NOZ 3
//Описание СЛАУ для метода Зейделя double matz[NOZ * NOZ + NOZ] = {
0.0, |
3.0/5.0, |
-1.0/5.0, |
1.0/5.0, |
1.0/6.0, |
0.0, |
4.0/6.0, |
2.0/6.0, |
1.0/5.0, -2.0/5.0, |
0.0, |
-2.0/5.0 |
};
Замените название slau на sluz:
// Функция ищет новое приближение конкретной СЛАУ void sluz(double X[], double X1[]) {
X1[0] = (3.0 / 5.0) * X[1] - (1.0 / 5.0) * X[2] + (1.0 / 5.0); X1[1] = ...;
X1[2] = ...;
}
Удалите описание типа slauc и функцию finish. Замените название функций sitersN на zeidelN.
5. Переходим в модуль VM1.cpp. Включим новый модуль в основной:
/* Метод |
простых |
итераций (СЛАУ) */ |
|
#include |
"msiters.h" |
||
/* |
Метод |
Зейделя |
(СЛАУ) */ |
#include |
"mzeidel.h" |
||
/* |
Заданная точность вычислений */ |
В основной функции описываем вызовы функций zeidelN и вывод результатов, при этом вызовы функций sitersN не удаляем (для сравнения):
/* Основная функция |
*/ |
|
|
void _tmain() { |
|
|
|
int success = 0; |
0.0; |
||
double |
result = |
||
вызовы |
функций sitersN |
||
double |
Z[NOZ] = |
{ 0.2, 0.333, -0.4 }; |
|
double |
W[NOZ] = |
{ 0 }; |
|
zeidel1(NOZ, Z, |
W, |
matz, SEPS, &success); |
|
prints(success, |
NOZ, W); |
||
Z[0] = |
0.2; Z[1] = |
0.333; Z[2] = -0.4; |
|
zeidel2(NOZ, Z, |
W, |
sluz, SEPS, &success); |
|
prints(success, |
NOZ, W); |
||
success = 0; |
|
0.333; Z[2] = -0.4; |
|
Z[0] = |
0.2; Z[1] = |
||
zeidel3(NOZ, Z, |
W, |
sluz, SEPS, &success); |
|
prints(success, |
NOZ, W); |
||
} |
|
|
|
38