СЛАУ по Гауссу, чтение массива из файла - Free Pascal
Формулировка задачи:
Помогите, пожалуйста, исправить. Выдаёт ошибку External:SIGFTP, никак не понимаю, что он просит и как исправить.
var
a: array[1..4, 1..4] of real;
b: array[1..4] of real;
arr: array [1..4, 1..5] of real;
x: array[1..5] of real;
n, i, j, k: integer; r, g: real;
f1,f2:text;
begin
assignfile(f1,'input.txt');
reset(f1);
assignfile(f2,'data.txt');
rewrite(f2);
n:=4;
i := 0;
while not Eof(f1) do begin
j := 0;
while not Eoln(f1) do begin
Read(f1, arr[i,j]);
Inc(j);
end;
ReadLn(f1);
Inc(i);
end;
{for i:=1 to n do begin
for j:=1 to n+1 do begin
A[i,j] :=arr[i,j+1] ;
B[i]:=arr[i,1];
end;end;
for i:=1 to n do
x[i]:=0;}
A[1,1]:=arr[1,2]; A[1, 2] := arr[1,3]; A[1, 3] := arr[1,4];A[1, 4] := arr[1,5];
A[2,1]:= arr[2,2]; A[2, 2] := arr[4,3]; A[2, 3] := arr[2,4];A[2, 4] := arr[2,5];
A[3,1]:= arr[3,2]; A[3, 2] := arr[4,3]; A[3, 3] := arr[3,4];A[3, 4] := arr[3,5];
A[4,1]:= arr[4,2]; A[4, 2] := arr[4,3]; A[4, 3] := arr[4,4];A[4, 4] := arr[4,5];
b[1] := arr[1,1]; b[2] := arr[2,1]; b[3] := arr[3,1];b[4] := arr[4,1];
{writeln('Матрица A: ');
for i := 1 to n do
begin
for j := 1 to n do
begin
write(a[i,j]:5:2);
a1[i,j]:=a[i,j];
end;
writeln;
end;
writeln;
Writeln('Матрица B: ');
for i:=1 to n do
writeln(b[i]);}
for k := 1 to n do { прямой ход Гаусса }
begin
for j := k + 1 to n do
begin
r := a[j, k] / a[k, k];
for i := k to n do
begin
a[j, i] := a[j, i] - r * a[k, i];
end;
b[j] := b[j] - r * b[k];
end;
end;
for k := n downto 1 do { обратный ход Гаусса }
begin
r := 0;
for j := k + 1 to n do
begin
g := a[k, j] * x[j];
r := r + g;
end;
if a[k,k]<>0 then
x[k] := (b[k]-r)/a[k,k]
//else writeln(f2,'0!');
end;
//writeln('Корни системы:');
for i := 1 to n do
write(f2,'w[', i, ']=', x[i]:0:2, ' ');
close(f1);close(f2);
end.Решение задачи: «СЛАУ по Гауссу, чтение массива из файла»
textual
Листинг программы
{.$define NoFile}
program SLAU;
type
TMatrix = array[1..4, 1..4] of real;
TArray = array[1..4] of real;
var
{$ifdef NoFile}
a: TMatrix = ((1, 1, 1, 1), (4, 3, 2, 1), (4, 1, 1, 4), (4, 1, 4, 1));
b: TArray = (25, 20, 25, 22);
n: integer = 4;
{$else}
a: TMatrix;
b: TArray;
n: integer;
{$endif}
x: TArray;
i, j, k: integer;
r, g: real;
f1, f2: Text;
begin
{$ifndef NoFile}
Assign(f1, 'input.txt');
reset(f1);
readln(f1, n);
for i := 1 to n do
begin
for j := 1 to n do
Read(f1, a[i, j]);
readln(f1, b[i]);
end;
Close(f1);
{$endif}
Assign(f2, 'data.txt');
rewrite(f2);
for i := 1 to n do
begin
for j := 1 to n do
Write(f2, a[i, j]: 0: 2, ' ');
writeln(f2, b[i]: 0: 2);
end;
for k := 1 to n do { прямой ход Гаусса }
begin
for j := k + 1 to n do
begin
r := a[j, k] / a[k, k];
for i := k to n do
begin
a[j, i] := a[j, i] - r * a[k, i];
end;
b[j] := b[j] - r * b[k];
end;
end;
for k := n downto 1 do { обратный ход Гаусса }
begin
r := 0;
for j := k + 1 to n do
begin
g := a[k, j] * x[j];
r := r + g;
end;
x[k] := (b[k] - r) / a[k, k];
end;
for i := 1 to n do
Write(f2, x[i]: 0: 2, ' ');
readln;
//write(f2,'w[', i, ']=', x[i]:0:2, ' ');
Close(f2);
end.
Объяснение кода листинга программы
В этом коде реализован метод СЛАУ (системы линейных алгебраических уравнений) по Гауссу для решения системы уравнений. Список действий:
- Объявление переменных и типов данных.
- Инициализация матрицы a и вектора b для примера (если файл с данными не используется).
- Открытие файла с данными для чтения (если файл с данными используется).
- Чтение данных из файла в матрицу a и вектор b.
- Закрытие файла с данными.
- Открытие файла для записи результатов.
- Запись начальных значений матрицы a и вектора b в файл для последующего использования (прямой ход Гаусса).
- Выполнение прямого хода Гаусса.
- Выполнение обратного хода Гаусса.
- Запись решения в файл.
- Закрытие файла.
- Ввод данных для проверки результата (не используется в данном примере).
В данном коде используются следующие переменные:
- a: матрица размером 4x4 для хранения коэффициентов системы уравнений.
- b: вектор размером 4x1 для хранения свободных членов системы уравнений.
- n: размерность системы уравнений (в данном случае 4).
- x: вектор размером 4x1 для хранения неизвестных значений системы уравнений.
- i, j, k: целочисленные переменные для обозначения строк, столбцов и номеров уравнений.
- r, g: переменные для хранения промежуточных значений при выполнении прямого и обратного ходов Гаусса.
- f1, f2: файлы для чтения и записи данных. Код выполняет следующие действия:
- Считывает размеры системы уравнений из файла input.txt.
- Считывает коэффициенты системы уравнений и свободные члены из файла input.txt и записывает их в матрицу a и вектор b соответственно.
- Записывает начальные значения матрицы a и вектора b в файл data.txt.
- Выполняет прямой ход Гаусса, используя вложенные циклы для вычисления значений в столбцах.
- Выполняет обратный ход Гаусса, используя вложенные циклы для вычисления значений в строках.
- Записывает решение системы уравнений в файл data.txt.
- Ввод данных для проверки результата (не используется в данном примере).