{$A+,B-,D+,E+,F-,G-,I+,L+,N-,O-,P-,Q-,R-,S+,T-,V+,X+,Y+} (*{$М 16384,0,655360}*) {N+} Program pan; Uses Crt, Graph; type rashod_topl=record {Тип для массива расхода топлива} hv:array[1..3] of real; {1-при изменение Н, 2 -при изменении V , 3-при изменении H,V} end; traekt=record {Тип для траекторного массива} sum:real; {Суммарный массовый расход в точке} n, m: byte;{Координаты точки} end; const massa=47000; {Масса самолета ТУ-134, КГ } S=127; {Эффективная площадь} Hn=400; {Начальная высота[м]} Hk=6500; {Конечная высота[м]} Vn=320*1000/3600;{Начальная скорость [м/с] } Vk=720*1000/3600;{Конечная скорость [м/с] } Step_max=36; {Максимальное число разбиений} al0=4*pi/180; {Начальный угол атаки} phi=3*pi/180; {Угол установки двигателей} Var {описание глобальных переменных} Step:integer;{Число разбиений} dV,dH,Vt,Ht:real; RT:array[1..Step_max,1..Step_max] of rashod_topl;{Массив расхода топлива} trr : array [1..3] of real;{вспомогательный массив массового расхода} i,j,k,num: integer; {счетчики} TRKT:array[1..Step_max,1..Step_max] of traekt;{массив траекторий} min:real; nexti,nextj:integer;{Переменные для построения графика} x,xn,y,yn,dx,dy,xn1,xn2,yn1,yn2,Ht1,Vt1:integer;{Переменные для построения} {сетки} Gd,Gm:integer;{Переменные для инициализации графики} H_string, V_String: String;{Переменные для проставления цифр на графике} Function g(H:real ):real; {Ускорение свободного падения} begin {как функция высоты} g:=9.8066-0.000003*H; end; Function a(H:real):real; {Скорость звука} begin {как функция высоты} a:=340.294-(27.988/7000)*H; end; Function Ro(H:Real): Real; {Плотность как функция высоты} begin Ro:=1.225*exp(-0.00009654630994*H); end; Function P(H,V:Real):Real;{Сила тяги двигателя} var {в зависимости от высоты и скорости} M:Real; {Число Маха} PP:Real; {Вспогательная переменная} begin M:=V/a(H); {Вычисление числа маха} If (H>0)and(H<=4000) then PP:=77500-20000*M; If (H>4000) and (H<=6000) then PP:=71666.7-21666.7*M; If (H>6000) AND (H<=8000) then PP:= 55833-11666.6*M; P:=PP*0.9; {Используем 90% всей силы(по условию)} end; Function Ce(H,V:real):real;{Удельный расход топлива} var {как функция высоты и скорости} M:Real; {Число Маха} C:Real; {Вспомогательня переменная} begin M:= V/a(H); {Расчет числа маха} If (H>=0)and(H<=2000) then C:=0.075*M + 0.0473; If (H>2000)and(H<=4000) then C:=0.037*M + 0.0622; If (H>4000) and (H<=8000) then C:= 0.034*M+0.0607; Ce:=C; end; Function kapa(H,V,dH,dV:real):real;{Вспомогательная величина,} begin {зависит от того,что изменяется:} if dH=0 then kapa:=0 {скорость,высота или} else kapa:=1/(1+V*dV/g(H)/dH);{скорость и высота вместе} end; Function Cxo(H,V:real):real; {Коэффициент Cxo в зависимости} var {от числа Маха} M:real; begin M:=V/a(H); Cxo:=0.016*M+0.007; end; Function Af(H,V:real):real;{Коэффициент развала поляры} var {в зависимости от числа Маха} M:real; begin M:=V/a(H); Af:=-0.07*M+0.096; end; procedure RC(var alpha_k, teta_k,Cyk,Cxk,Xk,H,V,dH,dV:real); {Процедура расчета угла атаки,угла наклона траектории и продольной силы Х} var alpha,teta:real; Cyo,Cx0,Cy0,Xo,Yo,Cx,X,Y:real; k:integer; begin alpha:=5*pi/180; teta:=5*pi/180; Cyo:=0.1; Cy0:=Cyo*(alpha-al0); Cx0:=Cxo(H,V)+Af(H,V)*Cy0*Cy0; Xo:=Cx0*Ro(H)*V*V*S*0.5; Yo:=Cy0*Ro(H)*V*V*S*0.5; for k:=1 to 3 do {Делаем 3 итерации} begin alpha:=(Cyo*al0*S*Ro(H)*V*V*0.5+massa*g(H)*cos(teta)- P(H,V)*sin(alpha+phi))/(Cyo*S*Ro(H)*V*V*0.5); teta:=arctan((kapa(H,V,dH,dV)*P(H,V)*cos(alpha+phi)- Xo*kapa(H,V,dH,dV))/(P(H,V)*sin(alpha+phi)+Yo)); end; alpha_k:=alpha; teta_k:=teta; Cyk:=Cyo*(alpha_k-al0); Cxk:=Cxo(H,V)+Af(H,V)*Cyk*Cyk; Xk:=Cxk*S*Ro(H)*V*V*0.5; end; Function time(H,V,dH,dV:real):real;{Время, затраченное на элементарное} var {перемещение} al,tet,Cy_k,Cx_k,X_k: real; begin RC(al,tet,Cy_k,Cx_k,X_k,H,V,dH,dV); if dV=0 then time:=dH/(V*sin(tet)); {при наборе высоты} if dH=0 then time:=(massa*dV)/(P(H,V)*cos(al+phi)-X_k- massa*g(H)*sin(tet)); {при наборе скорости} if (dV<>0)and(dH<>0) then time:=dH/(V*sin(tet)); {при одновременном} end; {наборе высоты и скорости} Function dm(H,V,dH,dV:real):real; {Расход топлива} begin dm:=abs(-(Ce(H,V)*P(H,V)*time(H,V,dH,dV))/3600); end; BEGIN {MAIN} {3аполнение массива расхода топлива} clrscr; write('Задайте число разбиений(не больше 30): '); read(Step); dV:=(Vk-Vn)/Step;{Определяем шаг, с которым будем двигаться} dH:=(Hk-Hn)/Step;{по высоте и скорости} Ht:=Hn;Vt:=Vn; {Уходим в начальную точку} {Подсчет расхода топлива при наборе высоты} for j:=1 to Step do begin Ht:=Hn; for i:=1 to Step do begin if (Ht<(234*Vt-14300))and((Ht>88.30*Vt-14720)){Ограничение полета} then RT[i,j].hv[1]:=dm(Ht,Vt,dH,0) else RT[i,j].hv[1]:=100000;{Задаем заведомо большое число, чтобы} Ht:=Ht+dH; {траектория точно не пошла в эту точку} end; Vt:=Vt+dV; {шагаем по скорости} end; {Подсчет расхода топлива при наборе скорости } Ht:=Hn; Vt:=Vn; for i:=1 to Step do begin Vt:=Vn; for j:=1 to Step do begin if (Ht<(234*Vt-14300))and((Ht>88.30*Vt-14720)) then RT[i,j].hv[2]:=dm(Ht,Vt,0,dV) else RT[i,j].hv[2]:=100000; Vt:=Vt+dV end; Ht:=Ht+dH; end; {Подсчет расхода топлива при одновременном наборе скорости и высоты} Vt:=Vn; Ht:=Hn; for i:=1 to step do begin Vt:=Vn; Ht:=Ht+dH; for j:=1 to Step do begin Vt:=Vt+dV; if (Ht<(234*Vt-14300))and((Ht>88.30*Vt-14720)) then RT[i,j].hv[3]:=dm(Ht,Vt,dH,dV) else RT[i,j].hv[3]:=100000 ; end; end; {Заполняем массив траекторий} i:=Step+1; j:=Step+1; TRKT[i,j].sum:=0; for j:=Step downto 1 do begin TRKT[i,j].sum:=TRKT[i,j+1].sum+Rt[i-1,j].hv[1];{Суммируем} TRKT[i,j].n:=i; {по горизонтали} TRKT[i,j].m:=j+1; {Запоминаем координаты предыдущей точки} end; i:=Step+1; j:=Step+1; TRKT[i,j].sum:=0; for i:=step downto 1 do begin TRKT[i,j].sum:=TRKT[i+1,j].sum+Rt [i, j].hv[2] ;{Суммируем по вертикали} TRKT[i,j].n:=i+1; TRKT[i,j].m:=j ; {Запоминаem координаты предыдущей точки} end; trr[1]:=0; trr[2]:=0; trr[3]:=0; {Вспомогательный массив} for i:=Step downto 1 do begin for j:=Step downto 1 do begin trr[1]:=TRKT[i,j+1].sum+RT[i,j].hv[2]; {Получаем три расхода для} trr[2]:=TRKT[i+1,j].sum+RT[i,j].hv[1]; {для данной точки} trr[3]:=TRKT[i+1,j+1].sum+RT[i,j].hv[3]; min:=trr[1] ; num:=1; for k:=1 to 3 do begin if trr[k] grOk then Halt(1); xn:=50; yn:=400; dx:=round((600-50)/Step); dy:=round((400-50)/Step); settextstyle(0,0,0); x:=xn+Step*dx; y:=yn-Step*dy; for i:=1 to Step+1 do begin line(50,yn,x,yn); yn:=yn-dy; end; xn:=50; yn:=400; for j:=1 to Step+1 do begin line(xn,y,xn,400); xn:=xn+dx ; end; {Вывод чисел на графике} xn1:=50; xn2:=17; yn1:=410; yn2:=400; Ht1:=round(Hn); Vt1:=round(Vn); Str(Ht1, H_string); Str(Vt1, V_string); outtextxy(xn1,yn1,V_string); outtextxy(xn2,yn2,H_string); Ht:=Hn; Vt:=Vn; for i:=1 to Step do begin xn1:=xn1+dx; yn2:=yn2-dy; Ht1:=round(Ht1+dH); Vt1:=round(Vt1+dV); Str(Ht1, H_string); Str(Vt1, V_string); outtextxy(xn1,yn1,V_string); outtextxy(xn2,yn2,H_string); end; {Построение траектории} moveto(50,400); xn:=50; yn:=400; j:=1;i:=1; nexti:=TRKT[i,j].n; nextj:=TRKT[i, j].m; {получаем ссылку на cледующую точку} repeat {По полученным значениям ссылок на последующую точку, выбираем, куда дальше рисовать линию} if ((nexti-i)<>0) and ((nextj-j)=0) then xn:=xn+dx ; if ((nexti-i)=0) and ((nextj-j)<>0) then yn:=yn-dy ; if ((nexti-i)<>0) and ((nextj-j)<>0) then begin xn:=xn+dx; yn:=yn-dy; end; setcolor(4); lineto(xn,yn) ; j:=nextj; i:=nexti; nextj:=TRKT[i,j].m; nexti:=TRKT[i,j].n;{получаем ссылку на cлудующую точку} until (j=Step+1) and (i=Step+1); outtextxy(25,25,'Для выхода из программы нажмите любую клавишу'); repeat until keypressed; closegraph; End. {конец программы}