Advertisement
CyberPascal

СЛАУ методом Гаусса-Зейделя

Dec 10th, 2013
1,135
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Pascal 6.37 KB | None | 0 0
  1. Program Alena;
  2.  
  3. uses crt;{cthreads,classes,math;}
  4.  
  5. const maxn=10; {Максимальный порядок матрицы}
  6.  
  7. {----- Описываем типы для СЛАУ Start -----}  
  8. type matrix=array [1..maxn, 1..maxn] of real; {Коэффициенты системы}
  9.      vector=array [1..maxn] of real; {Свободные члены}
  10. {----- Описываем типы для СЛАУ End -----}
  11.  
  12. var n,i:integer; {Порядок матрицы / счетчик}
  13.     a:matrix; {Коэффициенты системы}
  14.     b,x:vector; {Свободные члены / Корни уравнения}
  15.     eps:real; {Точность}
  16.  
  17. {----- Процедура ввода СЛАУ Start -----}
  18. Procedure ReadSystem(var a:matrix; var b:vector; n:integer);
  19. var i,j,yline:integer;
  20. Begin
  21. yLine:=WhereY; {Текущая строка}
  22. GotoXY(2,yLine); {Переводим курсор} Write('A');
  23.  
  24. for i:=1 to n do
  25.     Begin
  26.     GotoXY((i*6+2),yLine); Write(i); {Выводим столбцы}
  27.     GotoXY(1,(yLine+i)); Write(i:2); {Выводим строки}
  28.     end;
  29.  
  30. GotoXY(((n+1)*6+2),yLine); Write('B'); {Столбец свободных членов}
  31.  
  32. for i:=1 to n do
  33.     Begin
  34.     for j:=1 to n do
  35.     Begin
  36.         GotoXY((j*6+2),(yLine+i)); {Перемещаем курсор по столбцам}
  37.         Read(A[i,j]); {Вводим коэффициенты системы}
  38.         end;
  39.  
  40.     GotoXY(((n+1)*6+2),(yLine+i)); {Переводим курсор на столбец свободных членов}
  41.     Read(B[i]); {Вводим свободные члены}
  42.     end;
  43. end;
  44. {----- Процедура ввода СЛАУ End -----}
  45.  
  46. {----- Процедура вывода результатов Start -----}
  47. Procedure WithResults(x:vector; n:integer);
  48. var i:integer;
  49. Begin
  50. for i:=1 to n do Writeln(' X[',i,']= ', X[i]:8:5);
  51. Readln;
  52. end;
  53. {----- Процедура вывода результатов End -----}
  54.  
  55. {----- Сердце метода Гаусса-Зейделя Start-----}
  56. Function Gauss_Seidel(a:matrix; b:vector; var x:vector; eps:real; n:integer):boolean;
  57. var i,j:integer; {Счетчики}
  58.     sum1,sum2,sum,v,approach:real;
  59. Begin
  60.  
  61. {----- Проверяем условие сходимости Start -----}
  62. for i:=1 to n do
  63.     Begin
  64.     Sum:=0; {Обнуляем значение суммы}
  65.     for j:=1 to n do if (j <> i) then Sum:=Sum+Abs(A[i,j]);
  66.  
  67.     if (Sum >= Abs(A[i, i])) then
  68.                              Begin
  69.                                  Gauss_Seidel:=False; {Сходимости нет!}
  70.                                  Exit; {Выход}
  71.                                  end;
  72.  
  73.     end;
  74. {----- Проверяем условие сходимости End -----}
  75.  
  76. Repeat
  77. Approach:=0; {Берем за начальное приближение}
  78. for i:=1 to n do
  79.     Begin
  80.     {Вычисляем суммы...}
  81.     Sum1:=0; {Обнуляем значение суммы}
  82.     Sum2:=0; {Обнуляем значение суммы}
  83.    
  84.     for j:=1 to (i-1) do Sum1:=Sum1+A[i,j]*X[j];
  85.     for j:=i to n do Sum2:=Sum2+A[i,j]*X[j];
  86.  
  87.     {Вычисляем новое приближение...}
  88.     V:=X[i];
  89.     X[i]:=X[i]-(1/A[i,i])*(Sum1+Sum2-B[i]);
  90.  
  91.     if (Abs(V-X[i]) > Approach) then Approach:=Abs(V-X[i]);
  92.     end;
  93. Until (Approach < Eps); {Условие завершения}
  94.  
  95. Gauss_Seidel:=True; {СЛАУ решена...}
  96. end;
  97. {----- Сердце метода Гаусса-Зейделя End -----}
  98.  
  99.  
  100. Begin clrscr;
  101. Write('--------------------------------------------------------------------------------');
  102. Writeln(' Программа для решения систем линейных алгебраический уравнений (СЛАУ).');
  103. Writeln(' Программа может решать СЛАУ до ',MaxN,'-го порядка.');
  104. Writeln(' Метод решения СЛАУ: Гаусса-Зейделя.');
  105. Writeln;
  106. Writeln(' Программу написала:');
  107. Writeln(' студентка группы БИСТ-211');
  108. Writeln(' Хлебус Алёна Витальевна');
  109. Writeln(' Новосибирск, 2013г.');
  110. Write('--------------------------------------------------------------------------------');
  111. GotoXY(17,WhereY); Writeln('Для запуска программы нажмите клавишу "Enter"');
  112. Write('--------------------------------------------------------------------------------');
  113. Readln; clrscr;
  114.  
  115. Write('--------------------------------------------------------------------------------');
  116. Writeln(' Введите порядок СЛАУ (макс. 10): ');
  117. Repeat
  118. Write(' > '); Readln(N);
  119.  
  120. if not(N in [1..MaxN]) then Writeln(' ОШИБКА: Число должно принадлежать интервалу [0..',MaxN,']. Повторите ввод...');
  121. Until ((N > 0) and (N <= MaxN));
  122.  
  123. Write('--------------------------------------------------------------------------------');
  124. Writeln(' Введите точность вычислений: ');
  125. Repeat
  126. Write(' > '); Readln(Eps);
  127. if not((0 < Eps) and (Eps < 1)) then Writeln(' ОШИБКА: Число должно принадлежать интервалу 0 < Eps < 1. Повторите ввод...');
  128. Until ((Eps > 0) and (Eps < 1));
  129.  
  130. Write('--------------------------------------------------------------------------------');
  131. Writeln(' Введите расширенную матрицу системы: '); ReadSystem(A,B,N);
  132.  
  133. {Предположим, что начальное приближение равно нулю...}
  134. for i:=1 to n do X[i]:=0;
  135.  
  136. Write('--------------------------------------------------------------------------------');
  137. if Gauss_Seidel(A,B,X,Eps,N) then
  138.                                  Begin
  139.                                  Writeln(' Результат вычислений по методу Гаусса-Зейделя: ');
  140.                                  WithResults(X,N);
  141.                                  end
  142.                              else Writeln(' Метод Гуасса-Зейделя не сходится для данной системы!');
  143. Write('--------------------------------------------------------------------------------');
  144. GotoXY(15,WhereY); Writeln('Для выхода из программы нажмите клавишу "Enter"');
  145. Write('--------------------------------------------------------------------------------');
  146. Readln;
  147. end.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement