Точки на графике строятся, но они слишком далеко от основной линии. А еще не строятся графики для разных степеней полинома.
unit Unit11;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Grids, matrfunctions, Math, TeEngine, Series, ExtCtrls,
TeeProcs, Chart, BubbleCh;
type
TForm11 = class(TForm)
Edit1: TEdit;
Label1: TLabel;
StringGrid1: TStringGrid;
Button1: TButton;
StringGrid2: TStringGrid;
Button2: TButton;
Edit2: TEdit;
Button3: TButton;
Label2: TLabel;
Button4: TButton;
Chart1: TChart;
Series1: TLineSeries;
Edit3: TEdit;
Label3: TLabel;
Edit4: TEdit;
Label4: TLabel;
Button5: TButton;
Series2: TLineSeries;
procedure Button5Click(Sender: TObject);
procedure Button4Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form11: TForm11;
xydata:array of array of real;
m,n:word;
MatX:matrix;
VecA:matrix;
VecY:matrix;
implementation
{$R *.dfm}
procedure GetArray;
Var i:word;
n:integer;
begin
n:=strtoint(form11.Edit1.text);
Setlength(xydata,n,2);
for i:=1 to n do
begin
xydata[i-1,0]:=strtofloat(form11.Stringgrid1.Cells[0,i]);
xydata[i-1,1]:=strtofloat(form11.Stringgrid1.cells[1,i]);
end;
end;
procedure TForm11.Button1Click(Sender: TObject);
Var n:integer;
begin
n:=strtoint(Edit1.Text);
Stringgrid1.ColCount:=2;
Stringgrid1.RowCount:=n+1;
Stringgrid1.FixedCols:=0;
Stringgrid1.Cells[0,0]:='x';
Stringgrid1.Cells[1,0]:='y';
end;
procedure TForm11.FormClose(Sender: TObject; var Action: TCloseAction);
Var tf:textfile;
n:integer;
i:word;
begin
n:=strtoint(edit1.Text);
Assignfile(tf,'data.txt');
Rewrite(tf);
Writeln(tf,n);
for i:=1 to n do
begin
Writeln(tf,Stringgrid1.Cells[0,i]);
Writeln(tf,Stringgrid1.Cells[1,i]);
end;
Closefile(tf);
end;
procedure TForm11.FormCreate(Sender: TObject);
Var tf:textfile;
i:word;
s:string;
n:integer;
begin
Assignfile(tf,'data.txt');
Reset(tf);
Readln(tf,n);
Edit1.Text:=inttostr(n);
Stringgrid1.ColCount:=n+1;
Stringgrid1.Rowcount:=n+2;
For i:=1 to n do
begin
Readln(tf,s);
Stringgrid1.Cells[0,i]:=s;
Readln(tf,s);
Stringgrid1.Cells[1,i]:=s;
end;
closefile(tf);
end;
procedure TForm11.Button2Click(Sender: TObject);
Var i,j,k:word;
begin
GetArray;
m:=strtoint(Edit2.Text);
n:=strtoint(Edit1.Text);
Setlength(MatX,n,m+1);
for i := 0 to n- 1 do
begin
MatX[i,0]:=1;
for j := 1 to m do
MatX[i,j]:=power(xydata[i,0],j);
end;
Setlength(VecA,m+1,1);
Setlength(VecY,n,1);
for i := 0 to n-1 do
VecY[i,0]:=xydata[i,1];
VecA:=MMultaplication(MMultaplication(MInversion(MMultaplication(MTranspose(MatX),MatX)),MTranspose(MatX)),VecY);
for k := 0 to m do
begin
Stringgrid2.Cells[k,1]:=floattostr(VecA[k,0]);
end;
end;
procedure TForm11.Button3Click(Sender: TObject);
Var i,j:word;
begin
m:=strtoint(Edit2.Text);
for i := 0 to m do
Stringgrid2.Cells[i,0]:='a'+inttostr(i);
Stringgrid2.FixedCols:=0;
Stringgrid2.RowCount:=2;
end;
function GetYkr(x:real):real;
Var i:byte;
s:real;
begin
s:=VecA[0,0];
for i := 0 to m do
s:=s+(VecA[i,0]*power(x,i));
result:=s;
end;
function GetR:real;
Var i:word;
sum:real;
begin
for i := 1 to n-1 do
sum:=sum+sqr(GetYkr(xydata[i,0])-xydata[i,1]);
result:=sum;
end;
procedure TForm11.Button4Click(Sender: TObject);
Var i:word;
a,b,k:real;
begin
Chart1.SeriesList[0].Clear;
a:=strtofloat(Edit3.Text);
b:=strtofloat(Edit4.Text);
k:=(b-a)/1000;
repeat
Chart1.Series[0].AddXY(a,GetYkr(a),'',clblue);
a:=a+k;
until a>b;
for i := 0 to n-1 do
Chart1.Series[1].AddXY(xydata[i,0],xydata[i,1],'',clgreen);
end;
procedure TForm11.Button5Click(Sender: TObject);
Var i,j:byte;
a,b,k:real;
begin
for i := 1 to n do
Chart1.Series[0].Clear;
m:=strtoint(Edit2.Text);
for i := 0 to m do
begin
Edit2.Text:=InttoStr(i);
Button2Click(Sender);
Button4Click(Sender);
end;
end;
end.
И еще код отдельно созданной библиотеки для этой проги
unit matrfunctions;
interface
type matrix=array of array of real;
vector=array of real;
function MMultaplication(m1,m2:matrix):matrix;
function MTranspose(m:matrix):matrix;
function MInversion(m:matrix):matrix;
implementation
function MMultaplication;
var
i,j,k:word;
nr1,nc1,nr2,nc2:word;
s:real;
begin
nc1:=length(m1[0]);
nr1:=length(m1);
nc2:=length(m2[0]);
nr2:=length(m2);
if nc1=nr2 then
begin
setlength(result,nr1,nc2);
for i:=0 to nr1-1 do
begin
for j:=0 to nc2-1 do
begin
s:=0;
for k:=0 to nc1-1 do
s:=s+m1[i,k]*m2[k,j];
result[i,j]:=s;
end;
end;
end
else
begin
setlength(result,1,1);
result[0,0]:=0;
end;
end;
function MTranspose;
var
i,j:word;
nr,nc:word;
begin
nc:=length(m[0]);
nr:=length(m);
setlength(result,nc,nr);
for i:=0 to nr-1 do
for j:=0 to nc-1 do
result[j,i]:=m[i,j];
end;
function MInversion;
Var i,j,k:word;
nr,nc:word;
MW:matrix;
de,ed:real;
Begin
nc:=Length(M[0]);
nr:=Length(M);
SetLength(MW,nr,nc+nc);
if nr<>nc then
begin
SetLength(Result,1,1);
Result[0,0]:=0;
exit;
end;
SetLength(Result,nr,nc);
for i:=0 to nr-1 do
begin
for j:=0 to nc-1 do
MW[i,j]:=M[i,j];
for j:=nc to nc+nc-1 do
if i=j-nc then
MW[i,j]:=1
else
MW[i,j]:=0;
end;
for i:=0 to nr-1 do
begin
de:=MW[i,i];
if de=0 then
begin
SetLength(Result,1,1);
Result[0,0]:=0;
exit;
end;
for j:=0 to nc+nc-1 do
MW[i,j]:=MW[i,j]/de;
for k:=0 to nr-1 do
begin
ed:= MW[k,i];
if k<>i then
for j:=0 to nc+nc-1 do
MW[k,j]:=MW[k,j]-MW[i,j]*ed;
end;
end;
for i:=0 to nr-1 do
for j:=0 to nc-1 do
Result[i,j]:=MW[i,nc+j];
end;
end.