Поскольку с решением СЛАУ при написании программ сталкиваешься довольно часто, надо бы обсудить этот вопрос. Особенно интересует решение СЛАУ высокого порядка, в т.ч. плохообусловленной. Сам обычно решаю методом Гаусса.
Вот фрагмент программы, написанной в прошлом году: procedure TForm1.Button1Click(Sender: TObject);
var
System, Result: TStringList;
i, j, s, n, p: integer;
x: array[1..2000] of real; // решение системы
summa, k: real;
begin
System:=TStringList.Create; Result:=TStringList.Create;
System.LoadFromFile('input.txt');
// размерность матрицы
n:=StrtoInt(System.Strings[0]);
Gauge1.MaxValue:=(n-1)*2;
// прямой ход
for s:=1 to n-1 do
begin
Gauge1.Progress:=s;
for i:=s+1 to n do
begin
if StrtoCh(System.Strings[i],s)<>0 then begin
k:=StrtoCh(System.Strings[s],s)/StrtoCh(System.Strings[i],s);
for j:=s to n+1 do
System.Strings[i]:=ChIntoStr(System.Strings[i],StrtoCh(System.Strings[i],j)*k-StrtoCh(System.Strings[s],j),j);
end;
end;
end;
System.SaveToFile('treug_matr.txt');
x[n]:=StrtoCh(System.Strings[n],n+1)/StrtoCh(System.Strings[n],n);
p:=0;
// обратный ход
for s:=n-1 downto 1 do
begin
p:=p+1;
Gauge1.Progress:=Gauge1.Progress+p;
summa:=0;
for j:=s+1 to n do
summa:=summa+StrtoCh(System.Strings[s],j)*x[j];
if StrtoCh(System.Strings[s],s)<>0 then
x[s]:=(StrtoCh(System.Strings[s],n+1)-summa)/StrtoCh(System.Strings[s],s) else x[s]:=0;
end;
for i:=1 to n do
Result.Add(FloattoStr(x[i]));
Result.SaveToFile('output.txt');
end;
Поскольку программа неприменима для решения СЛАУ высокого порядка из-за слишком большого времени счета, закончена она так и не была, однако, все работает.
Саму программу можно скачать по ссылке Гаусс.rar
Функции StrtoCh и ChIntoStr осуществляют выделение и вставку числа из строк списка, в который загружаются данные из файла с исходной матрицей, правой частью и размерностью или из которого происходит сохранение результатов в файл соответственно.