Решение системы линейных уравнений A x b a11 a12 0 a 22 0 0 0 0 a13 a23 a33 an 3 ... a1n x1 b1 ... a2 n x2 b2 ... a 3n x3 b3 ... ann xn bn Прямой ход for i:=1 to n-1 do begin v:=i; {выбор ведущего элемента:} for j:=i+1 to n do if abs(A[j,i])>abs(A[v,i]) then v:=j; if v<>i then {перестановка i–го уравнения с v–м} for j:=i to n+1 do begin z:=A[i,j]; A[i,j]:=A[v,j]; A[v,j]:=z end; for k:=i+1 to n do begin {вычитание уравнений} c:=A[k,i]/A[i,i]; for j:=i to n+1 do A[k,j]:=A[k,j]-c*A[i,j] end end; ______________________________________________________________________________________________________________________________ При j=i: A[k,i]=A[k,i]-(A[k,i]/A[i,i])*A[i,i] Обратный ход for i:=n downto 2 do begin for k:=1 to i-1 do {вычитание уравнений} begin c:=A[k,i]/A[i,i]; A[k,n+1]:=A[k,n+1]-c*A[i,n+1]; A[k,i]:=0 end end; Вычисление неизвестных for i:=1 to n do X[i]:=A[i,n+1]/A[i,i]; Трудоемкость T1(n) = (n – 1)·(n + 1) + (n – 2)·n + … + 1∙3 = (2n3 +3n2 – 5n)/6 ≈ n3/3 T2(n) = n + (n – 1) + … + 1 = n·(n + 1)/2 ≈ n2/2 Общее решение системы линейных уравнений 1) система имеет единственное решение тогда и только тогда, когда ранг r матрицы A равен n и «лишние» m – r уравнений (если таковые есть) являются линейными комбинациями r остальных уравнений. Тогда после преобразования матрицы A к единичному виду: x1 = b1, …, xn = bn; 2) система противоречива и не имеет ни одного решения, если «лишние» m – r уравнений не являются линейными комбинациями r остальных уравнений; 3) система имеет бесконечно много решений, если ранг r матрицы A меньше n, и «лишние» m – r уравнений являются линейными комбинациями r остальных уравнений: x1 = b1 – a1,r + 1∙xr + 1 – … – a1,n∙xn , …, xr = br – ar,r + 1∙xr + 1 – … – ar,n∙xn . Общее решение системы линейных уравнений Результат после прямого и обратного хода: 1 0 0 0 0 0 1 0 0 0 0 a1, r 1 0 a2, r 1 1 ar , r 1 0 0 0 0 a1, n b1 a2, n b2 x1 x2 ar , n br br 1 0 xn b 0 m Общее решение системы уравнений for i:=1 to n do L[i]:=i; ______________________________________________________________________ i:=1; if n<=m then r:=n else r:=m; while i<=r do begin {выбор ведущего элемента A[v,u]} if abs(A[v,u])<eps then r:=i-1 else begin {перестановка строк} {перестановка столбцов} {деление i-й строки на A[i,i]} {вычитание уравнений} i:=i+1 end end; выбор ведущего элемента A[v,u] v:=i; u:=i; for j:=i to m do for k:=i to n do if abs(A[j,k])>abs(A[v,u]) then begin v:=j; u:=k end; _______________________________________________________________________________________________________ перестановка строк if v<>i then {перестановка i-го уравнения с v-м} for j:=i to n+1 do begin z:=A[i,j]; A[i,j]:=A[v,j]; A[v,j]:=z end; перестановка столбцов if u<>i then begin {перестановка i-го столбца с u-м} for k:=1 to m do begin z:=A[k,i]; A[k,i]:=A[k,u]; A[k,u]:=z end; p:=L[i]; L[i]:=L[u]; L[u]:=p end; _______________________________________________________________________________________________________ деление i-й строки на c:=A[i,i]; for j:=i to n+1 do A[i,j]:=A[i,j]/c; A[i,i] вычитание уравнений for k:=1 to m do if k<>i then begin c:=A[k,i]; for j:=i to n+1 do A[k,j]:=A[k,j]-c*A[i,j] end; ____________________________________________________________________ Общее решение системы уравнений: X[L[r+1]], ..., X[L[n]] – независимые переменные; зависимые переменные: X[L[1]]=A[1,n+1]-A[1,r+1]*X[L[r+1]]- ... - A[1,n]*X[L[n]] ... X[L[r]]=A[r,n+1]-A[r,r+1]*X[L[r+1]]- ... - A[r,n]*X[L[n]] Трудоемкость при m≥n выбор ведущего элемента T1(n,m) = m·n + (m – 1) ·(n – 1) + … + (m – n + 1)·1 = = n2 + (n – 1)2 + … + 12 + (m – n)·n + … + (m – n)·1 ≈ ≈ n3/3 + (m – n) n2/2 = m·n2/2 – n3/6 перестановка строк T2(n) = (n + 1) + n + … + 2 = (n + 2)·(n + 1)/2 – 1 ≈ n2/2 перестановка столбцов T3(n,m) = m·(n – 1) деление i-й строки на A[i,i] T4(n) = (n + 1) + n + … + 2 ≈ n2/2 вычитание уравнений T5(n,m) = m·(n + 1) + m·n + … + m·2 + m·1 = = m·(n + 1)·(n + 2)/2 ≈ m·n2/2 Общая трудоемкость T1(n,m) ≈ m·n2 – n3/6 Вычисление определителя i:=1; r:=n; p:=1; while i<=r do begin {выбор ведущего элемента A[v,i]} if abs(A[v,i])<eps then r:=i-1 else begin {перестановка строк} {вычитание строк матрицы} i:=i+1 end end; {вычисление определителя} Вычисление определителя выбор ведущего элемента A[v,i] v:=i; for j:=i+1 to n do if abs(A[j,i])>abs(A[v,i]) then v:=j; Трудоемкость: T1(n) = n + (n – 1) + … + 1 = n(n + 1)/2 ≈ n2/2 ______________________________________________ перестановка строк if v<>i then begin p:=-p; for j:=i to n do begin z:=A[i,j]; A[i,j]:=A[v,j]; A[v,j]:=z end end; Трудоемкость: T2(n) = n + (n – 1) + … + 1 = n(n + 1)/2 ≈ n2/2 Вычисление определителя вычитание строк матрицы for k:=i+1 to n do begin c:=A[k,i]/A[i,i]; for j:=i to n do A[k,j]:=A[k,j]-c*A[i,j] end; T3(n) = (n – 1)n + (n – 2) (n – 1) + … + 1∙2 = (n3 – n)/3 ≈ n3/3 _______________________________________________ вычисление определителя if r<n then X:=0 else begin X:=p*A[1,1]; for i:=2 to n do X:=X*A[i,i] end; Вычисление обратной матрицы A∙D = I, (*) где A – исходная квадратная матрица; D – обратная матрица; I – единичная матрица. A D j I j , j 1,..., n где D – j–й столбец обратной матрицы; j I j – j–й столбец единичной матрицы. __________________________________________________________ После приведения матрицы A к единичному виду: I∙D = D (**) Вычисление обратной матрицы for i:=1 to n do for j:=1 to n do if i=j then D[i,j]:=1 else D[i,j]:=0; Трудоемкость: T1(n) = n2 _______________________________________________________________________ i:=1; r:=n; while i<=r do begin {выбор ведущего элемента A[v,i]} if abs(A[v,i])<eps then r:=i-1; else begin {перестановка строк} {деление i-й строки на A[i,i]} {вычитание уравнений} i:=i+1 end end; Вычисление обратной матрицы перестановка строк if v<>i then begin for j:=i to n do begin z:=A[i,j]; A[i,j]:=A[v,j]; A[v,j]:=z end; for j:=1 to n do begin z:=D[i,j]; D[i,j]:=D[v,j]; D[v,j]:=z end end; Трудоемкость: T2(n) ≈ n2/2 + n2 = 3/2 n2 Вычисление обратной матрицы деление i-й строки на A[i,i] aii:= A[i,i]; for j:=i to n do A[i,j]:=A[i,j]/aii; for j:=1 to n do D[i,j]:=D[i,j]/aii; Трудоемкость: T3(n) ≈ n2/2 + n2 = 3/2 n2 Вычисление обратной матрицы вычитание уравнений for k:=1 to n do if k<>i then begin c:=A[k,i]; for j:=i to n do A[k,j]:=A[k,j]-c*A[i,j]; for j:=1 to n do D[k,j]:=D[k,j]-c*D[i,j] end; Трудоемкость: T3(n) ≈ n3/2 + n3 = 3/2 n3