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

Главная/

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

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

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

            4,7x1 + 10,4x2 + 9,7x3 + 9,7x4 = –8,4 ,

            x1 = 5, x2 = –4, x3 = 3, x4 = –2.

            2.1.3. Описание алгоритма. В данной программе реализован метод Гаусса со схемой частичного выбора.

В переменную n вводится  порядок матрицы системы. С помощью вспомогательной процедуры ReadSystem в двумерный массив a и одномерный массив b вводится c клавиатуры расширенная матрица системы, после чего оба массива и переменная n передаются функции Gauss. В фукции Gauss для каждого k-го шага вычислений выполняется поиск максимального элемента в k-м столбце матрицы начинаяя с k-й строки. Номер строки, содержащей максимальный элемент сохраняеется в переменной l. В том случае если максимальный элемент находится не в k-й строке, строки с номерами k и l меняются местами. Если же все эти элементы равны нулю, то происходит прекращение выполнения функции Gauss c результатом false. После выбора строки выполняется преобразование матрицы по методу Гаусса. Далее вычисляется решение системы и помещается в массив x. Полученное решение выводится на экран при помощи вспомогательной процедуры WriteX.

2.1.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 Gauss(n: Integer; a: Matrix; b: Vector; var x:Vector): Boolean;

Var

   i, j, k, l: Integer;

   q, m, t: Data;

Begin

     For k := 1 to n - 1 do begin

         { Ищем строку l с максимальным элементом в k-ом столбце}

         l := 0;

         m := 0;

         For i := k to n do

             If Abs(a[i, k]) > m then begin

                m := Abs(a[i, k]);

                l := i;

             end;

         { Если у всех строк от k до n элемент в k-м столбце нулевой,

                то система не имеет однозначного решения }

         If l = 0 then begin

            Gauss := false;

            Exit;

         end;

         { Меняем местом l-ую строку с k-ой }

         If l <> k then begin

            For j := 1 to n do begin

                t := a[k, j];

                a[k, j] := a[l, j];

                a[l, j] := t;

            end;

            t := b[k];

            b[k] := b[l];

            b[l] := t;

         end;

         { Преобразуем матрицу }

         For i := k + 1 to n do begin

             q := a[i, k] / a[k, k];

             For j := 1 to n do

                 If j = k then

                    a[i, j] := 0

                 else

                      a[i, j] := a[i, j] - q * a[k, j];

                 b[i] := b[i] - q * b[k];

             end;

     end;

     { Вычисляем решение }

     x[n] := b[n] / a[n, n];

     For i := n - 1 downto 1 do begin

         t := 0;

         For j := 1 to n-i do

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

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

     end;

     Gauss := true;

End;

Var

    n, i: Integer;

    a: Matrix ;

    b, x: Vector;

Begin

      ClrScr;

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

      Writeln;

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

      Repeat

             Write('>');

             Read(n);

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

      Writeln;

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

      ReadSystem(n, a, b);

      Writeln;

      If Gauss(n, a, b, x) then begin

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

         WriteX(n, x);

      end

      else

          Writeln('Данную систему невозможно решить по методу Гаусса');

      Writeln;

End.

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

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

>4

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

 A     1     2     3     4     b

 1     3.2   5.4   4.2   2.2   2.6

 2     2.1   3.2   3.1   1.1   4.8

 3     1.2   0.4   -0.8  -0.8  3.6

 4     4.7   10.4  9.7   9.7   -8.4

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

x1 =  5.0000000000E+00

x2 = -4.0000000000E+00

x3 =  3.0000000000E+00

x4 = -2.0000000000E+00

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

            2.2.1. Постановка задачи. Требуется решить систему линейных алгебраических уравнений с вещественными коэффициентами вида

            a11x1 + a12x2 + … + a1nxn = b1 ,
            a21x2 + a22x2 + … + a2nxn = b2 ,
            .   .   .   .   .   .   .   .   .   .   .   .   .

            an1x1 + an2x2 + … + annxn = bn

для n ≤ 10 по методу Зейделя.

            2.2.2. Тестовый пример.

            4,1x1 + 0,1x2 + 0,2x3 + 0,2x4 = 21,14 ,

            0,3x1 + 5,3x2 + 0,9x3 – 0,1x4 = – 17,82 ,

            0,2x1 + 0,3x2 + 3,2x3 + 0,2x4 = 9,02 ,

            0,1x1 + 0,1x2 + 0,2x3 – 9,1x4 = 17,08 ,

            x1 = 5,2, x2 = –4,2, x3 = 3, x4 = –1,8.

            2.2.3. Описание алгоритма. В переменную n вводится порядок матрицы системы, в переменную e – максимальная абсолютная погрешность. С помощью вспомогательной процедуры ReadSystem в двумерный массив a и одномерный массив

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


Copyright © 2005—2007 «RefStore.Ru»