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

Страницы работы

Содержание работы

Задание

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

Ход работы

Решение системы осуществляется по итерационной схеме, используя формулу:

где – вектор решения на текущей итерации,

– вектор решения на предыдущей итерации,

b – вектор правой части, 

– весовой коэффициент.

Этот метод обеспечивает сходимость метода при условии, что весовой коэффициент положительный и меньше единицы.

Реализация алгоритма простой итерации.

Исходная матрица разрезается на блоки. Т.к. размерность матрицы может нацело не делиться на число компьютеров в топологии, блоков существует два типа,:

1.  блок ширины L, где L определяется следующим образом: , где n – размерность матрицы системы, size – число компьютеров в топологии.

2.  блок ширины L–1.

Таким образом, получаемая реализация разреза такова: сперва выделяются блоки шириной L, а затем блоки шириной L–1.

Таким же образом происходит разрезание векторов правой части и решения на текущей и предыдущей итерациях.

Main ()

{

{Size-1 компьютер производит считывание и рассылку данных всем остальным}

Continue: // метка продолжения счета

{Увеличить количество итераций}

{Умножить матрицу на вектор ()}

{Вычислить решение на текущей итерации: }

if (Условие выхода выполняется)

{Вывести результаты}

else

{Продолжить вычисления (goto continue)}

}

Компьютер, имеющий номер size–1, считывает матрицу и вектор правой части и рассылает всем остальным. После получения данных, происходит умножение матрицы на вектор, используя алгоритм пересылки данных по кольцу, и далее, вычисление решения на текущей итерации.

После получения решения каждый компьютер проверяет по своей части вектора решения условие выхода и посылает полученную информацию компьютеру с номером 0. Нулевой компьютер проводит анализ полученной информации и рассылает всем остальным решение об окончании или продолжении счета.

После окончания счета все компьютеры отсылают свои части вектора решения нулевому компьютеру.


Результаты

Проведем следующие исследования:

1.  время счета в зависимости от размерности задачи;

2.  при некоторой фиксированной размерности (n=N) построить график зависимости времени счета от числа процессоров в осях t, np.

Для исследований выберем матрицу следующего вида:

А =

Эта матрица является невырожденной, следовательно, система линейных алгебраических уравнений с такой матрицей имеет единственное решение.

Для простой проверки правильности решения будем формировать правую часть таким образом, чтобы вектор решений был единичным.

Время счета в зависимости от размерности задачи

Размерность

Время счета, сек

500

2

1000

8

1500

21

2000

40

2500

65

3000

95

3500

129

4000

168

4500

220

5000

283


Зависимость времени счета от числа процессоров при размерности системы N=3000

Число процессоров

Время, сек

1

95

2

95

3

97

4

95

5

95

6

95

7

95

8

95


Вывод:

1.  По результатам 1го теста мы получили, что при увеличении размерности системы увеличивается и время счета.

2.  Исходя из результатов 2го теста, мы получили, что для метода простой итерации практически нет разницы на скольких процессорах считать (на тесте где размерность системы N=3000, на любом количестве процессоров от 1 до 8 было получено практически одно и тоже время, порядка 95 сек.), поэтому можно поставить под сомнение необходимость распараллеливания данного метода.


Программа

#include "mpi.h"

#include <stdio.h>

#include <time.h>

#include <math.h>

#define ND 1

#define Eps 1.e-08

double **A, *Y1, *Y0, *Result, tau;

int n,m,L,iter=0;

time_t starttime,finishtime;

int main( int argc, char *argv[])

{

int tag=11,rank,size,start;

MPI_Status st; MPI_Comm ring;

int dims[ND],per[ND],reord=0,prev,next;

int i,j,k,dim,d;

FILE *fp;

int flag=0;

int recv_flag=0;

MPI_Init(&argc,&argv);

MPI_Comm_rank(MPI_COMM_WORLD,&rank); //computer number

MPI_Comm_size(MPI_COMM_WORLD,&size); //total number of computers

per[0]=1; //ring

Информация о работе