ТЕМА 2. МЕТОДЫ РЕШЕНИЯ СИСТЕМ ЛИНЕЙНЫХ АЛГЕБРАИЧЕСКИХ УРАВНЕНИЙ
Поможем в ✍️ написании учебной работы
Поможем с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой

Система линейных алгебраических уравнений (СЛАУ) имеет вид:

Ее можно представить в матричном виде:

A×X = B

где A - матрица коэффициентов, столбец ХT=(x1, x2, … , xn) – столбец неизвестных переменных, ВT=(b1, b2,…, bn) - столбец правых частей системы.

Для того, чтобы система могла иметь решение, нужно, чтобы ее определитель не был равен нулю, тогда матрица А — будет невырожденной, а сама система называется совместной.

 

Способы решения СЛАУ.

  1. Метод Гаусса.

Он может быть реализован в аналитическом или алгоритмическом виде. Суть аналитического решения по методу Гаусса (МГ):

1) преобразовать СЛАУ к ступенчатому виду – прямой ход МГ;

2) восстановить значения неизвестных переменных с хn до х1 –обратный ход МГ.

Алгоритм прямого хода МГ имеет три шага:

1. Проверка aii=0. Если условие выполняется, то заменить элементы i-ой и (i+1)-ой строк.

2. Преобразовать элементы i-ой строки так, чтобы aii =1, то есть поделить элементы этой строки на aii.

3. Все строки с номерами i+1, i+2, …, n преобразовать так, чтобы ai+1,i , ai+2,i , … , an,i были равны нулю, то есть вычесть последовательно из каждой i+1, i+2, …, n-ой строки i-ую строку, умноженную на ai+1,i.

 

Пример 2.1:

3x+2y+z=5      (1стр):3            x+2/3y+1/3z=5/3                     (2с)-(1с)

x+y-z=0            ó                 x+y-z=0                      ó

4x-y+5z=3                                      4x-y+5z=3                  (3с)-(1с)*4

x+2/3y+1/3z=5/3                          (2с)*3 x+2/3y+1/3z=5/3 (3с)-(2с)*(-11/3)

1/3y-4/3z=-5/3                      ó      y - 4z = -5                       ó

-11/3y +11/3z=-11/3                    -11/3y +11/3z=-11/3        

 

x+2/3y+1/3z=5/3                     (3с):(-11)         x+2/3y+1/3z=5/3              

 y - 4z = -5                       ó                      y - 4z = -5        ó

 -11z=-22                                                        z=2

 

x+2/3y+1/3z=5/3                     x+2/3*3+1/3*2=5/3                     x=-1

 y-4*2=-5         ó      y=3                              ó      y=3

z=2                              z=2                                         z=2

 

Однако, следует указать недостаток МГ:

Поскольку на каждой ступеньке приходится определять ведущий коэффициент аii, то при его значении значительно меньшем единицы, деление на него на шаге 2 приводит к увеличению значений коэффициентов, стоящих в i-ой строке. Причем, чем меньше аii, тем сильнее увеличение. Это сказывается на погрешностях расчетов и получаемые значения будут далеки от верных.

Для преодоления недостатка между шагами 1 и 2 вводят дополнительный шаг, заключающийся в выборе максимального из элементов ai,i, ai+1,i , ai+2,i , … , an,i. После определения такого максимального элемента, находящегося в k-ой строке,  строчки I и k просто меняют местами. Введение дополнительного шага не сказывается на значениях переменных.


Пример 2.1 с устранением недостатка:

3x+2y+z=5      (1c)<->(3c)      4x-y+5z=3       (1c):4                    

x+y-z=0 ó                                 x+y-z=0            ó                          

4x-y+5z=3                                      3x+2y+z=5          

 

x-1/4y+5/4z=3/4            (2с)-(1с) x-1/4y+5/4z=3/4 (2)<->(3)

x+y-z=0                      ó                      5/4y-9/4z=-3/4            ó

3x+2y+z=5                     (3с)-(1с)*3      11/4y -11/4z=11/4

 

x-1/4y+5/4z=3/4 (2с):(11/4)   x-1/4y+5/4z=3/4      (3с)-(2с)*(5/4)

11/4y -11/4z=11/4  ó            y - z=1           ó

5/4y-9/4z=-3/4                           5/4y-9/4z=-3/4

 

x-1/4y+5/4z=3/4    (3): (-1)         x-1/4y+5/4z=3/4           x=-1

   y - z=1    ó                y-2=1                ó      y=3

        -z=-2                                   z=2                                   z=2

Как видно, решение в обоих случаях одинаковое.

В случае составления программы алгоритм следующий:

  1. Для k от 1 до (n-1) выполнить следующее:
  2. Для i от (k+1) до n выполнить следующее:
  3.        
  4.        
  5.          Для j от (k+1) до n выполнить следующее:
  6.               
  7. Для k от n до 1 выполнить следующее:
  8.  

Первые шесть шагов называются прямым ходом метода Гаусса, шаги 7-8- Обратным ходом Метода Гаусса.

Устранение недостатка МГ означает добавление в алгоритм между шагами 1 и 2следующие строчки:

Найти m>=k такое, чтобы |amk|=max{|aik|} при всех i>=k

Если |amk|<eps, то остановить работу (однозначного решения нет), иначе поменять местами bk и bm, akj и amj при k<=j<=n

 


Программа, написанная на языке Pascal , имеет вид:

Uses crt;

Const n1=10;

Var k,i,j,n:integer; sum:real;

l,a,a1:array[1..n1,1..n1] of real;

b,b1,x:array[1..n1] of real;

BEGIN

Write('n=');read(n);

 

{БЛОК ВЫВОДА МАТРИЦЫ A}

For i:=1 to n do

begin

For j:=1 to n do

           begin

                           writeln(‘введите a[',i,',',j,'] элемент');

                          readln(a[i,j]);

    end;

writeln('введите b[',i,'] элемент');

readln(b[i]);

end;

 

{БЛОК ПОКАЗА МАТРИЦЫ А НА ЭКРАНЕ}

writeln(исходная матрица А');

for i:=1 to n do

begin

for j:=1 to n do write(a[i,j],' ');

writeln;

end;

 

{ БЛОК НАХОЖДЕНИЯ МАТРИЦЫ А'=А1}

For k:=1 to n-1 do

For i:=k+1 to n do

  begin

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

           b[i]:=b[i]-l[i,k]*b[k];

           for j:=k+1 to n do a[i,j]:=a[i,j]-l[i,k]*a[k,j];

  end;

For i:=1 to n do

For j:=1 to n do

           begin

           a1[i,j]:=a[i,j]/a[i,i];

           b1[i]:=b[i]/a[i,i];

           end;

 

{БЛОК ПОКАЗА МАТРИЦЫ А1 НА ЭКРАНЕ}

writeln('преобразованная матрица А');

For i:=1 to n do

begin

for j:=1 to n do write(a1[i,j],' ');

writeln;

end;

 

 

{БЛОК РАСЧЕТА МАТРИЦЫ X}

For k:=n downto 1 do

           begin

for j:=k+1 to n do sum:=sum+a1[k,j]*x[j];

x[k]:=b1[k]-sum; sum:=0;

end;

 

{БЛОК ВЫВОДА ПЕРЕМЕННЫХ НА ЭКРАН}

writeln('переменные равны:');

For i:=1 to n do writeln('x[',i,']=',x[i]);

Readln;

END.

 

 



Метод LU разложения матрицы

LU – разложение матрицы – это представление квадратной матрицы А в виде произведения лево-треугольной матрицы L и верхнетреугольной матрицы U. Такое разложение обосновывается следующей теоремой:

Теорема: Любая квадратная матрицы А, главные миноры которой

 отличны от нуля, представима в виде произведения двух матриц A = LU , где

,

Причем разложение единственно с точностью до диагональных элементов.

 

На практике для удобства элементы u11, u22, …,unn принимают равными единице.

После того, как разложение A=LU получено, для нахождения решения СЛАУ можно использовать два шага:

1. Найти набор Y из решения системы L*Y=B (прямой ход МГ)

2. Найти значения переменных Х их решения U*X=Y (обратный ход МГ)

Отметим, что это разложение A=LU помогает тогда, когда требуется найти решение СЛАУ при разных правых частях уравнений.

В случае составления программы алгоритм следующий:

1. L – нулевая матрица, U – единичная.

2. Для i=1..n

3.    Для j=1..n

4.      Если i>=j, то

                  иначе

5. Для i=1..n

    

6. Для i=n..1


Программа, написанная на языке Pascal , имеет вид:

Uses crt;

Const n1=10;

Var k,i,j,n:integer; l,a,u:array[1..n1,1..n1] of real; b,y,x:array[1..n1] of real; sum:real;

{определяем типы используемых массивов}

BEGIN 

Write(‘n=’);read(n);

 

{БЛОК ВВОДА МАТРИЦЫ А}

For i:=1 to n do

begin

For j:=1 to n do

begin

        write('введите a[',i,',',j,'] '); readln(a[I,j]);

end;

write('введите b[',i,'] ');read(b[i]);

end;

 

 

{БЛОК ПОКАЗА МАТРИЦЫ А НА ЭКРАНЕ}

Writeln(‘Исходная матрица А’);

For i:=1 to n do

begin

For j:=1 to n do write(a[i,j],’ ‘); Writeln;

end;

 

{БЛОК НАХОЖДЕНИЯ МАТРИЦ L и U}

For i:=1 to n do u[i,i]:=1; {матрица U - единичная}

For i:=1 to n do

For j:=1 to n do

   If i>=j then

                          Begin

                                          For k:=1 to j-1 do sum:=sum+l[i,k]*u[k,j];

                                          l[I,j]:=a[I,j]-sum;

                                          sum:=0;

                          end

              else

                          begin

                                          For k:=1 to i-1 do sum:=sum+l[i,k]*u[k,j];

                                          u[i,j]:=(a[i,j]-sum)/l[i,i];

                                          sum:=0;

                          end;

 

{БЛОК ПОКАЗА МАТРИЦЫ L НА ЭКРАНЕ}

Writeln(‘Преобразованная матрица L’);

For i:=1 to n do

begin

For j:=1 to n do write(l[i,j],’ ‘);

Writeln;

End;

 

{БЛОК ПОКАЗА МАТРИЦЫ U НА ЭКРАНЕ}

Writeln(‘Преобразованная матрица U’)

For i:=1 to n do

begin

For j:=1 to n do write(u[i,j],’ ‘);

Writeln;

End;

{БЛОК ПОДСЧЕТА И ПОКАЗА ПЕРЕМЕННЫХ Y}

For i:=1 to n do

           Begin

           For j:=1 to i-1 do sum:= sum+l[i,j]*y[j];

           Y[i]:=(b[i]-sum)/l[I,i]; writeln(‘y[’,I,’]=’,y[i]);

           Sum:=0;

           End;

 

{БЛОК ПОДСЧЕТА И ПОКАЗА ПЕРЕМЕННЫХ X}

For i:=n downto 1 do

           begin

 For j:=i+1 to n do sum:=sum+u[i,j]*x[j];

X[i]:=y[i]-sum;

writeln(‘x[’,i,’]=’,x[i]);

sum:=0;

End;  

Readln;

END.

Пример 2.2:

Дана матрица А. Найти элементы матриц L и U.

           3        2        1

A=     1        1        -1

           4        -1       5

Решение:         0        0        0                        1        0        0

1.Пусть L=      0        0        0,    U=         0        1        0

                          0        0        0                        0        0        1

2.i=1

3. j=1

4. 1>=1 then l11=a11=3

3.j=2

4. 1>=2 else u12=(a12-0)/l11 = 2/3

 

3.j=3

4. 1>=3 else u13=(a13-0)/l11 = 1/3

2.i=2

3. j=1

4. 2>=1 then l21=a21=1

3.j=2

4. 2>=2 then l22=a22-l21*u12 = 1/3

3.j=3

4. 2>=3 else u23=(a23-l21*u13)/l22 = -4

2.i=3

3. j=1

4. 3>=1 then l31=a31=4

3.j=2

4. 3>=2 then l32=a32-l31*u12 = -11/3

3.j=3

4. 3>=3 then l33=(a33-l31*u13-l32*u23) = -11

 

Таким образом, получены матрицы 

           3        0        0                        1        2/3     1/3

 L=     1        1/3     0,     U=        0        1        -4

           4        -11/3 -11                    0        0        1

 

5.i=1  y1=b1/l11=5/3

5.i=2  y2=(b2-l21*y1)/l22=(0-1*5/3)/ 1/3 = -5

5.i=3  y3=(b3-l31*y1-l32*y2)/l33 = (3-4*5/3-(-11/3)*(-5))/(-11) = 2

Таким образом, получен столбец Y=(5/3, -5, 2)

 

6.i=3  x3=y3=2

6.i=2  x2=(y2-u23*x3)=(-5-(-4)*2)=3

6.i=1  x1=(y1-u12*x2-u13*x3)=5/3-2/3*3-1/3*2=-1

Таким образом, получены неизвестные х1=-1, х2 = 3, х3 = 2.

3. Нахождение обратной матрицы методом Гаусса

Ненулевая матрица А называется обратимой, если существует матрица А-1, называемая обратной, и выполнено условие:

А-1∙А = А∙А-1 = Е

Пусть Х – обратная матрица, тогда А∙Х = Е. Представляя матрицы Х и Е в виде хi=(x1i x2i … xni)T и еi=(0 … 1 … 0)Т, получим n систем

A∙xi = ei, где 1<=i<=n,

где в качестве неизвестных векторов выступают столбцы искомой матрицы Х, а в качестве известных векторов правой части системы – поочередно столбцы единичной матрицы. Разложение матрицы А достаточно сделать один раз.

Пример 2.3:

Дана матрица А. Найти обратную к ней.

           3        2        1

A=     1        1        -1

           4        -1       5

Решение:

Приведем аналитическое решение.

Итак, необходимо решить три системы (количество решаемых систем равно порядку исходной матрицы, n=3) любым удобным способом.

 

1) 3x11+2x21+x31=1                        x11+2/3x21+1/3x31=1/3

  x11+ x21 – x31=0        ó      x11+ x21 - x31=0         ó          

4x11 – x21+5x31=0                      4x11 - x31 + 5x31=0                           

 

x11+2/3x21+1/3x31=1/3             x11+2/3x21+1/3x31=1/3

1/3x21 - 4/3x31=-1/3       ó      x21  - 4x31=-1             ó

-11/3x21+11/3x31=-4/3            -11/3x21+11/3x31=-4/3      

 

x11+2/3x21+1/3x31=1/3             x11+2/3x21+1/3x31=1/3  x11=-4/11

 x21  - 4x31=-1            ó      x21  - 4x31=-1                  x21=9/11

 -11x31= -5                                  x31=5/11                                 x31=5/11

 

2) 3x12+2x22+x32=0                        x12+2/3x22+1/3x32=0          

  x12+ x22 – x32=1         ó      x12+ x22 - x32=1         ó          

4x12 – x22+5x32=0                      4x12 - x32 +  5x32=0                           

 

x12+2/3x22+1/3x32=0                 x12+2/3x22+1/3x32=0          

1/3x22 - 4/3x32=1            ó      x22  - 4x32=3                  ó

-11/3x22+11/3x32=0                  -11/3x22+11/3x32=0                           

 

x12+2/3x22+1/3x32=0                     x12+2/3x22+1/3x32=0      x12=1

 x22  - 4x32=1               ó      x22  - 4x32=3                  x22=-1

-11x32= 11                                  x32=-1                         x32=-1

 

3) 3x13+2x23+x33=0                        x13+2/3x23+1/3x33=0          

  x13+ x23 – x33=0        ó      x13+ x23 - x33=0         ó          

4x13 – x23+5x33=1                      4x13 - x33 + 5x33=1                           

 

x13+2/3x23+1/3x33=0                 x13+2/3x23+1/3x33=0          

  1/3x23 - 4/3x33=0     ó                 x23  - 4x33=0        ó          

-11/3x23+11/3x33=1              -11/3x23+11/3x33=1                       

 

x13+2/3x23+1/3x33=0                     x13+2/3x23+1/3x33=0      x13=3/11

       x23  - 4x33=0       ó      x23  - 4x33=0  x23=-4/11

               -11x33= 1                     x33=-1/11                    x33=-1/11

 

Таким образом, обратная матрица к матрице A имеет вид:

                          -4/11 1        3/11

X=     9/11  -1       -4/11

           5/11  -1       -1/11

 

Проверка: А∙Х = Е

 

3   2 1              -4/11 1 3/11                1 0 0

1 1 -1 ×       9/11 -1 -4/11 =        0 1 0

4 -1 5              5/11 -1 -1/11                0 0 1


В случае составления программы алгоритм следующий:

  1. Для z от 1 до n выполнить следующее:
  2. b[z,z]=1
  3.   Для k от 1 до (n-1) выполнить следующее:
  4.     Для i от (k+1) до n выполнить следующее:
  5.        
  6.        
  7.          Для j от (k+1) до n выполнить следующее:
  8.               
  1. Для k от n до 1 выполнить следующее:

9.   

Программа, написанная на языке Pascal , имеет вид:

Uses crt;

Const n1=10;

Var z,k,i,j,n:integer;

l,a,x,b,a1,b1:array[1..n1,1..n1] of real;

sum:real;

BEGIN clrscr;

write('n=');read(n);

For i:=1 to n do

For j:=1 to n do

           begin

Write('vvedite a[',i,',',j,']=');

readln(a[i,j]);

                          end;

Writeln(' matrix À');

For i:=1 to n do

Begin

For j:=1 to n do write(a[i,j],' ');

Writeln;

End;

For z:=1 to n do b[z,z]:=1;

For k:=1 to n-1 do

        For i:=k+1 to n do

                   Begin

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

                        for z:=1 to n do b[i,z]:=b[i,z]-l[i,k]*b[k,z];

                        For j:=k+1 to n do a[i,j]:=a[i,j]-l[i,k]*a[k,j];

                   End;

For i:=1 to n do

For j:=1 to n do

           Begin

           A1[i,j]:=a[i,j]/a[i,i];

  for z:=1 to n do B1[i,z]:=b[i,z]/a[I,i];

end;

for z:=1 to n do

For k:=n downto 1 do

begin

For j:=k+1 to n do sum:=sum+a1[k,j]*x[j,z];

x[k,z]:=(b1[k,z]-sum)/a1[k,k]; sum:=0;

                                          end;

writeln;

Writeln('matrix À^(-1)');

For i:=1 to n do

begin

For j:=1 to n do write(x[i,j],' ');

Writeln;

end;

Readln;

END.

 



Дата: 2019-03-05, просмотров: 275.