Пример: Глобальная сеть INTERNET
Я ищу:
На главную  |  Добавить в избранное  

Главная/

Программирование, базы данных. /

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

←предыдущая следующая→  
1 2 3 4 5 

массив b вводится c клавиатуры расширенная матрица системы. Начальное прибижение предполагается равным нулю. Оба массива и переменные n и e передаются функции Seidel. В функции Seidel исследуется сходимость системы, и в том случае если система не сходится, выполнение функции прекращается с результатом false. В ходе каждой итерации вычисляется новое приближение и и абсолютная погрешность. Когда полученная погрешность становится меньше заданной, выполнение функции прекращается. Полученное решение выводится на экран при помощи вспомогательной процедуры WriteX.

2.2.4. Листинг программы и результаты работы.

Uses CRT;

Const

     maxn = 10;

Type

    Data = Real;

    Matrix = Array[1..maxn, 1..maxn] of Data;

    Vector = Array[1..maxn] of Data;

{ Процедура ввода расширенной матрицы системы }

Procedure ReadSystem(n: Integer; var a: Matrix; var b: Vector);

Var

   i, j, r: Integer;

Begin

     r := WhereY;

     GotoXY(2, r);

     Write('A');

     For i := 1 to n do begin

         GotoXY(i * 6 + 2, r);

         Write(i);

         GotoXY(1, r + i + 1);

         Write(i:2);

     end;

     GotoXY((n + 1) * 6 + 2, r);

     Write('b');

     For i := 1 to n do begin

         For j := 1 to n do begin

             GotoXY(j * 6 + 2, r + i + 1);

             Read(a[i, j]);

         end;

         GotoXY((n + 1) * 6 + 2, r + i + 1);

         Read(b[i]);

     end;

End;

{ Процедура вывода результатов }

Procedure WriteX(n :Integer; x: Vector);

Var

   i: Integer;

Begin

     For i := 1 to n do

         Writeln('x', i, ' = ', x[i]);

End;

{ Функция, реализующая метод Зейделя }

Function Seidel(n: Integer; a: Matrix; b: Vector; var x: Vector; e: Data) :Boolean;

Var

   i, j: Integer;

   s1, s2, s, v, m: Data;

Begin

     { Исследуем сходимость }

     For i := 1 to n do begin

         s := 0;

         For j := 1 to n do

             If j <> i then

                s := s + Abs(a[i, j]);

         If s >= Abs(a[i, i]) then begin

            Seidel := false;

            Exit;

         end;

     end;

     Repeat

         m := 0;

         For i := 1 to n do begin

             { Вычисляем суммы }

             s1 := 0;

             s2 := 0;

             For j := 1 to i - 1 do

                 s1 := s1 + a[i, j] * x[j];

             For j := i to n do

                 s2 := s2 + a[i, j] * x[j];

             { Вычисляем новое приближение и погрешность }

             v := x[i];

             x[i] := x[i] - (1 / a[i, i]) * (s1 + s2 - b[i]);

             If Abs(v - x[i]) > m then

                m := Abs(v - x[i]);

         end;

     Until m < e;

     Seidel := true;

End;

Var

    n, i: Integer;

    a: Matrix;

    b, x: Vector;

    e: Data;

Begin

      ClrScr;

      Writeln('Программа решения систем линейных уравнений по методу Зейделя');

      Writeln;

      Writeln('Введите порядок матрицы системы (макс. 10)');

      Repeat

             Write('>');

             Read(n);

      Until (n > 0) and (n <= maxn);

      Writeln;

      Writeln('Введите точность вычислений');

      Repeat

             Write('>');

             Read(e);

      Until (e > 0) and (e < 1);

      Writeln;

      Writeln('Введите расширенную матрицу системы');

      ReadSystem(n, a, b);

      Writeln;

      { Предполагаем начальное приближение равным нулю }

      For i := 1 to n do

          x[i] := 0;

      If Seidel(n, a, b, x, e) then begin

         Writeln('Результат вычислений по методу Зейделя');

         WriteX(n, x);

      end

      else

          Writeln('Метод Зейделя не сходится для данной системы');

      Writeln;

End.

Программа решения систем линейных уравнений по методу Зейделя

Введите порядок матрицы системы (макс. 10)

>4

Введите точность вычислений

>.000001

Введите расширенную матрицу системы

 A     1     2     3     4     b

 1     4.1   0.1   0.2   0.2   21.14

 2     0.3   5.3   0.9   -0.1  -17.82

 3     0.2   0.3   3.2   0.2   9.02

 4     0.1   0.1   0.2   -9.1  17.08

Результат вычислений по методу Зейделя

x1 =  5.2000000008E+00

x2 = -4.2000000028E+00

x3 =  3.0000000003E+00

x4 = -1.8000000000E+00

←предыдущая следующая→  
1 2 3 4 5 


Copyright © 2005—2007 «RefStore.Ru»