Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Точки на графике  (Прочитано 4605 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Стася
Постоялец

ru
Offline Offline

« : 23-03-2009 18:37 » 

Точки на графике строятся, но они слишком далеко от основной линии. А еще не строятся графики для разных степеней полинома.

Код:
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.
Записан
Igel
Опытный

ru
Offline Offline
Пол: Мужской

« Ответ #1 : 01-06-2009 07:07 » 

Тут меня в связи с ленью посетила идея:
1. Расчитываешь реальные значения. Сохраняешь их в текстовый файл.
2. Выводишь в Excel и строишь график.
Это т.с. для наглядности результата.
3. Начинаешь заточку программы под график. Все равно тебе нужно учитывать пропорции окна, масштаб отражения результата.
А так, можно кстати сразу в Excel вывести, все зависит от постановки вопроса.
Записан

Ёжики, это не только ценные шкурки...
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines