unit Unit1; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Label1: TLabel; Label2: TLabel; Label3: TLabel; Label4: TLabel; Label5: TLabel; Label6: TLabel; Label7: TLabel; Label8: TLabel; Label9: TLabel; Edit1: TEdit; Edit2: TEdit; Edit3: TEdit; Edit4: TEdit; Edit5: TEdit; Edit6: TEdit; Button1: TButton; Edit11: TEdit; Edit12: TEdit; Label13: TLabel; Label14: TLabel; Label17: TLabel; Label10: TLabel; Edit7: TEdit; Label11: TLabel; Edit8: TEdit; Label12: TLabel; Label15: TLabel; Button2: TButton; procedure FormCreate(Sender: TObject); function a(h:real):real; function plotn(h:real):real; function g(h:real):real; function Cy0(m:real):real; function Cy1(m:real):real; function Cy(a,m:real):real; function Cx(a,m:real):real; function P(m,h:real):real; function Cp(m,h:real):real; function H_krit(V_poleta:real):real; function q(h,v:real):real; function X(h,v,m,a:real):real; function Y(h,v,a,m:real):real; procedure Button1Click(Sender: TObject); procedure AB(var teta:real;var alfa:real;var time:real;massa,delta_v,h,vtec:real); procedure AD(var teta:real;var alfa:real;var time:real;massa,delta_h,h,vtec:real); procedure AC(var teta:real;var alfa:real;var time:real;massa,delta_h,h,delta_v,vtec:real); procedure Button2Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.DFM} procedure TForm1.FormCreate(Sender: TObject); begin Label1.Caption:='Ведерников Андрей ИУ2-63'; Label2.Caption:='Данные для расчета'; end; function TForm1.a(h:real):real; {зависимость скорости звука от высоты} begin a:=-0.0039*h+340.36; end; function TForm1.plotn(h:real):real; {зависимость плотности воздуха от высоты} begin plotn:=(-9.95/100000)*h+1.21; end; function TForm1.g(h:real):real;{зависимость ускорения свободного падения от высоты} begin g:=(-3.09/1000000)*h+9.8066; end; function TForm1.Cy0(m:real):real; {зависимость Cy0 от числа маха} begin if m<0.4 then m:=0.4; Cy0:=-8.285+45.2816*m-80.1155*m*m+45.85*m*m*m; end; function TForm1.Cy1(m:real):real; {зависимость Cy1 от числа маха} begin if m<0.4 then m:=0.4; Cy1:=0.0578+0.0707*m; end; function TForm1.Cy(a,m:real):real; {зависимость коэффициента подъемной силы от угла атаки и маха} begin Cy:=Cy0(m)+Cy1(m)*a; end; function TForm1.Cx(a,m:real):real; {коэффициент лобового сопротивления от Cy и маха} begin if m<0.5 then m:=0.5; Cx:=(0.01242125+0.0129345*m)+(-0.00198054-0.0382072*m)*Cy(a,m)+(0.04658269+0.0781845*m)*Cy(a,m)*Cy(a,m); end; function TForm1.P(m,h:real):real;{тяга двигателя от числа Маха и высоты} begin P:=(9238.7-0.595*h)+(-4150.6+0.502*h)*m; end; function TForm1.Cp(m,h:real):real;{коэффициент расхода топлива от маха и высоты} begin Cp:=(0.5786473+0.0272825*h/1000-0.002107*h/1000*h/1000)+(0.53981-0.02855*h/1000)*m; end; function TForm1.H_krit(V_poleta:real):real; {ограничение полетной области} begin H_krit:=-0.17*V_poleta*V_poleta+255*V_poleta-92890; end; function TForm1.q(h,v:real):real;{скоростной напор от высоты и скорости} begin q:=plotn(h)*v*v/2; end; function TForm1.X(h,v,m,a:real):real; {сила лобового сопротивления} begin X:=q(h,v)*127*Cx(a,m); end; function TForm1.Y(h,v,a,m:real):real; {подъемная сила} begin Y:=q(h,v)*127*Cy(a,m); end; procedure TForm1.AB(var teta:real;var alfa:real;var time:real;massa,delta_v,h,vtec:real); {горизонтальное перемещение} var sopr, tjaga,napor:real; begin tjaga:=2*9.8*P(Vtec/a(h),h); teta:=0; alfa:=(massa*g(h)-q(h,Vtec)*127*Cy0(Vtec/a(h)))/(tjaga+57.3*q(h,Vtec)*127*Cy1(Vtec/a(h))); sopr:=X(h,vtec,Vtec/a(h),57.3*alfa); time:=massa*delta_v/(tjaga-sopr); end; procedure TForm1.AD(var teta:real;var alfa:real;var time:real;massa,delta_h,h,vtec:real); {вертикальное перемещение} var sopr,tjaga:real; begin tjaga:=2*9.8*P(Vtec/a(h),h); alfa:=(massa*g(h)-q(h,Vtec)*127*Cy0(Vtec/a(h)))/(tjaga+57.3*q(h,Vtec)*127*Cy1(Vtec/a(h))); sopr:=X(h,vtec,Vtec/a(h),57.3*alfa); teta:=(tjaga-sopr)/(massa*g(h)); time:=delta_h/(vtec*sin(teta)); end; procedure TForm1.AC(var teta:real;var alfa:real;var time:real;massa,delta_h,h,delta_v,vtec:real); {разгон-подъем} var tjaga, sopr:real; begin tjaga:=2*9.8*P(Vtec/a(h),h); alfa:=(massa*g(h)-q(h,Vtec)*127*Cy0(Vtec/a(h)))/(tjaga+57.3*q(h,Vtec)*127*Cy1(Vtec/a(h))); sopr:= X(h,vtec,Vtec/a(h),57.3*alfa); teta:=(tjaga-sopr)/(massa*delta_v/delta_h*vtec+massa*g(h)); time:=delta_h/(delta_v*teta)*ln((Vtec+delta_v/2)/(Vtec-delta_v/2)); end; procedure TForm1.Button1Click(Sender: TObject); type z=record time:real; naprav:integer;end; gk=record time:real; alfa1:real; teta1:real;end; const x0=300; y0=350; dx=25; dy=25; h=300; w=300; var H1,H2,V1,V2,kv,kh,j,i,n:integer; massa,delta_v,delta_h,htec,vtec,toplivo:real; S,B,C:array [1..70,1..70] of gk; D:array [1..70,1..70]of z; a_poleta:array [1..100] of real; x,y,k,alfa_nom:integer; lx,ly,dlx,dly,r:real; visota,dalnost:array[1..100] of real; begin if button1.Caption='выход' then close; H1:=StrToInt(Form1.Edit1.Text); H2:=StrToInt(Form1.Edit2.Text); V1:=StrToInt(Form1.Edit3.Text); V2:=StrToInt(Form1.Edit4.Text); kv:=StrToInt(Form1.Edit6.Text); {кол-во разбиений по оси V} kh:=StrToInt(Form1.Edit5.Text); {кол-во разбиений по оси H} massa:=47000; delta_v:=(V2-V1)/kv; delta_h:=(H2-H1)/kh; edit11.Text:=FloatToStr(delta_v)+' км/ч'; edit12.Text:=FloatToStr(delta_h)+' м'; htec:=H2; vtec:=V2-delta_v/2; for i:=1 to kh do begin for j:=1 to kv do begin if htec>h_krit(vtec) then AB(s[i,j].teta1,s[i,j].alfa1,S[i,j].time,massa,delta_v/3.6,htec,vtec/3.6) else S[i,j].time:=1000; vtec:=vtec-delta_v; end; vtec:=V2-delta_v/2; htec:=htec-delta_h; end; htec:=H2-delta_h/2; vtec:=V2; for i:=1 to kh do begin for j:=1 to kv do begin if htec>h_krit(vtec) then AD(B[i,j].teta1,B[i,j].alfa1,B[i,j].time,massa,delta_h,htec,vtec/3.6) else B[i,j].time:=1000; vtec:=vtec-delta_v; end; htec:=htec-delta_h; vtec:=V2; end; htec:=H2-delta_h/2; vtec:=V2-delta_v/2; for i:=1 to kh do begin for j:=1 to kv do begin if htec>h_krit(vtec) then AC(C[i,j].teta1,C[i,j].alfa1,C[i,j].time,massa,delta_h,htec,delta_v/3.6,vtec/3.6) else C[i,j].time:=1000; vtec:=vtec-delta_v; end; vtec:=V2-delta_v/2; htec:=htec-delta_h; end; for i:=1 to kh do begin for j:=1 to kv do begin if (i=1) and (j=1) then begin D[1,1].time:=0; D[1,1].naprav:=0; end else if i=1 then begin D[i,j].time:=S[i,j-1].time+d[i,j-1].time; D[i,j].naprav:=1; end else if j=1 then begin D[i,j].time:=B[i-1,j].time+d[i-1,j].time; d[i,j].naprav:=3; end else if (S[i,j-1].time+d[i,j-1].time)<(b[i-1,j].time+d[i-1,j].time) then if (S[i,j-1].time+d[i,j-1].time)<(c[i-1,j-1].time+d[i-1,j-1].time) then begin d[i,j].time:=S[i,j-1].time+d[i,j-1].time; d[i,j].naprav:=1; end else begin d[i,j].time:=c[i-1,j-1].time+d[i-1,j-1].time; d[i,j].naprav:=2; end else if (b[i-1,j].time+d[i-1,j].time)<(c[i-1,j-1].time+d[i-1,j-1].time) then begin d[i,j].time:=b[i-1,j].time+d[i-1,j].time; d[i,j].naprav:=3; end else begin d[i,j].time:=c[i-1,j-1].time+d[i-1,j-1].time; d[i,j].naprav:=2; end; end; end; {построение осей полетной области} dlx:=(V2-V1)/10; dly:=(H2-H1)/10; with Form1.Canvas do begin Pen.Color:=clWhite; rectangle(260,25,1200,340); rectangle(260,430,1200,700); Pen.Color:=clBlack; pen.Width:=1; MoveTo(x0,y0); LineTo(x0,y0-h); MoveTo(x0,y0); LineTo(x0+w,y0); Pen.Color:=clBlack; x:=x0+dx; lx:=V1; repeat MoveTo(x,y0-3); LineTo(x,y0+3); TextOut(x-8,y0+5,FloatToStr(lx)); Pen.Style:=psDot; MoveTo(x,y0-3); LineTo(x,y0-h); Pen.Style:=psSolid; lx:=lx+round(dlx*10/9); x:=x+dx; until (x>x0+w); y:=y0-dy; ly:=H1; repeat MoveTo(x0-3,y); LineTo(x0+3,y); TextOut(x0-30,y,FloatToStr(ly)); Pen.Style:=psDot; MoveTo(x0+3,y); LineTo(x0+w,y); Pen.Style:=psSolid; y:=y-dy; ly:=ly+round(dly*10/9); until (yx0+w); y:=y0+360-dy; dly:=1; ly:=dly; repeat MoveTo(x0-3,y); LineTo(x0+3,y); TextOut(x0-30,y,FloatToStr(ly)); Pen.Style:=psDot; MoveTo(x0+3,y); LineTo(x0+w,y); Pen.Style:=psSolid; y:=y-dy; ly:=ly+dly; until (yx0+w); y:=y0-dy; dly:=(H2-H1)/10; ly:=H1; repeat MoveTo(x0+400-3,y); LineTo(x0+400+3,y); TextOut(x0+400-30,y,FloatToStr(ly)); Pen.Style:=psDot; MoveTo(x0+400+3,y); LineTo(x0+400+w,y); Pen.Style:=psSolid; y:=y-dy; ly:=ly+round(dly*10/9); until (y