Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Литература / Козин Р.Г. Алгоритмы численных методов линейной алгебры и их программная реализация

.pdf
Скачиваний:
4
Добавлен:
07.09.2025
Размер:
4.33 Mб
Скачать

float det3(float s1[],float s2[],float s3[]) { float d;

d=s1[0]*(s2[1]*s3[2]-s2[2]*s3[1])-s2[0]*(s1[1]*s3[2]-s1[2]*s3[1])+ s3[0]*(s1[1]*s2[2]-s1[2]*s2[1]);

return d;

}

//рассчитывает определитель 4-го порядка, разложением по минорам первой строки float det4(float m1[],float m2[],float m3[],float m4[]){

float d; float *s1,*s2,*s3; s1=&m2[1];s2=&m3[1];s3=&m4[1]; d=m1[0]*det3(s1,s2,s3);

s1=&m1[1];s2=&m3[1];s3=&m4[1]; d=d-m2[0]*det3(s1,s2,s3); s1=&m1[1];s2=&m2[1];s3=&m4[1]; d=d+m3[0]*det3(s1,s2,s3); s1=&m1[1];s2=&m2[1];s3=&m3[1]; d=d-m4[0]*det3(s1,s2,s3); return d;

}

//рассчитывает определитель 5-го порядка, разложением по минорам первой строки float det5(float m1[],float m2[],float m3[],float m4[],float m5[]){

float d; float *s1,*s2,*s3,*s4; s1=&m2[1];s2=&m3[1];s3=&m4[1];s4=&m5[1], d=m1[0]*det4(s1,s2,s3,s4);

s1=&m1[1];s2=&m3[1];s3=&m4[1];s4=&m5[1], d=d-m2[0]*det4(s1,s2,s3,s4); s1=&m1[1];s2=&m2[1];s3=&m4[1];s4=&m5[1], d=d+m3[0]*det4(s1,s2,s3,s4); s1=&m1[1];s2=&m2[1];s3=&m3[1];s4=&m5[1], d=d-m4[0]*det4(s1,s2,s3,s4); s1=&m1[1];s2=&m2[1];s3=&m3[1];s4=&m4[1], d=d+m5[0]*det4(s1,s2,s3,s4); r eturn d;

}

//вычисляет невязку для полученного решения: = Ax b

void not_eqv(float s1[],float s2[],float s3[],float s4[],float s5[],float s6[],float x[],float dx[]){ int i;

for(i=0;i<5;i++){ dx[i]=s1[i]*x[0]+s2[i]*x[1]+s3[i]*x[2]+s4[i]*x[3]+s5[i]*x[4]-s6[i];}

}

Содержание файла eqv5.txt с системой уравнений 5-го порядка:

71

Скриншоты с результатами работы программы:

72

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

2.2.2.Метод исключения Гаусса

Вметоде Гаусса исходная система Ax b , начиная с левого столбца, с помощью (n 1) последовательных преобразований

приводится к системе с верхней треугольной матрицей. Решение последней находится элементарно.

Приведем формулы, по которым выполняется k-е преобразование. К данному моменту текущая расширенная матрица исходной системы (к исходной матрице добавлен столбец, состоящий из компонентов вектора b) имеет следующей вид:

 

 

A

 

A

 

A

 

A

1

 

 

 

 

11

 

1k

 

1 j

 

1n

 

 

 

 

0

 

 

 

 

 

 

 

 

 

 

 

0

0

Akk

 

Akj

 

Ak n 1

 

... k

A(k 1)

 

0

0

 

 

 

 

 

 

 

. (2.21)

 

 

 

 

 

0

0

A

 

A

 

A

1

 

... i

 

 

 

 

ik

 

ij

 

i n

 

 

0

0

 

 

 

 

 

 

 

 

 

 

 

 

 

 

0

0

A

 

 

 

A

1

 

 

 

 

 

 

nk

 

 

 

nn

 

 

При k-м преобразовании в матрице A(k 1) необходимо обнулить все компоненты k-го нижнего подстолбца, начиная с компонента

Ak 1k .

Последнее осуществляется вычитанием из i-й строки компонен-

тов k-й строки, умноженной на отношение Aik :

Akk

Aij Aij Aik Akj , i (k 1) ... n, j k ... (n 1) .

Akk

73

Алгоритм этой операции представлен на схеме: for i (k 1),n

{

buf

Aik

(2.22)

Akk

for j k, (n 1)

{

Aij Aij buf * Akj

}

}

Замечания.

1. Легко проверить, что преобразование (2.22) эквивалентно матричной операции

M (k) A(k 1)

где матрица M (k ) имеет вид

 

1

 

 

0

 

0

M (k )

0

 

 

0

 

0

 

 

 

M (k )

A( k 1)

.

ik

A( k 1)

ik

 

 

kk

 

0

 

 

0

 

 

 

 

 

 

 

0

 

 

 

1

 

0

 

,

 

M((kk )1)k

 

0

 

 

 

 

 

 

0

 

 

 

M (k )

 

1

 

 

 

 

 

nk

 

 

 

 

Поэтому операцию приведения матрицы к верхней треугольной можно представить в матричном виде

A(n 1) M (n 1) ... M (1) A .

2. Поскольку нулевая нижняя подматрица в дальнейших операциях не используется, то нет необходимости ее явно обнулять. Исходя из этого, в алгоритме

(2.22) внутренний цикл можно начинать со значения k 1 .

Поместив последовательность операций (2.22) внутрь цикла по полному числу преобразований

for k 1, (n 1){ алгоритм(2.22) },

(2.23)

получим алгоритм, приводящий исходную систему уравнений к эквивалентной системе с верхней треугольной матрицей.

74

Для уменьшения влияния ошибок округления и повышения устойчивости работы алгоритма (2.23) в нем перед началом очередного преобразования необходимо выполнять процедуру «выбора ведущего элемента».

Задачи этой процедуры:

поставить на место k-й строки строку из оставшихся нижних строк с максимальным по модулю элементом в k-м нижнем подстолбце;

проверить, что найденный максимальный элемент не равен нулю (матрица невырожденная);

осуществить подсчет определителя исходной матрицы.

При вычислении определителя учитывается, что:

1)определитель треугольной матрицы равен произведению ее диагональных компонент;

2)значение определителя не изменяется, если к его строке при-

бавить другую строку, умноженную на произвольный коэффициент:

A11

A12

 

A11

(A22

A12 ) A12 (A21 A11 )

 

A21 A11

A22 A12

 

 

 

 

 

A11 A22 A11 A12 A12 A21 A11 A12 A11 A22 A12 A21;

3)при перестановке строк (или столбцов) матрицы знак ее определителя меняется на противоположный:

A21

A22

 

A A

A A

( 1)(A A

A A );

 

A11

A12

 

21

12

11

22

11

22

21

12

 

 

 

 

 

 

 

 

 

4) умножение всех компонент строки/столбца матрицы на число приводит к умножению определителя этой матрицы на то же число:

A11

A12

 

A A A A (A A A A ).

 

A21

A22

 

11

22

12

21

11

22

12

21

 

 

 

 

 

 

 

 

 

Дополнительно приведем еще два свойства определителя, которые будут использоваться в дальнейшем.

1.det(A*B) = det(A)*det(B), где A и В – матрицы размерности

n*n.

2.det(A 1 ) 1 / det(A) , так как A 1 A E и det(E) 1.

75

Справедливость этих соотношений подтверждают результаты выполнения программы на языке пакета Maxima для случайных матриц размерности 5*5:

kill(all);

numer:true;

fpprintprec:6;

ratprint:false;

/* п/п формирует случайную матрицу размерности n*n */ rndA(n):=block

(

A:zeromatrix(n,n), for i thru n do

for j thru n do A[i,j]:random(1.0)

);

n:5;

rndA(n); B:copy(A); rndA(n); A; C:A.B;

dC:determinant(C); dA:determinant(A); dB:determinant(B); dAB:dA*dB; Aobr:invert(A); dAobr:determinant(Aobr); d:1/dAobr;

– матрица B;

– матрица А;

– матрица C = A*B;

76

– значения определителей матриц С, A, B и det(A)*det(B);

– матрица A 1 ;

– значения определителей матриц A 1 и

1/det( A 1 ).

Алгоритм процедуры выбора ведущего элемента приведен ниже (где nul – переменная для хранения машинного нуля, используемо-

го для проверки действительных чисел на нуль; обычно nul 10 10 и может корректироваться пользователем для фильтрации уровня ошибок округления, возникающих в процессе вычисления):

det 1 (начальнаяинициализацияперед запускомцикла (2.23))процедура

k max k

Amax Akk for i (k 1), n

{

Amod Aik

if Amod Amax then

{

Amax Amod k max i

}

}

77

if

A max nul ( 0) then

 

 

 

 

 

 

 

 

 

{

 

 

 

 

 

 

 

 

 

 

 

 

det 0 (матрица вырожденная)

 

 

 

 

 

 

 

 

выход изпроцедуры

 

 

 

 

 

 

 

 

 

}

 

 

 

 

 

 

 

 

 

 

 

if

k max k then

 

 

 

 

 

 

 

 

 

{

 

 

 

 

 

 

 

 

 

 

 

 

for j k,(n 1) (переставляемстроки)

 

 

 

 

 

{

 

 

 

 

 

 

 

 

 

 

 

buf Akj

 

 

 

 

 

 

 

 

 

 

Akj A(k max) j

 

 

 

 

 

 

 

 

 

 

A(kmax) j

buf

 

 

 

 

 

 

 

 

 

 

}

 

 

 

 

 

 

 

 

 

 

 

det det

 

 

 

 

 

 

 

 

 

 

}

 

 

 

 

 

 

 

 

 

 

 

det det* Akk

(вычислениеопределителя)

 

 

 

(2.24)

 

Замечание. Перестановка i и j строк эквивалентна матричной операции

 

 

 

 

 

T (i,

j) A

 

 

 

 

где

 

 

 

 

i

 

j

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

1

0

0

0

0

0

 

 

 

 

 

0

1

0

0

0

0

i

 

 

T(i,

 

0

0

0

0

1

0

 

 

j)

0

0

0

1

0

 

 

 

 

 

 

 

0

 

 

 

 

 

 

0

0

1

0

0

0

j

 

 

 

 

 

0

0

0

0

0

 

 

 

 

 

 

 

1

 

 

 

 

 

 

 

 

 

 

 

 

 

 

матрица перестановок (на примере матрицы 6х6 и i 3, j 5 ).

 

Она обладает следующими свойствами.

 

 

 

 

 

1. Матричная операция T (i, j) A переставляет строки, например:

 

 

0

1 A11

 

A12

 

A21

A22

 

 

 

1

0 A

 

A

 

A

A

.

 

 

 

 

21

 

22

 

11

 

12

 

78

2. Матричная операция AT(i, j) переставляет столбцы, например:

A11

A12

0

1

A12

A11

 

A

A

1

0

A

A

.

21

22

 

 

22

21

 

3. T (i, j)T (i, j) E , например:

0

1 0

1

1

0

 

 

 

 

1

.

1

0 1

0

0

 

После приведения системы уравнений к системе с треугольной матрицей

A11 x1

...

A1i xi

...

A1 j xj

...

A1(n 1)

 

 

...

...

...

...

...

 

 

Aii xi

...

Aij xj

...

Ai (n 1)

 

 

 

 

...

...

...

 

 

 

 

 

Ann xn

An(n 1)

(2.25)

легко записать алгоритм решения последней (учтено, что правые части уравнений хранятся в дополнительном столбце расширенной

матрицы Ai (n 1) , i 1, n ):

if

 

Ann

 

nul then {det 0, exit sub} else det det* Ann

 

 

x

 

An(n 1)

 

 

 

n

 

 

 

 

Ann

 

 

 

 

 

 

 

 

 

 

 

for i (n 1),1 step 1

(2.26)

{

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

1

 

 

n

 

 

 

xi

 

Ai(n 1)

 

Aij xj

 

 

Aii

 

 

 

 

 

 

 

j (i 1)

 

}

Здесь первый условный оператор завершает проверку обусловленности матрицы и подсчет значения определителя.

79

2.2.3.Метод оптимального исключения Гаусса–Жордана

Вотличие от метода Гаусса в данном методе исходная система Ax b с помощью n последовательных преобразований сводится к

системе с единичной матрицей. При этом решение системы располагается на месте правого крайнего столбца расширенной матрицы преобразованной системы (добавлен столбец, состоящий из компонентов вектора b):

Ex LAx Lb ,

где L L(n) ... L(1) .

Приведем формулы, по которым выполняется k-е преобразование. К данному моменту текущая расширенная матрица исходной системы имеет следующей вид

 

 

1

 

A

 

A

 

A

1

 

 

 

 

 

 

1k

 

1 j

 

1n

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

0

 

Akk

 

Akj

 

Ak n 1

 

... k

A(k 1)

 

 

 

 

 

 

 

 

 

 

 

 

 

.

 

 

0

 

A

 

A

 

A

1

 

... i

 

 

 

 

ik

 

ij

 

i n

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

0

 

A

 

 

 

A

1

 

 

 

 

 

 

nk

 

 

 

nn

 

 

Первоначально компонент матрицы Akk приводится к единице (путем деления k-й правой подстроки на компонент Akk ):

A

 

Akj

,

j k ... (n 1) .

(2.27)

 

kj

Akk

 

 

 

 

 

 

 

 

Затем обнуляются все остальные компоненты k-го столбца расширенной матрицы (путем вычитания из каждой i-й строки k

строки, умноженной на компонент Aik ):

Aij Aij Aik Akj ,

i 1...

n,i k; j k ...

(n 1) .

(2.28)

Замечание. Легко проверить, что преобразования матрицы (2.27) и (2.28) эквивалентно матричной операции

L(k ) A(k 1) .

Здесь A(k 1) – исходная матрица после (k 1) -го преобразования, а матрица L(k )

имеет вид (отличается от единичной матрицы, размерности n n , только k-м столбцом)

80