else
begin
for i:=1 to dl do
begin
if prover[i]>'9' then
begin
showmessage('Введитечисло');
break;
end
else if i=dl then s:=trunc(strtofloat(inputbox('Введитеразмерсистемы','Значениемежду 2 и 20','2')));
end;
end;
end;
until (s>=2) and (s<=maxr);
form1.Enabled:=true;
matrix.RowCount:=s+1;
matrix.ColCount:=s+1;
gauss.colCount:=s+1;
coef.rowCount:=s+1;
jgauss.colCount:=s+1;
coef.Cells[1,0]:='B';
gauss.Cells[0,1]:='Gauss';
jgauss.Cells[0,1]:='J-Gauss';
for i:=1 to s do
begin
matrix.Cells[0,i]:=floattostr(i);
matrix.Cells[i,0]:='A'+floattostr(i);
coef.Cells[0,i]:=floattostr(i);
gauss.Cells[i,0]:='X'+floattostr(i);
jgauss.Cells[i,0]:='X'+floattostr(i);
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
var a:ary2s;
x,y:arys;
error:boolean;
i,j,l,K:integer;
prover:string;
begin
{Считывание массивов с исходными данными и проверка '.' или ','}
{***********************************************}
for i:=1 to s do
for j:=1 to s do
begin
prover:=matrix.Cells[j,i];
k:=length(prover);
if k=0 then
begin
showmessage('Вы не ввели один или несколько элементов системы.');
exit;
end;
for l:=1 to length(prover) do
if prover[l]='.' then prover[l]:=','
else if prover[l]>'9' then
begin
showmessage('В качестве одного или нескольких элементов системы введена буква. Заменитеихначисла!');
exit;
end;
matrix.Cells[j,i]:=prover;
a[i,j]:=strtofloat(matrix.cells[j,i]);
end;
for i:=1 to s do
begin
prover:=coef.cells[1,i];
for l:=1 to length(prover) do
if prover[l]='.' then prover[l]:=','
else if prover[l]>'9' then
begin
showmessage('В качестве одного или нескольких элементов системы введена буква. Заменитеихначисла!');
exit;
end;
coef.cells[1,i]:=prover;
y[i]:=strtofloat(coef.cells[1,i]);
end;
{***********************************************}
{Решение и вывод результатов}
{***********************************************}
gauss1(a,y,x,s,error);
if not error then
for i:=1 to s do
gauss.cells[i,1]:=floattostr(x[i])
else
begin
showmessage('Система решения не имеет');
new1.Click;
end;
{***********************************************}
end;
procedure TForm1.Button2Click(Sender: TObject);
var a:ary2s;
x,y:arys;
error:boolean;
i,j,l,k:integer;
prover:string;
begin
{Считывание массивов с исходными данными}
{***********************************************}
{Считывание массивов с исходными данными и проверка '.' или ','}
{***********************************************}
for i:=1 to s do
for j:=1 to s do
begin
prover:=matrix.Cells[j,i];
k:=length(prover);
if k=0 then
begin
showmessage('Вы не ввели один или несколько элементов системы.');
exit;
end;
for l:=1 to length(prover) do
if prover[l]='.' then prover[l]:=','
else if prover[l]>'9' then
begin
showmessage('В качестве одного или нескольких элементов системы введена буква. Заменитеихначисла!');
exit;
end;
matrix.Cells[j,i]:=prover;
a[i,j]:=strtofloat(matrix.cells[j,i]);
end;
for i:=1 to s do
begin
prover:=coef.cells[1,i];
for l:=1 to length(prover) do
if prover[l]='.' then prover[l]:=','
else if prover[l]>'9' then
begin
showmessage('В качестве одного или нескольких элементов системы введена буква. Заменитеихначисла!');
exit;
end;
coef.cells[1,i]:=prover;
y[i]:=strtofloat(coef.cells[1,i]);
end;
{***********************************************}
{***********************************************}
{Решение и вывод результатов}
{***********************************************}
gaussj(a,y,x,s,error);
if not error then
for i:=1 to s do
jgauss.cells[i,1]:=floattostr(x[i])
else
begin
showmessage('Система решения не имеет');
new1.Click;
end;
{***********************************************}
end;
procedure TForm1.Save1Click(Sender: TObject);
var f:textfile;
i,j:integer;
begin
savedialog1.Filter:='Text files (*.txt)|*.txt|';
if savedialog1.Execute then
begin
assignfile(f,savedialog1.filename+'.txt');
rewrite(f);
for i:=1 to s do
begin
writeln(f);
for j:=1 to s do
write(f,matrix.cells[i,j]:4,' ');
write(f,'|',coef.cells[1,i]);
end;
writeln(f);
writeln(f);
writeln(f,'Gauss');
for i:=1 to s do
writeln(f,'X'+floattostr(i)+'='+gauss.cells[i,1],' ');
writeln(f);
writeln(f,'J-Gauss');
for i:=1 to s do
writeln(f,'X'+floattostr(i)+'='+jgauss.cells[i,1],' ');
closefile(f);
end;
end;
end.
unit unit2;
interface
const maxr=20;
type arys=array[1..maxr] of real;
ary2s=array[1..maxr,1..maxr] of real;
procedure gauss1(a:ary2s; y:arys; var coef:arys; ncol:integer; var error:boolean);
procedure gaussj(var b:ary2s; y: arys; var coef:arys; ncol:integer; var error: boolean);
implementation
{Решение системы линейных уравнений методом Гаусса}
{**********************************************************}
procedure gauss1(a:ary2s; y:arys; var coef:arys; ncol:integer; var error:boolean);
var b:ary2s;
w:arys;
i,j,i1,k,l,n:integer;
hold,sum,t,ab,big: real;
begin
error:=false;
n:=ncol;
for i:=1 to n do
begin
for j:=1 to n do
b[i,j]:=a[i,j];
w[i]:=y[i]
end;
for i:=1 to n-1 do
begin
big:=abs(b[i,i]);
l:=i;
i1:=i+1;
for j:=i1 to n do
begin
ab:=abs(b[j,i]);
if ab>big then
begin
big:=ab;
l:=j
end
end;
if big=0.0 then error:= true
else
begin
if l<>i then
begin
for j:=1 to n do
begin
hold:=b[l,j];
b[l,j]:=b[i,j];
b[i,j]:=hold
end;
hold:=w[l];
w[l]:=w[i];
w[i]:=hold
end;
for j:=i1 to n do
begin
t:=b[j,i]/b[i,i];
for k:=i1 to n do
b[j,k]:=b[j,k]-t*b[i,k];
w[j]:=w[j]-t*w[i]
end
end
end;
if b[n,n]=0.0 then error:=true
else
begin
coef[n]:=w[n]/b[n,n];
i:=n-1;
repeat
sum:=0.0;
for j:=i+1 to n do
sum:=sum+b[i,j]*coef[j];
coef[i]:=(w[i]-sum)/b[i,i];
i:=i-1
until i=0
end
end;
{**********************************************************}
{Решение системы линейных уравнений методом Жордана-Гаусса}
{**********************************************************}
procedure gaussj(var b:ary2s; y: arys; var coef:arys; ncol:integer; var error: boolean);
var w:array[1..maxr,1..maxr] of real;
index:array[1..maxr,1..3] of integer;
i,j,k,l,nv,irow,icol,n,l1:integer;
determ,pivot,hold,sum,t,ab,big:real;
{++++++++++++++++++++++++++++++++++++++++++++}
procedure swap(var a,b: real);
var hold:real;
begin
hold:=a;
a:=b;
b:=hold
end;
{++++++++++++++++++++++++++++++++++++++++++++}
{@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@}
procedure gausj2;
var i,j,k,l,l1:integer;
{===============================================}
procedure gausj3;
var l:integer;
begin
if irow<>icol then
begin
determ:=-determ;
for l:=1 to n do
swap(b[irow,l],b[icol,l]);
if nv>0 then
for l:=1 to nv do
swap(w[irow,l],w[icol,l])
end
end;
{===============================================}
begin
error:=false;
nv:=1;
n:=ncol;
for i:=1 to n do
begin
w[i,1]:=y[i];
index[i,3]:=0
end;
determ:=1.0;
for i:=1 to n do
begin
big:=0.0;
for j:=1 to n do
begin
if index[j,3]<>1 then
begin
for k:=1 to n do
begin
if index[k,3]>1 then
begin
error:=true;
exit;
end;
if index[k,3]<1 then
if abs(b[j,k])>big then
begin
irow:=j;
icol:=k;
big:=abs(b[j,k])
end
end
end
end;
index[icol,3]:=index[icol,3]+1;
index[i,1]:=irow;
index[i,2]:=icol;
gausj3;
pivot:=b[icol,icol];
determ:=determ*pivot;
b[icol,icol]:=1.0;
for l:=1 to n do
b[icol,l]:=b[icol,l]/pivot;
if nv>0 then
for l:=1 to nv do
w[icol,l]:=w[icol,l]/pivot;
for l1:=1 to n do
begin
if l1<>icol then
begin
t:=b[l1,icol];
b[l1,icol]:=0.0;
for l:=1 to n do
b[l1,l]:=b[l1,l]-b[icol,l]*t;
if nv>0 then
for l:=1 to nv do
w[l1,l]:=w[l1,l]-w[icol,l]*t;
end
end
end;
end;
{@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@}
begin
gausj2;
if error then exit;
for i:=1 to n do
begin
l:=n-i+1;
if index[l,1]<>index[l,2] then
begin
irow:=index[l,1];
icol:=index[l,2];
for k:=1 to n do
swap(b[k,irow],b[k,icol])
end
end;
for k:=1 to n do
if index[k,3]<>1 then
begin
error:=true;
exit;
end;
for i:=1 to n do
coef[i]:=w[i,1];
end;
{**********************************************************}
end.
program Project1;
uses
Forms,
Unit1 in 'Unit1.pas' {Form1},
Unit2 in 'Unit2.pas';
{$R *.res}
begin
Application.Initialize;
Application.Title := 'Gauss&J-Gauss';
Application.CreateForm(TForm1, Form1);
Application.Run;
end.
Результаты сохраненные в файле:
2 1 1 |2
3 2 3 |6
6 5 4 |5
Gauss
X1=-7,4
X2=1,2
X3=2,2
J-Gauss
X1=-7,4
X2=1,2
X3=2,2
1. Сразу после запуска файла программы (pragramma.exe) перед вами появиться окно с запросом размера системы. Введите нужный размер и нажмите «ОК»(поскольку система размера n на n нужно ввести только одно число).
2. После ввода размера перед вами появится рабочее окно программы. Введите в него данные по следующей схеме:
3. Для решения нужным методом нажмите соответствующую кнопку, и в таблице возле нее будут выведены корни системы.
4. Для сохранения результатов в меню «File» выберите «Save», перейдите в нужную папку и введите имя файла. Нажмите «ОК».
5. Для начала новых рассчетов «File» выберите «New», введите новый размер системы, нажмите «ОК».
6. Для выхода в меню «File» выберите пункт «Exit».
· Волков Е.А. численные методы: Учебное пособие для вузов. – 2-е изд., испр. – М.:Наука, 1987. – 248 с.
· Роганин А.М. Основные формулы высшей математики. – Х.:Торсинг, 2002
· Справочная система Borland Delphi 7.
· http://delphi.vitpc.com/
· http://www.fortunecity.com/campus/beverly/963/
· http://www.delphi.agava.ru/
· http://www.interface.ru/delphi/delphi_page.htm
· http://pog.da.ru/