Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- Program Alena;
- uses crt;{cthreads,classes,math;}
- const maxn=10; {Максимальный порядок матрицы}
- {----- Описываем типы для СЛАУ Start -----}
- type matrix=array [1..maxn, 1..maxn] of real; {Коэффициенты системы}
- vector=array [1..maxn] of real; {Свободные члены}
- {----- Описываем типы для СЛАУ End -----}
- var n,i:integer; {Порядок матрицы / счетчик}
- a:matrix; {Коэффициенты системы}
- b,x:vector; {Свободные члены / Корни уравнения}
- eps:real; {Точность}
- {----- Процедура ввода СЛАУ Start -----}
- Procedure ReadSystem(var a:matrix; var b:vector; n:integer);
- var i,j,yline:integer;
- Begin
- yLine:=WhereY; {Текущая строка}
- GotoXY(2,yLine); {Переводим курсор} Write('A');
- for i:=1 to n do
- Begin
- GotoXY((i*6+2),yLine); Write(i); {Выводим столбцы}
- GotoXY(1,(yLine+i)); Write(i:2); {Выводим строки}
- end;
- GotoXY(((n+1)*6+2),yLine); Write('B'); {Столбец свободных членов}
- for i:=1 to n do
- Begin
- for j:=1 to n do
- Begin
- GotoXY((j*6+2),(yLine+i)); {Перемещаем курсор по столбцам}
- Read(A[i,j]); {Вводим коэффициенты системы}
- end;
- GotoXY(((n+1)*6+2),(yLine+i)); {Переводим курсор на столбец свободных членов}
- Read(B[i]); {Вводим свободные члены}
- end;
- end;
- {----- Процедура ввода СЛАУ End -----}
- {----- Процедура вывода результатов Start -----}
- Procedure WithResults(x:vector; n:integer);
- var i:integer;
- Begin
- for i:=1 to n do Writeln(' X[',i,']= ', X[i]:8:5);
- Readln;
- end;
- {----- Процедура вывода результатов End -----}
- {----- Сердце метода Гаусса-Зейделя Start-----}
- Function Gauss_Seidel(a:matrix; b:vector; var x:vector; eps:real; n:integer):boolean;
- var i,j:integer; {Счетчики}
- sum1,sum2,sum,v,approach:real;
- Begin
- {----- Проверяем условие сходимости Start -----}
- for i:=1 to n do
- Begin
- Sum:=0; {Обнуляем значение суммы}
- for j:=1 to n do if (j <> i) then Sum:=Sum+Abs(A[i,j]);
- if (Sum >= Abs(A[i, i])) then
- Begin
- Gauss_Seidel:=False; {Сходимости нет!}
- Exit; {Выход}
- end;
- end;
- {----- Проверяем условие сходимости End -----}
- Repeat
- Approach:=0; {Берем за начальное приближение}
- for i:=1 to n do
- Begin
- {Вычисляем суммы...}
- Sum1:=0; {Обнуляем значение суммы}
- Sum2:=0; {Обнуляем значение суммы}
- for j:=1 to (i-1) do Sum1:=Sum1+A[i,j]*X[j];
- for j:=i to n do Sum2:=Sum2+A[i,j]*X[j];
- {Вычисляем новое приближение...}
- V:=X[i];
- X[i]:=X[i]-(1/A[i,i])*(Sum1+Sum2-B[i]);
- if (Abs(V-X[i]) > Approach) then Approach:=Abs(V-X[i]);
- end;
- Until (Approach < Eps); {Условие завершения}
- Gauss_Seidel:=True; {СЛАУ решена...}
- end;
- {----- Сердце метода Гаусса-Зейделя End -----}
- Begin clrscr;
- Write('--------------------------------------------------------------------------------');
- Writeln(' Программа для решения систем линейных алгебраический уравнений (СЛАУ).');
- Writeln(' Программа может решать СЛАУ до ',MaxN,'-го порядка.');
- Writeln(' Метод решения СЛАУ: Гаусса-Зейделя.');
- Writeln;
- Writeln(' Программу написала:');
- Writeln(' студентка группы БИСТ-211');
- Writeln(' Хлебус Алёна Витальевна');
- Writeln(' Новосибирск, 2013г.');
- Write('--------------------------------------------------------------------------------');
- GotoXY(17,WhereY); Writeln('Для запуска программы нажмите клавишу "Enter"');
- Write('--------------------------------------------------------------------------------');
- Readln; clrscr;
- Write('--------------------------------------------------------------------------------');
- Writeln(' Введите порядок СЛАУ (макс. 10): ');
- Repeat
- Write(' > '); Readln(N);
- if not(N in [1..MaxN]) then Writeln(' ОШИБКА: Число должно принадлежать интервалу [0..',MaxN,']. Повторите ввод...');
- Until ((N > 0) and (N <= MaxN));
- Write('--------------------------------------------------------------------------------');
- Writeln(' Введите точность вычислений: ');
- Repeat
- Write(' > '); Readln(Eps);
- if not((0 < Eps) and (Eps < 1)) then Writeln(' ОШИБКА: Число должно принадлежать интервалу 0 < Eps < 1. Повторите ввод...');
- Until ((Eps > 0) and (Eps < 1));
- Write('--------------------------------------------------------------------------------');
- Writeln(' Введите расширенную матрицу системы: '); ReadSystem(A,B,N);
- {Предположим, что начальное приближение равно нулю...}
- for i:=1 to n do X[i]:=0;
- Write('--------------------------------------------------------------------------------');
- if Gauss_Seidel(A,B,X,Eps,N) then
- Begin
- Writeln(' Результат вычислений по методу Гаусса-Зейделя: ');
- WithResults(X,N);
- end
- else Writeln(' Метод Гуасса-Зейделя не сходится для данной системы!');
- Write('--------------------------------------------------------------------------------');
- GotoXY(15,WhereY); Writeln('Для выхода из программы нажмите клавишу "Enter"');
- Write('--------------------------------------------------------------------------------');
- Readln;
- end.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement