Литература / Козин Р.Г. Алгоритмы численных методов линейной алгебры и их программная реализация
.pdf
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
