Xreferat.com » Рефераты по математике » Решение систем линейных алгебраических уравнений

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

выбора.

В переменную 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 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 и одномерный массив 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 ');

             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

Если Вам нужна помощь с академической работой (курсовая, контрольная, диплом, реферат и т.д.), обратитесь к нашим специалистам. Более 90000 специалистов готовы Вам помочь.
Бесплатные корректировки и доработки. Бесплатная оценка стоимости работы.

Поможем написать работу на аналогичную тему

Получить выполненную работу или консультацию специалиста по вашему учебному проекту
Нужна помощь в написании работы?
Мы - биржа профессиональных авторов (преподавателей и доцентов вузов). Пишем статьи РИНЦ, ВАК, Scopus. Помогаем в публикации. Правки вносим бесплатно.

Похожие рефераты: