Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 11.12.2011, 17:22   #1
adm2010
Пользователь
 
Регистрация: 30.11.2010
Сообщений: 20
Печаль Не строит график

не хочет строить график, подскажите пожалуйста где ошибка
тема лабы: приближение функции,аппроксимация,метод наименьших квадратов
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Buttons, Grids, ExtCtrls, XPMan, jpeg;

type
TForm1 = class(TForm)
strngrd1: TStringGrid;
lbl2: TLabel;
lbl3: TLabel;
lbl4: TLabel;
lbl5: TLabel;
lbl6: TLabel;
lbl7: TLabel;
lbl8: TLabel;
lbl9: TLabel;
lbl10: TLabel;
lbl11: TLabel;
lbl12: TLabel;
lbl13: TLabel;
Button1: TButton;
Button2: TButton;
Button3: TButton;
Button4: TButton;
pb1: TPaintBox;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure Button4Click(Sender: TObject);

private
{ Private declarations }
public
{ Public declarations }
end;

const n=10;
a=0;
b=3.14;

var Form1: TForm1;
p,y,x: array[1..n] of extended;
a1,a2,b1,b2,SX,SY,SXX,SXY,LSY,LSYX, h:extended;

implementation

uses Unit2;
{$R *.dfm}

Function f(x:Extended):Extended;
begin
f:=1/2*(sin(x)*sin(x))+(cos(x/2)*cos(x/2)*cos(x/2));
end;
Function f1(x:Extended):Extended;
begin
f1:=a1*exp(b1*x);
end;

Function f2(x:Extended):Extended;
begin
f2:=a2*x+b2;
end;
procedure TForm1.Button1Click(Sender: TObject);
var i: integer;
begin
h:=(b-a)/n;
for i:=0 to n do
begin
x[i]:=a+i*h;
y[i]:=f(x[i]);
strngrd1.cells[i,0]:=floattostr(x[i]);
strngrd1.Cells[i,1]:=FloatToStrf(y[i],ffgeneral,5,1);
end;
end;

procedure TForm1.Button2Click(Sender: TObject);
var i: integer;
begin
h:=(b-a)/n;
SX:=0;
SY:=0;
SXX:=0;
SXY:=0;
LSY:=0;
LSYX:=0;
for i:=0 to n do
begin
x[i]:=a+i*h;
y[i]:=f(x[i]);
SX:=SX+x[i];
SY:=SY+y[i];
SXX:=SXX+x[i]*x[i];
SXY:=SXY+x[i]*y[i];
LSY:=LSY+ln(y[i]);
LSYX:=LSYX+ln(y[i])*x[i];
end;
{a1:=exp((LSY*SXX-SX*LSYX)/((n+1)*SXX-(n+1)*SX*SX));
b1:=(((n+1)*LSYX-(n+1)*SX*LSY)/((n+1)*SXX-(n+1)*SX*SX)); }
b1:=((n+1)*LSYX-SX*LSY)/((n+1)*SXX-SX*SX);
a1:=exp((LSY-b1*SX)/(n+1));
a2:=((n+1)*SXY-SX*SY)/((n+1)*SXX-SX*SX);
b2:=(SY-a2*SX)/(n+1);
lbl8.Visible:=True;
lbl9.Visible:=True;
lbl10.Visible:=True;
lbl11.Visible:=True;
lbl8.Caption:='a='+FloatToStrf(a1,f fgeneral,5,2);
lbl9.Caption:='b='+FloatToStrf(b1,f fgeneral,5,2);
lbl10.Caption:='a='+FloatToStrf(a2, ffgeneral,5,2);
lbl11.Caption:='b='+FloatToStrf(b2, ffgeneral,5,2);
end;

procedure TForm1.Button3Click(Sender: TObject);
var S1,Q1,S2,Q2:extended;
i:integer;
begin
h:=(b-a)/n;

for i:=0 to n do
begin
x[i]:=a+i*h;
strngrd1.Cells[i,2]:=FloatToStrf(a1*exp(b1*x[i]),ffgeneral,5,2);
end;
for i:=0 to n do
strngrd1.Cells[i,3]:=FloatToStrf((a2*x[i])+b2,ffgeneral,5,2);
S1:=0;
for i:=0 to n do
S1:=S1+sqr(Strtofloat(strngrd1.Cell s[i,2])-Strtofloat(strngrd1.Cells[i,1]));
Q1:=sqrt(S1/n+1);
lbl12.Visible:=True;
lbl12.Caption:='среднеквадр.отклоне ние '+FloatToStrf(Q1,ffgeneral,5,2);
S2:=0;
for i:=0 to n do
S2:=S2+sqr(Strtofloat(strngrd1.Cell s[i,3])-Strtofloat(strngrd1.Cells[i,1]));
Q2:=sqrt(S2/n+1);
lbl13.Visible:=True;
lbl13.Caption:='среднеквадр.отклоне ние '+FloatToStrf(Q2,ffgeneral,5,2);
end;
Вложения
Тип файла: rar 444.rar (13.6 Кб, 8 просмотров)

Последний раз редактировалось adm2010; 11.12.2011 в 20:20.
adm2010 вне форума Ответить с цитированием
Старый 11.12.2011, 20:21   #2
adm2010
Пользователь
 
Регистрация: 30.11.2010
Сообщений: 20
По умолчанию

// строит график функции
procedure GrOfFunc;
var
x1,x2:extended; // границы изменения аргумента функции
y1,y2:extended; // границы изменения значения функции
x:extended; // аргумент функции
y:extended; // значение функции в точке x
dx:extended; // приращение аргумента
l,bb:integer; // левый нижний угол области вывода графика
w,h,i:integer; // ширина и высота области вывода графика
mx,my:extended; // масштаб по осям X и Y
x0,y0:integer; // точка - начало координат


begin
// область вывода графика
l:=10; // X - координата левого верхнего угла
bb:=Form1.pb1.ClientHeight-20; // Y - координата левого нижнего угла
h:=Form1.pb1.ClientHeight-20; // высота
w:=Form1.pb1.ClientWidth-20; // ширина

x1:=0; // нижняя граница диапазона аргумента
x2:=3.14; // верхняя граница диапазона аргумента
dx:=0.0001; // шаг аргумента

// найдем максимальное и минимальное значения
// функции на отрезке [x1,x2]
y1:=f(x1); // минимум
y2:=f(x1); // максимум
x:=x1;
repeat
y := f(x);
if y < y1 then y1:=y;
if y > y2 then y2:=y;
x:=x+dx;
until (x>=x2+0.5);

// вычислим масштаб
my:=0.1*h/abs(y2-y1); // масштаб по оси Y
mx:=0.1*w/abs(x2-x1); // масштаб по оси X

// оси
x0:=l+Abs(Round(x1*3*my));
y0:=bb-Abs(Round(y1*my));

with Form1.pb1.Canvas do
begin
MoveTo(x0,bb);LineTo(x0,bb-h); //вертикальная ось
MoveTo(x0,y0);LineTo(w,y0);//горизонтальная ось
MoveTo(x0,y0);LineTo(l,y0);
Pen.Style:=psDot; //пунктирная линия

MoveTo(x0+Round(3*my*x2),bb);LineTo (x0+Round(3*my*x2),bb-h);
Pen.Style:=psSolid;
TextOut(x0,y0+2,'0');
TextOut(x0+Round(3*my),y0+2,'1');
Pixels[x0+Round(3*my),y0-1]:=clBlack;
Pixels[x0+Round(3*my),y0+1]:=clBlack;
for i:=1 to 6 do
begin
TextOut(x0+2,y0-i*Round(my),FloatToStr(i));
Pixels[x0+1,y0-i*Round(my)]:=clBlack;
Pixels[x0-1,y0-i*Round(my)]:=clBlack;
end;

TextOut(x0+Round(2*3*my),y0+2,'2');
Pixels[x0+Round(2*3*my),y0-1]:=clBlack;
Pixels[x0+Round(2*3*my),y0+1]:=clBlack;
TextOut(x0+Round(3*3*my),y0+2,'3');
Pixels[x0+Round(3*3*my),y0-1]:=clBlack;
Pixels[x0+Round(3*3*my),y0+1]:=clBlack;

Pixels[x0+Round(3*my*x1),y0-1]:=clBlack;
Pixels[x0+Round(3*my*x1),y0+1]:=clBlack;
TextOut(x0+Round(3*my*x2),y0-17,'3.14');
Pixels[x0+Round(3*my*x2),y0-1]:=clBlack;
Pixels[x0+Round(3*my*x2),y0+1]:=clBlack;
TextOut(x0+Round(3*my*x2)+5,y0-350,'F(x)-красный');
TextOut(x0+Round(3*my*x2)+5,y0-310,'Fi2(x)-черный');
TextOut(x0+Round(3*my*x2)+5,y0-330,'Fi1(x)-желтый');
// TextOut(x0+3,b-h,FloatToStrF(y2,ffGeneral,3,3));
TextOut(w,y0+2,'x');
TextOut(x0-3,bb-h,'y');
// построение графика
x:=x1;
repeat
y:=f(x);
Pixels[x0+Round(3*x*my),y0-Round(y*mx)]:=clred;
x:=x+dx;
until (x>=x2);
//построение графика
x:=x1;
repeat
y:=f1(x);
Pixels[x0+Round(3*x*my),y0-Round(y*mx)]:=clyellow;
x:=x+dx;
until (x>=x2);
//построение графика
x:=x1;
repeat
y:=f2(x);
Pixels[x0+Round(3*x*my),y0-Round(y*mx)]:=clBlack;
x:=x+dx;
until (x>=x2);
end;
end;

procedure TForm1.Button4Click(Sender: TObject);
begin
GrOfFunc;
//Form2.Show;
end;

end.
adm2010 вне форума Ответить с цитированием
Старый 11.12.2011, 20:30   #3
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Круто. Но я не мазохист, чтобы разгребать ваше не отфарматированный комментариями код. Хотя бы вычисления.
Или формула, по которой все это делается.

И да, оформите код как положено. Чтобы там можно было отличать код от всего остального. Для этго есть тег CODE.
Человек_Борща вне форума Ответить с цитированием
Старый 11.12.2011, 22:04   #4
chertovich
Форумчанин
 
Аватар для chertovich
 
Регистрация: 26.07.2009
Сообщений: 489
По умолчанию

Может воспользоваться стандартным компонентом TChart?
Если в глубине души вы программист, то, следуя своим наклонностям, вы захотите написать кусок кода.
chertovich вне форума Ответить с цитированием
Старый 11.12.2011, 22:42   #5
adm2010
Пользователь
 
Регистрация: 30.11.2010
Сообщений: 20
По умолчанию

Цитата:
Сообщение от chertovich Посмотреть сообщение
Может воспользоваться стандартным компонентом TChart?
я бы с радостью но мне нужно сдавать именно в такой форме
adm2010 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Подвисает программа на Delphi, которая считывает данные с COM-порта(весы), строит график SonicBob Помощь студентам 19 07.09.2011 03:08
Разработать программу, которая строит график Функция y =Cos x. bajge Общие вопросы Delphi 2 16.06.2011 18:55
Не правильно строит график Санек1а Паскаль, Turbo Pascal, PascalABC.NET 4 13.12.2010 02:30
Delphi, почему не строит график? xMass Помощь студентам 10 30.03.2009 20:32
Программа строит неправильный график xMass Помощь студентам 7 06.06.2008 19:04