Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
2012 Вычислительная математика практика 01-08.pdf
Скачиваний:
16
Добавлен:
05.06.2015
Размер:
550.13 Кб
Скачать

Практическое задание №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

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