17.07.2011, 13:55
|
Прохожий
|
|
Регистрация: 17.07.2011
Сообщения: 10
Репутация: 10
|
|
Нарисовать линию по коэффициентам
Доброго времени суток, уважаемые программисты!
Такая проблема - не могу найти в делфи функцию, которая бы рисовала прямую по коэффициентам. У меня задача состоит в построении прямой по методу наименьших квадратов. Все работает, кроем построения самой прямой(( Подскажите как решить....
Вот код
Код:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Series, TeEngine, TeeProcs, Chart, ExtCtrls, StdCtrls, Math;
type
TForm1 = class(TForm)
Panel1: TPanel;
Chart1: TChart;
Series1: TPointSeries;
Series2: TLineSeries;
LabeledEdit1: TLabeledEdit;
Button1: TButton;
Label1: TLabel;
Button2: TButton;
Button3: TButton;
Button4: TButton;
OpenDialog1: TOpenDialog;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure Button4Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
var D: array of real;
ReadOk: boolean;
ff: textfile;
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
if Form1.OpenDialog1.Execute then
Form1.LabeledEdit1.Text := Form1.OpenDialog1.FileName;
end;
procedure TForm1.Button2Click(Sender: TObject);
var
i, n: LongWord;
a,b,sx,sxx,sxy: real;
begin
ReadOk := true;
SetLength(D, 0);
Try
AssignFile(ff, Form1.LabeledEdit1.Text);
Reset(ff);
Try
while not(EOF(ff)) do
begin
SetLength(D, Length(D)+1);
readln(ff, D[Length(D)-1]);
end;
finally
CloseFile(ff);
end;
except
ReadOk := false;
end;
if ReadOk then
begin
sx := 0;
sxx := 0;
sxy := 0;
n := Length(D);
for i := 1 to n do
begin
sx := sx + D[i];
sxx := sxx + D[i]*D[i];
sxy := sxy + D[i]*i;
end;
a := (sxy - 1)/(sxx - sx*sx/n);
b := 1 - sx/n*a;
Form1.Label1.Caption := 'y = '+floattostr(RoundTo(a,-2))+' x + '+floattostr(RoundTo(b,-2));
end
else
Form1.Label1.Caption := 'Ошибка загрузки данных';
end;
procedure TForm1.Button3Click(Sender: TObject);
var
i, n: LongWord;
begin
n := Length(D);
for i:=0 to (n div 2) - 1 do begin
Form1.Chart1.Series[0].AddXY(D[i*2],D[i*2+1]);
end;
end;
procedure TForm1.Button4Click(Sender: TObject); //это пробный вариант, ну и похоже бредовый
var
a,b : Real;
m : Integer;
begin
for m:= -20 to 20 do
begin
Chart1.Series[2].AddXY(m,m*a+b);
end;
end;
end.
|