unit GaussMUnit; interface GaussSolveM; implementation {$DOC+} (************************************************************************* $RU Решение системы линейных уравнений методом Гаусса с частичным выбором максимального элемента. Система имеет вид: Ax = b где A - матрица NxN, x - вектор Nx1, b - вектор Nx1 Входные параметры: A - массив с нумерацией элементов [1..N, 1..N+1]. В столбцах от 1 до N содержит левую часть системы, в столбце N+1 содержит правую часть. N - размер системы Epsilon - погрешность сравнения с нолем элементов на главной диагонали верхнетреугольной матрицы, полученной в ходе решения. Если число по модулю меньше Epsilon, то оно считается нолем. Выбирается программистом исходя из задачи. Обычно на несколько порядков меньше, чем средняя величина коэффициентов матрицы A. Выходные параметры: X - массив с нумерацией элементов [1..N] Решение задачи. Результат: True - если матрица невырождена и решение находится в X False - если матрица близка к вырожденной. При этом в X НЕ НАХОДИТСЯ РЕШЕНИЕ. *************************************************************************) function GaussSolveM( A : array of array of Real; const N : Integer; out X : array of Real; const Epsilon : Real):Boolean; var I : Integer; J : Integer; K : Integer; M : Real; T : Real; begin SetBounds(X, [1,N]); Result:=True; //триангуляция матрицы for i:=1 to n do begin //выбор ведущего элемента k:=i; m:=AbsReal(a[i,i]); for j:=i+1 to n do begin if m<AbsReal(a[j,i]) then begin m:=AbsReal(a[j,i]); k:=j; end; end; //перестановка if AbsReal(m)>0 then begin for j:=i to n+1 do begin t:=a[i,j]; a[i,j]:=a[k,j]; a[k,j]:=t; end; for k:=i+1 to n do begin t:=a[k,i]/a[i,i]; a[k,i]:=0; for j:=i+1 to n+1 do begin a[k,j]:=a[k,j]-t*a[i,j]; end; end; end else begin Result:=False; Break; end; end; //решение if Result then begin i:=n; repeat x[i]:=a[i,n+1]; j:=i+1; while j<=n do begin x[i]:=x[i]-a[i,j]*x[j]; j:=j+1; end; x[i]:=x[i]/a[i,i]; i:=i-1 until not(i>=1); end; end; end.