|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
11.12.2011, 17:22 | #1 |
Пользователь
Регистрация: 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; Последний раз редактировалось adm2010; 11.12.2011 в 20:20. |
11.12.2011, 20:21 | #2 |
Пользователь
Регистрация: 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. |
11.12.2011, 20:30 | #3 |
Старожил
Регистрация: 30.12.2009
Сообщений: 11,426
|
Круто. Но я не мазохист, чтобы разгребать ваше не отфарматированный комментариями код. Хотя бы вычисления.
Или формула, по которой все это делается. И да, оформите код как положено. Чтобы там можно было отличать код от всего остального. Для этго есть тег CODE. |
11.12.2011, 22:04 | #4 |
Форумчанин
Регистрация: 26.07.2009
Сообщений: 489
|
Может воспользоваться стандартным компонентом TChart?
Если в глубине души вы программист, то, следуя своим наклонностям, вы захотите написать кусок кода.
|
11.12.2011, 22:42 | #5 |
Пользователь
Регистрация: 30.11.2010
Сообщений: 20
|
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Подвисает программа на 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 |