var e:real;{Заданная точность} MaxItem:real;{Максимальное значение коэффициента при Х в строке} SummOfRow:real;{Сумма коэффициентов при Х в строке} ReplaceVar:real;{Переменная для организации замены двух значений массива друг другом} Max_X_Difference:real;{Максимальная разность значений x текущей итерации} MaxItemIndex:integer;{Индекс максимального значения коэффициента при х в уравнении} EnumIter:integer;{Счетчик итераций} i,j:integer;{Счетчики} n:integer;{Порядок СЛАУ} OutLine:boolean;{Переменная для однократного вывода сообщения о неудовлетворении условию сходимости} RestartCheck:boolean;{Переменная для проверки необходимости перезапуска алгоритма проверки и замены строк} X_Array: array[0..1000] of real;{Массив значений Х} X_Array_Reserve: array[0..1000] of real;{Массив значений Х (значение после предыдущей итерации)} ReplaceArray:array[0..1000] of real;{Массив для организации проверки удовлетворения СЛАУ условию сходимости} Array_Matrix: array[0..1000,0..1000] of real;{Массив коэффициентов при Х и свободных членов} Array_Matrix_Reserve:array[0..1000,0..1000]of real;{Массив коэффициентов при Х и свободных членов (исходное значение)} begin OutLine:=false; {Ввод исходных данных} write('Введите порядок СЛАУ n '); read(n); for i:=0 to n-1 do begin writeln('Уравнение №',i+1); for j:=0 to n do begin if j<>n then begin write('Введите переменную при Х',j+1,' '); end else write('Введите свободный член '); readln(Array_matrix[i,j]); end; end; write('Введите заданную точность е '); read(e); writeln(); {Вывод на консоль исходной СЛАУ} writeln('Исходная СЛАУ:'); writeln(); for i:=0 to n-1 do begin for j:=0 to n do begin if j=n then begin write(' ',Array_Matrix[i,j],' '); end else write(Array_Matrix[i,j],'*X',j+1,' '); if j=(n-1) then write('='); Array_Matrix_Reserve[i,j]:=Array_Matrix[i,j]; end; writeln(); end; {Замена местами строк матрицы для удовлетворения ею условия сходимости, проверка на достаточное условие сходимости} i:=0; RestartCheck := false; while i<(n-1) do begin if RestartCheck then i:=0; RestartCheck := false; if ReplaceArray[i]<>1 then begin MaxItem := Array_Matrix[i,0]; MaxItemIndex := 0; SummOfRow := 0; for j:=1 to n-1 do begin if Array_Matrix[i,j]>MaxItem then begin MaxItem := Array_Matrix[i,j]; MaxItemIndex :=j; end; end; for j:=0 to n-1 do if j<>MaxItemIndex then SummOfRow := SummOfRow + abs(Array_Matrix[i,j]); if (MaxItem>=SummOfRow) and (ReplaceArray[MaxItemIndex]<>1) then begin for j:=0 to n do begin ReplaceVar := Array_Matrix[i,j]; Array_Matrix[i,j] := Array_Matrix[MaxItemIndex,j]; Array_Matrix[MaxItemIndex,j] := ReplaceVar; end; RestartCheck := true; ReplaceArray[MaxItemIndex]:=1; end else if OutLine=false then begin writeln('СЛАУ неудовлетворяет достаточному условию сходимости'); writeln(); OutLine := true; end end; inc (i); end; {Вывод на консоль измененной СЛАУ} if OutLine = false then begin writeln('Измененная СЛАУ'); writeln(); for i:=0 to n-1 do begin for j:=0 to n do begin if j=n then begin write(' ',Array_Matrix[i,j],' '); end else write(Array_Matrix[i,j],'*X',j+1,' '); if j=(n-1) then write('='); Array_Matrix_Reserve[i,j]:=Array_Matrix[i,j]; end; writeln(); end; end; {Алгоритм метода} repeat begin for i:=0 to n-1 do begin SummOfRow := 0; for j:=0 to n-1 do if(j<>i) then SummOfRow :=SummOfRow+Array_Matrix[i,j]*X_Array[j]; X_Array_Reserve[i] := X_Array[i]; X_Array[i] := (Array_Matrix[i,n]-SummOfRow)/Array_Matrix[i,i]; end; Max_X_Difference:=abs(X_Array[0]-X_Array_Reserve[0]); for i:=0 to n-1 do if abs(X_Array[i]-X_Array_Reserve[i])>Max_X_Difference then Max_X_Difference := abs(X_Array[i]-X_Array_Reserve[i]); inc (EnumIter); end until((e>=Max_x_Difference) and (EnumIter>10000) ); {Вывод результата} if EnumIter = 10000 then begin writeln('Метод расходится'); end else begin writeln('Результат: '); for i:=0 to n-1 do begin writeln('X',(i + 1),': ', X_Array[i]); end; end; end.