Форум программистов, компьютерный форум, киберфорум
Delphi: Графика, звук, видео
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.78/18: Рейтинг темы: голосов - 18, средняя оценка - 4.78
0 / 0 / 0
Регистрация: 11.02.2013
Сообщений: 29

Движение сверхзвукового самолета

06.04.2013, 12:34. Показов 3497. Ответов 30
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте! Мне нужно смоделировать движение сверхзвукового самолета.
Литература есть (Мак-****** Д., Дорн У. Численные методы и программирование на ФОРТРАНе, 1977г.). Там все описано, даже текст программы есть, но она для фортрана. Я попытался это все реализовать в Delphi, но у меня не все получилось. Программа все считает, вычисляет, но проблема с счетчиком итераций и выводом данных.
Я решил выполнить это задание в Delphi, потому что не разбираюсь в других средах. Да и в Delphi то не очень. (Если кто сможет в фортране выполнить, будет очень хорошо).
К моей теме прилагается архив, в котором: сканы книги, относящиеся к самолету; выполненная мной программа в Delphi; txt файл с подробным описанием проблемы.
Кто сможет чем-то помочь, буду очень благодарен. Спасибо.
Вложения
Тип файла: zip HELP.zip (1.67 Мб, 34 просмотров)
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
06.04.2013, 12:34
Ответы с готовыми решениями:

Смоделировать движение сверхзвукового самолета
дана блок-схема в фортране, необходимо смоделировать движение сверзвукового самолета в паскале, помогите пожалуйста, никак не могу...

Полет сверхзвукового самолета. Что не правильно?
program Polet; const N=1000; var i:integer; x,y,v,a,vx,vy1:array of real; xy,vy,ay:TEXT; ...

Движение самолета
Подскажите пожалуйста, как сделать следующее задание: Движение самолета по круговой траектории по часовой стрелке. Сталкиваюсь с этим...

30
0 / 0 / 0
Регистрация: 11.02.2013
Сообщений: 29
07.04.2013, 08:59  [ТС]
Вот код программы. Как мне посчитать скорость и угол с заданной точностью от Z1 до Zmax и как-нибудь вывести?
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
unit test;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Grids;
 
type
  TForm1 = class(TForm)
    GroupBox1: TGroupBox;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    Label5: TLabel;
    Edit1: TEdit;
    Edit2: TEdit;
    Edit3: TEdit;
    Edit4: TEdit;
    Edit5: TEdit;
    Button1: TButton;
    Edit6: TEdit;
    Edit7: TEdit;
    Edit8: TEdit;
    Label6: TLabel;
    Label7: TLabel;
    Label8: TLabel;
    GroupBox2: TGroupBox;
    Label9: TLabel;
    GroupBox3: TGroupBox;
    Label10: TLabel;
    Label11: TLabel;
    Label12: TLabel;
    Label13: TLabel;
    Edit9: TEdit;
    Edit10: TEdit;
    Edit11: TEdit;
    Edit13: TEdit;
    Edit14: TEdit;
    Label15: TLabel;
    Label16: TLabel;
    StringGrid1: TStringGrid;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  Form1: TForm1;
  V0,//начальная скорость
  V1,//скорость V1
  z0,//начальная высота
  zmax,//конечная высота
  theta0,//начальный угол
  theta1,// угол (1)
  W,//вес самолета. В проекте используется британская система мер
  S,//площадь несущих крыльев
  Cd,//коэффициент сопротивления воздуха
  Cl,//Коэффициент подъемной силы
  h,//шаг изменения значения высоты
  E,//точность
  grav,//ускорение свободного падения
  D,//Сила сопротивления воздуха
  L,//Подъемная сила
  T,//Тяга двигателей
  ro0,//нормальная плотность воздуха
  DiffV,//Ошибка ограничения DiffV
  DiffA,//Ошибка ограничения DiffA
  A0,//начальный угол в радианах
  F,// FF(V0,A0) - первое уравнение движения при значениях V0 и A0
  G,// GF(V0,A0) - второе уравнение движения при значениях V0 и A0
  VV,// скорость
  AA,// угол в радианах
  A1,//угол (1) в радианах
  A2,//угол (2) в радианах
  V20,//предсказанная скорость (2)
  A20,//предсказанный угол (2)
  itn,// счетчик количества итераций
  V2new,// скорректированная скорость (2)
  A2new,// скорректированный угол в радианах (2)
  theta,// угол
  rho,// плотность
  z1,// высота (1)
  z,//  высота
  z2,// высота (1)
  theta2,//угол (2)
  V2:real;//скорость (2)
  m,i:integer;// количество строк таблицы
implementation
 
{$R *.dfm}
 
 
 
  procedure TForm1.Button1Click(Sender: TObject);
function DenstyF(z:Double):Double;
begin
  DenstyF:=0.0023769*exp((-z)/23600);//плотность воздуха,зависит от высоты
  end;
  function ThrustF(V:Double;z:Double):Double;
begin
ThrustF:=(1+0.5*exp(-sqr(0.001*V-1.5)))*(10000-0.27*z);//тяга двигателей
end;
  function FF(V:Double;A:Double):Double;
  begin
  FF:=(grav*(T-(W*sin(A))-0.5*Cd*rho*S*sqr(V)))/(W*V*sin(A));// Первое уравнение движения самолета. rho-плотность
  end;
function GF(V:Double;A:Double):Double;
begin
GF:=(grav*(0.5*Cl*rho*S*sqr(V)-(W*cos(A))))/(W*sqr(V)*sin(A)); // Второе уравнение движения самолета.
end;
begin
grav:=32.174;// ускорение свободного падения. Используется британская система мер
    z0:=strtofloat(edit1.Text); //начальная высота
    zmax:=strtofloat(edit2.Text);// конечная высота
    theta0:=strtofloat(edit3.Text); //начальный угол
    h:=strtofloat(edit4.Text);  // шаг изменения высоты
    E:=strtofloat(edit5.Text);  // точность
W:=20000;// вес самолета (все величины в английской системе)
S:=160; //  площадь крыльев
Cd:=0.02;// коэффициент сопротивления воздуха
Cl:=0.1; // коэффициент подъемной силы
V0:=1500; //начальная скорость
theta0:=15; //начальный угол
    z1:=z0+h; //высота z1
    rho:=DenstyF(z0);// плотность воздуха на высоте z0
    T:=ThrustF(V0,z0); //тяга двигателей на высоте z0 при скорости V0
    A0:=theta0/57.29578;//угол переводится в радианы для внутренних вычислений
    F:=FF(V0,A0);
    G:=GF(V0,A0);
    VV:=V0+h*F;
    AA:=A0+H*G;
    rho:=DenstyF(z1);//плотность воздуха на высоте z1
    T:=ThrustF(VV,z1);//тяга двигателей на высоте z1
    V1:=V0+0.5*h*(F+FF(VV,AA)); //Исправленный метод Эйлера для вычисления скорости(1)
    A1:=A0+0.5*h*(G+GF(VV,AA)); //Исправленный метод Эйлера для вычисления угла(1)
    theta:=A1*57.29578; //перевод в градусы
    theta1:=A1*57.29578;
     edit6.Text:=floattostr(V1); // вывод скорости, найденной исправленным методом Эйлера
     edit7.Text:=floattostr(z1); // вывод высоты z1
     edit8.Text:=floattostr(theta);//вывод угла, найденного исправленным методом Эйлера
   z2:=z1+h; //высота z2
   rho:=DenstyF(z1);// плотность воздуха на высоте z1
   T:=ThrustF(V1,z1);//тяга двигателей при скорости V1 на высоте z1
   F:=FF(V1,A1);
   G:=GF(V1,A1);
   V2:=V0+2*h*F;
   A2:=A0+2*h*G;
   V20:=V2;
   A20:=A2;
   rho:=DenstyF(z2);//плотность воздуха на высоте z2
 
  T:=ThrustF(V2,z2);//тяга двигателей на высоте z2
   V2new:=V1+0.5*h*(F+FF(V2,A2));
   A2new:=A1+0.5*h*(G+GF(V2,A2));
   theta:=57.29578*A2;
   while (abs((V2-V2new)/V2new)<e) and (abs((A2-A2new)/A2new)<e) do
begin
end;
if (itn<10) then
V2:=V2new;
A2:=A2new;
T:=ThrustF(V2,z2);//тяга двигателей на высоте z2
   V2new:=V1+0.5*h*(F+FF(V2,A2));//скорректированное значение скорости V2
   A2new:=A1+0.5*h*(G+GF(V2,A2));//скорректированное значение угла A2
   theta:=57.29578*A2; // угол (2)
begin
end;
V2:=V2new;
A2:=A2new;
DiffV:=0.2*(V20-V2new);// ошибка ограничения DiffV
DiffA:=0.2*(A20-A2new);// ошибка ограничения DiffА
V2:=V2new+DiffV;
A2:=A2new+DiffA;
theta:=57.29578*A2;
DiffA:=57.29578*DiffA;
     edit9.Text:=floattostr(V2); //Вывод
     edit10.Text:=floattostr(z2);
     edit11.Text:=floattostr(theta);
     edit13.Text:=floattostr(DiffV);
     edit14.Text:=floattostr(DiffA);
     m:=round((zmax-z)/h)+2;//вычисление количества строк таблицы в зависимости от шага h
  StringGrid1.RowCount:=m; //количество строк
  StringGrid1.Cells[0,0]:='Высота';
  StringGrid1.Cells[1,0]:='Скорость';
  StringGrid1.Cells[2,0]:='Угол';
  StringGrid1.Cells[3,0]:='Ошибка ограничения DiffV';
  StringGrid1.Cells[4,0]:='Ошибка ограничения DiffA';
  StringGrid1.Cells[5,0]:='Счетчик итераций';
  for i:=1 to m do  //заполнение таблицы
   begin
   StringGrid1.Cells[0,1]:=FloatToStr(z0); {заполнение таблицы полученными значениями}
   StringGrid1.Cells[1,1]:=FloatToStr(V0);         {высота,скорость,угол,.......}
   StringGrid1.Cells[2,1]:=FloatToStr(theta0);
   StringGrid1.Cells[0,2]:=FloatToStr(z1);
   StringGrid1.Cells[0,3]:=FloatToStr(z2);
   StringGrid1.Cells[1,2]:=FloatToStr(V1);
   StringGrid1.Cells[1,3]:=FloatToStr(V2);
   StringGrid1.Cells[2,2]:=FloatToStr(theta1);
   StringGrid1.Cells[2,3]:=FloatToStr(theta);
   StringGrid1.Cells[3,3]:=FloatToStr(DiffV);
   StringGrid1.Cells[4,3]:=FloatToStr(DiffA);
 
end;
 
end;
end.
0
445 / 373 / 133
Регистрация: 09.09.2011
Сообщений: 1,343
08.04.2013, 17:43
эээ, а почему в размерности величины плотности воздуха (10,62) присутствуют секунды? Ошибки перевода?
0
0 / 0 / 0
Регистрация: 11.02.2013
Сообщений: 29
08.04.2013, 19:39  [ТС]
Kitayets, Спасибо за ответ).
Размерность величины плотности воздуха в скриншоте? Оригинал книги на английском языке, видимо Б.Н.Казак (он переводил книгу) ошибся и как-то появились секунды). Размерность роли не играет, главное - численные значения.
Вот название книги:
Д.Мак-******, У.Дорн. Численные методы и программирование на ФОРТРАНе.
Daniel McCracken, William S. Dorn. Numerical methods and FORTRAN programming.
Еще раз спасибо)
0
445 / 373 / 133
Регистрация: 09.09.2011
Сообщений: 1,343
10.04.2013, 18:25
Я бы на твоем месте перенёс вопросы из txt файла сюда, ибо в шапке описана только часть проблемы.

Кстати, описание этой задачи с формулами в системе СИ есть в документе который выложен в теме "полет сверхзвукового самолета.Что не правильно?" которая показывается внизу в разделе "Похожие темы".

Добавлено через 4 минуты
что касается твоей программы, то в лоб с фортрана ты не смог её осмысленно перенести. Да и должны быть изменения в самой логике программы, т.к. в программе на Фортран всё решения вываливаются на ленту.

Программу я немного подкручу чтоб она соответствовала фортран-овской.
1
0 / 0 / 0
Регистрация: 11.02.2013
Сообщений: 29
10.04.2013, 20:40  [ТС]
Формулы в системе СИ я посмотрел, спасибо. Если преподаватель потребует в СИ , заменю.
Там, если не ошибаюсь, задача решается только модифицированным методом Эйлера, а мне еще прогноз и коррекцию надо.
0
445 / 373 / 133
Регистрация: 09.09.2011
Сообщений: 1,343
11.04.2013, 17:15
Цитата Сообщение от cMep4 Посмотреть сообщение
Там, если не ошибаюсь, задача решается только модифицированным методом Эйлера, а мне еще прогноз и коррекцию надо.
Я конечно в вышке не особо рублю, но согласно википедии - модификация метода Эйлера как раз и заключается в добавлении шагов прогнозирования и коррекции. И в фортрановской программе так и реализовано.
0
0 / 0 / 0
Регистрация: 11.02.2013
Сообщений: 29
13.04.2013, 21:45  [ТС]
Поправил вычисление с точностью https://www.cyberforum.ru/cgi-bin/latex.cgi?\varepsilon. (Добавил repeat...until). C точностью теперь все ОК.
Для наглядности вычислил 3-и значения (z3,V3,theta3......). Их потом можно убрать.
Осталось вычислить следующие значения и вывести их.
Как мне зациклить (или что-нибудь сделать), чтобы программа вычисляла следующие значения от первого до n-ого. Где https://www.cyberforum.ru/cgi-bin/latex.cgi?n=\frac{Zmaz-Z0}{h}.
Куда посоветуете выводить результаты? Мне кажется в StringGrid не получится.
Если нужно будет, могу выложить архив с программой.
Исправленный код
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
unit test;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Grids;
 
type
  TForm1 = class(TForm)
    GroupBox1: TGroupBox;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    Label5: TLabel;
    Edit1: TEdit;
    Edit2: TEdit;
    Edit3: TEdit;
    Edit4: TEdit;
    Edit5: TEdit;
    Button1: TButton;
    Edit6: TEdit;
    Edit7: TEdit;
    Edit8: TEdit;
    Label6: TLabel;
    Label7: TLabel;
    Label8: TLabel;
    GroupBox2: TGroupBox;
    Label9: TLabel;
    GroupBox3: TGroupBox;
    Label10: TLabel;
    Label11: TLabel;
    Label12: TLabel;
    Label13: TLabel;
    Edit9: TEdit;
    Edit10: TEdit;
    Edit11: TEdit;
    Edit13: TEdit;
    Edit14: TEdit;
    Label15: TLabel;
    Label16: TLabel;
    StringGrid1: TStringGrid;
    GroupBox4: TGroupBox;
    Label14: TLabel;
    Label17: TLabel;
    Label18: TLabel;
    Label19: TLabel;
    Label20: TLabel;
    Label21: TLabel;
    Edit12: TEdit;
    Edit15: TEdit;
    Edit16: TEdit;
    Edit17: TEdit;
    Edit18: TEdit;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  Form1: TForm1;
  V0,//начальная скорость
  V1,//скорость V1
  z0,//начальная высота
  zmax,//конечная высота
  theta0,//начальный угол
  theta1,// угол (1)
  W,//вес самолета. В проекте используется британская система мер
  S,//площадь несущих крыльев
  Cd,//коэффициент сопротивления воздуха
  Cl,//Коэффициент подъемной силы
  h,//шаг изменения значения высоты
  E,//точность
  grav,//ускорение свободного падения
  D,//Сила сопротивления воздуха
  L,//Подъемная сила
  T,//Тяга двигателей
  ro0,//нормальная плотность воздуха
  DiffV,//Ошибка ограничения DiffV
  DiffA,//Ошибка ограничения DiffA
  A0,//начальный угол в радианах
  F,// FF(V0,A0) - первое уравнение движения при значениях V0 и A0
  G,// GF(V0,A0) - второе уравнение движения при значениях V0 и A0
  VV,// скорость
  AA,// угол в радианах
  A1,//угол (1) в радианах
  A2,//угол (2) в радианах
  V20,//предсказанная скорость (2)
  A20,//предсказанный угол (2)
  itn,// счетчик количества итераций
  V2new,// скорректированная скорость (2)
  A2new,// скорректированный угол в радианах (2)
  theta,// угол
  rho,// плотность
  z1,// высота (1)
  z,//  высота
  z2,// высота (1)
  theta2,//угол (2)
  z3,
  v30,
  a30,
  v3new,
  a3new,
  diffv1,
  diffa1,
  v3,
  a3,
  theta3,
  V2:real;//скорость (2)
  m,i:integer;// количество строк таблицы
implementation
 
{$R *.dfm}
 
 
 
  procedure TForm1.Button1Click(Sender: TObject);
function DenstyF(z:Double):Double;
begin
  DenstyF:=0.0023769*exp((-z)/23600);//плотность воздуха,зависит от высоты
  end;
  function ThrustF(V:Double;z:Double):Double;
begin
ThrustF:=(1+0.5*exp(-sqr(0.001*V-1.5)))*(10000-0.27*z);//тяга двигателей
end;
  function FF(V:Double;A:Double):Double;
  begin
  FF:=(grav*(T-(W*sin(A))-0.5*Cd*rho*S*sqr(V)))/(W*V*sin(A));// Первое уравнение движения самолета. rho-плотность
  end;
function GF(V:Double;A:Double):Double;
begin
GF:=(grav*(0.5*Cl*rho*S*sqr(V)-(W*cos(A))))/(W*sqr(V)*sin(A)); // Второе уравнение движения самолета.
end;
begin
grav:=32.174;// ускорение свободного падения. Используется британская система мер
    z0:=strtofloat(edit1.Text); //начальная высота
    zmax:=strtofloat(edit2.Text);// конечная высота
    theta0:=strtofloat(edit3.Text); //начальный угол
    h:=strtofloat(edit4.Text);  // шаг изменения высоты
    E:=strtofloat(edit5.Text);  // точность
W:=20000;// вес самолета (все величины в английской системе)
S:=160; //  площадь крыльев
Cd:=0.02;// коэффициент сопротивления воздуха
Cl:=0.1; // коэффициент подъемной силы
V0:=1500; //начальная скорость
theta0:=15; //начальный угол
    z1:=z0+h; //высота z1
    rho:=DenstyF(z0);// плотность воздуха на высоте z0
    T:=ThrustF(V0,z0); //тяга двигателей на высоте z0 при скорости V0
    A0:=theta0/57.29578;//угол переводится в радианы для внутренних вычислений
    F:=FF(V0,A0);
    G:=GF(V0,A0);
    VV:=V0+h*F;
    AA:=A0+H*G;
    rho:=DenstyF(z1);//плотность воздуха на высоте z1
    T:=ThrustF(VV,z1);//тяга двигателей на высоте z1
    V1:=V0+0.5*h*(F+FF(VV,AA)); //Исправленный метод Эйлера для вычисления скорости(1)
    A1:=A0+0.5*h*(G+GF(VV,AA)); //Исправленный метод Эйлера для вычисления угла(1)
    theta:=A1*57.29578; //перевод в градусы
    theta1:=A1*57.29578;
     edit6.Text:=floattostr(V1); // вывод скорости, найденной исправленным методом Эйлера
     edit7.Text:=floattostr(z1); // вывод высоты z1
     edit8.Text:=floattostr(theta);//вывод угла, найденного исправленным методом Эйлера
   z2:=z1+h; //высота z2
   rho:=DenstyF(z1);// плотность воздуха на высоте z1
   T:=ThrustF(V1,z1);//тяга двигателей при скорости V1 на высоте z1
   F:=FF(V1,A1);
   G:=GF(V1,A1);
   V2:=V0+2*h*F;
   A2:=A0+2*h*G;
   V20:=V2;
   A20:=A2;
   rho:=DenstyF(z2);//плотность воздуха на высоте z2
T:=ThrustF(V2,z2);
   V2new:=V1+0.5*h*(F+FF(V2,A2));
   A2new:=A1+0.5*h*(G+GF(V2,A2));
   theta:=57.29578*A2;
V2:=V2new;
A2:=A2new;
repeat
  T:=ThrustF(V2,z2);
   V2new:=V1+0.5*h*(F+FF(V2,A2));
   A2new:=A1+0.5*h*(G+GF(V2,A2));
   theta:=57.29578*A2;
   until (abs((V2-V2new)/v2new)<E) and (abs((A2-A2new)/A2new)<E);
DiffV:=0.2*(V20-V2new);// ошибка ограничения DiffV
DiffA:=0.2*(A20-A2new);// ошибка ограничения DiffА
V2:=V2new+DiffV;
A2:=A2new+DiffA;
theta:=57.29578*A2;
DiffA:=57.29578*DiffA;
  //вычисление V3,theta3,z3,DiffV1,DiffA1.....
  z3:=z2+h;
  rho:=DenstyF(z2);// плотность воздуха на высоте z1
   T:=ThrustF(V2,z2);//тяга двигателей при скорости V1 на высоте z1
   F:=FF(V2,A2);
   G:=GF(V2,A2);
   V3:=V1+2*h*F;
   A3:=A1+2*h*G;
   V30:=V3;
   A30:=A3;
   rho:=DenstyF(z3);//плотность воздуха на высоте z3
   T:=ThrustF(V3,z3);
   V3new:=V2+0.5*h*(F+FF(V3,A3));
   A3new:=A2+0.5*h*(G+GF(V3,A3));
   theta3:=57.29578*A3;
V3:=V3new;
A3:=A3new;
repeat
  T:=ThrustF(V3,z3);
   V3new:=V2+0.5*h*(F+FF(V3,A3));
   A3new:=A2+0.5*h*(G+GF(V3,A3));
   theta3:=57.29578*A3;
   until (abs((V3-V3new)/v3new)<E) and (abs((A3-A3new)/A3new)<E);
DiffV1:=0.2*(V30-V3new);// ошибка ограничения DiffV
DiffA1:=0.2*(A30-A3new);// ошибка ограничения DiffА
V3:=V3new+DiffV1;
A3:=A3new+DiffA1;
theta3:=57.29578*A3;
DiffA1:=57.29578*DiffA1;
     edit9.Text:=floattostr(V2); //Вывод
     edit10.Text:=floattostr(z2);
     edit11.Text:=floattostr(theta);
     edit13.Text:=floattostr(DiffV);
     edit14.Text:=floattostr(DiffA);
     edit12.Text:=floattostr(V3); //Вывод
     edit15.Text:=floattostr(z3);
     edit16.Text:=floattostr(theta3);
     edit17.Text:=floattostr(DiffV1);
     edit18.Text:=floattostr(DiffA1);
 
     m:=round((zmax-z)/h)+2;//вычисление количества строк таблицы в зависимости от шага h
  StringGrid1.RowCount:=m; //количество строк
  StringGrid1.Cells[0,0]:='Высота';
  StringGrid1.Cells[1,0]:='Скорость';
  StringGrid1.Cells[2,0]:='Угол';
  StringGrid1.Cells[3,0]:='Ошибка ограничения DiffV';
  StringGrid1.Cells[4,0]:='Ошибка ограничения DiffA';
  StringGrid1.Cells[5,0]:='Счетчик итераций';
  //заполнение таблицы
   begin
StringGrid1.Cells[0,1]:=FloatToStr(z0); {заполнение таблицы полученными значениями}
   StringGrid1.Cells[1,1]:=FloatToStr(V0);         {высота,скорость,угол,.......}
      StringGrid1.Cells[2,1]:=FloatToStr(theta0);
StringGrid1.Cells[0,2]:=FloatToStr(z1);
StringGrid1.Cells[0,3]:=FloatToStr(z2);
   StringGrid1.Cells[1,2]:=FloatToStr(V1);
   StringGrid1.Cells[1,3]:=FloatToStr(V2);
      StringGrid1.Cells[2,2]:=FloatToStr(theta1);
      StringGrid1.Cells[2,3]:=FloatToStr(theta);
 StringGrid1.Cells[3,3]:=FloatToStr(DiffV);
 StringGrid1.Cells[4,3]:=FloatToStr(DiffA);
StringGrid1.Cells[0,4]:=FloatToStr(z3);
   StringGrid1.Cells[1,4]:=FloatToStr(V3);
      StringGrid1.Cells[2,4]:=FloatToStr(theta3);
 StringGrid1.Cells[3,4]:=FloatToStr(DiffV1);
 StringGrid1.Cells[4,4]:=FloatToStr(DiffA1);
end;
 
end;
end.
Помогите пожалуйста!

Добавлено через 8 часов 32 минуты
получится ли этот способ в моей программе? Выводить решения в txt - файл?
Delphi
1
2
3
4
5
6
7
8
9
procedure TForm1.Button2Click(Sender: TObject);
var
   f: TextFile;
begin
  AssignFile (f, 'result.txt');
  Rewrite (f);
  WriteLn (f,z0,v0,theta0);
  CloseFile (f);
end;
Как мне поправить результат? "5000" получается в виде "5.00000000000000E+0003"
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33184 / 21482 / 8231
Регистрация: 22.10.2011
Сообщений: 36,850
Записей в блоге: 12
14.04.2013, 13:08
Задай формат вывода:
Delphi
1
WriteLn (f,z0:10:3,v0:10:3,theta0:10:3);
, ну, или замени количество выводимых символов всего/после запятой на своё, если 3 знаков после запятой недостаточно
0
445 / 373 / 133
Регистрация: 09.09.2011
Сообщений: 1,343
15.04.2013, 18:14
Вот попробовал 1 в 1 переделать программу из фортрана.
Значения расходятся с теми, что представлены в книге, но изменения значений примерно повторяют изменения которые приведены в книге, т.е. скорость сначала немного растёт, а потом падает и т.д. . Думаю что в книге код программы на фортране тоже немного покалечен. Например в цикле вычисления присваивается значение переменной Z0, которая потом в цикле нигде не используется. Хотя может и я где-то ошибся.
Кликните здесь для просмотра всего текста


К сожалению с новой флешевой формой заливки файлов на форум у меня ничего не грузится, по этому выкладываю приложение на "левом" ресурсе.

Проект с программой

Не по теме:

Программы разрабатываю в основном в Lazarus, а тут делал проект в турбо длефи и весь измучился - как всё не удобно. Особенно что касается правки GUI.

1
0 / 0 / 0
Регистрация: 11.02.2013
Сообщений: 29
15.04.2013, 21:05  [ТС]
Kitayets, Огромнейшее человеческое спасибо Вам спасибо за помощь. Вы проделали такую большую работу. У Вас все получилось так, как мне нужно, но мне кажется, я нашел у вас ошибку:
(calculationU.pas, строки 103-111)
Pascal
1
2
3
4
5
6
7
8
9
     VNew:= V1 + 0.5 * aH * (F + FF(aPlaneParam, V, ARad, Z));
     ANew:= ARad1 + 0.5 * aH * (G + GF(aPlaneParam, V, ARad, Z));
     //если попадаем в точность, то выходим из цикла
     if (abs((V - VNew)/ VNew) < aTol) and (abs((ARad - ANew)/ANew) < aTol) then begin
       break; //выходим из цикла
     end;
     V:= VNew;
     ARad:= ANew;
   end;
Здесь у Вас проверяется на точность: если попало,то выход из цикла. По моему там надо так: если попадается в точность, то V:=VNew и ARad:=ANew.
Pascal
1
2
3
4
5
6
7
     VNew:= V1 + 0.5 * aH * (F + FF(aPlaneParam, V, ARad, Z));
     ANew:= ARad1 + 0.5 * aH * (G + GF(aPlaneParam, V, ARad, Z));
     //если попадаем в точность, то выходим из цикла
     if (abs((V - VNew)/ VNew) < aTol) and (abs((ARad - ANew)/ANew) < aTol) then begin
     V:= VNew;
     ARad:= ANew
     end;
Проверьте пожалуйста, может я ошибаюсь. Самому проверить пока нет возможности (не установил Turbo Delphi на Windows 7) .
0
0 / 0 / 0
Регистрация: 11.02.2013
Сообщений: 29
15.04.2013, 22:46  [ТС]
А можно ли составить простую программу отрисовки графика движения самолета (самолет в виде материальной точки) , чтобы выглядела примерно так:
Кликните здесь для просмотра всего текста
0
0 / 0 / 0
Регистрация: 11.02.2013
Сообщений: 29
15.04.2013, 23:02  [ТС]
Простите, еще в одном месте исправить:
Параметры самолета: Коэф. сопротивления и Коэф. подъемной силы перепутаны местами.
0
445 / 373 / 133
Регистрация: 09.09.2011
Сообщений: 1,343
16.04.2013, 11:27
Цитата Сообщение от cMep4 Посмотреть сообщение
Kitayets, Огромнейшее человеческое спасибо Вам спасибо за помощь. Вы проделали такую большую работу. У Вас все получилось так, как мне нужно, но мне кажется, я нашел у вас ошибку:
(calculationU.pas, строки 103-111)
Pascal
1
2
3
4
5
6
7
8
9
     VNew:= V1 + 0.5 * aH * (F + FF(aPlaneParam, V, ARad, Z));
     ANew:= ARad1 + 0.5 * aH * (G + GF(aPlaneParam, V, ARad, Z));
     //если попадаем в точность, то выходим из цикла
     if (abs((V - VNew)/ VNew) < aTol) and (abs((ARad - ANew)/ANew) < aTol) then begin
       break; //выходим из цикла
     end;
     V:= VNew;
     ARad:= ANew;
   end;
Здесь у Вас проверяется на точность: если попало,то выход из цикла. По моему там надо так: если попадается в точность, то V:=VNew и ARad:=ANew.
это место программы я выделил красным:

Как видно, если решение "сошлось" (попало в точность) то мы выходим из цикла и считаем оценки ошибок, если не сошлось - то приравниваем V:=VNew и ARad:=ANew и идём на следующую итерацию. Так что я считаю,что ошибка скорее всего не в этом месте.

Добавлено через 23 минуты
Цитата Сообщение от cMep4 Посмотреть сообщение
Самому проверить пока нет возможности (не установил Turbo Delphi на Windows 7) .
По идее проект и в delphi7 должен нормально работать.
1
0 / 0 / 0
Регистрация: 11.02.2013
Сообщений: 29
16.04.2013, 16:09  [ТС]
Спасибо. В Delphi 7 появляется ошибка (и таких несколько).
Вы перепутали местами Коэф. сопротивления и Коэф. подъемной силы.
Если ввести Коэф. сопротивления=0,02 и Коэф. подъемной силы=0,1, то в таблицу выводятся только четыре значения (5000-6500).
Кликните здесь для просмотра всего текста
Миниатюры
Движение сверхзвукового самолета  
0
445 / 373 / 133
Регистрация: 09.09.2011
Сообщений: 1,343
16.04.2013, 23:59
коэф. там не перепутаны, а перепутан текст в соотвествующих label-ах. описка просто.

а то что при изменении параметров выводятся не все высоты, то это отрабатывает условие, что если за 10 итерций решение не схдится то вывод прекращается. такая же логика и в программе на фортране.

что касается ошибки при открытии проекта в д7, попробуйте жать кнопку ignore. скорее всего выравнивание визуальных элементов немного сьедет, но работать должно.
1
0 / 0 / 0
Регистрация: 11.02.2013
Сообщений: 29
17.04.2013, 00:27  [ТС]
Kitayets, Ага, я только потом заметил что текст перепутан.
Нажал ignore all, проект открылся, все label'ы имели свойство Align alTop, поправил, все работает.
А можно как нибудь добавить программу построения траектории движения самолета по найденным значениям?
Благодарю еще раз за помощь.
0
445 / 373 / 133
Регистрация: 09.09.2011
Сообщений: 1,343
17.04.2013, 12:37
с помощью TChart такое реализуется довольно просто.
1
0 / 0 / 0
Регистрация: 11.02.2013
Сообщений: 29
18.04.2013, 15:03  [ТС]
Kitayets, Извините за беспокойство, посмотрите пожалуйста: Сначала описали функции для плотности воздуха и тяги двигателя (которые зависят от высоты). Потом их не использовали (имеется ввиду переменные rho и T, их вообще нет). Мне кажется, их надо считать с каждой новой высотой отдельно, тогда будет все правильно.
Поправьте пожалуйста, если есть возможность и время.
Я пока не могу разобраться с кодом и структурой программы (сразу видно профессионал писал): что-то в одном месте, что-то в другом и т.д. (Я начинаю осваивать мир программирования)
Кликните здесь для просмотра всего текста
0
445 / 373 / 133
Регистрация: 09.09.2011
Сообщений: 1,343
18.04.2013, 15:39
Цитата Сообщение от cMep4 Посмотреть сообщение
начала описали функции для плотности воздуха и тяги двигателя (которые зависят от высоты). Потом их не использовали (имеется ввиду переменные rho и T, их вообще нет).
вызов этих функций у меня встроен в функции расчета FF и GF для этого я добавил в описание этих функций ещё один параметр Z - высоту.

Короче я думаю, переписать фортрановскую прогу 1 в 1 на паскаль с использованием goto и всеми описанными там промежуточными переменными, чтобы убедиться, что я нигде не ошибся.

результат выложу сюда.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
18.04.2013, 15:39
Помогаю со студенческими работами здесь

Уравнение движение самолета
Друзья, как вычислить скорость самолета. Самолет летит над нами прямолинейно. Вы наблюдаем его всегда под углом. Расстоянию до...

Движение самолета по заданным точкам
Здравствуйте! Нужна помощь в создании игры. Есть самолет, который должен двигаться по заданным точкам. Я пытаюсь писать вот такую...

Движение самолета на фоне неба
Движение самолета на фоне неба. А то курсовой нужно писать. Времени совсем нет. Изучить не успеваю. (Если можно с комментариями)). Буду...

Движение самолета, управляемое клавиатурой
Всем здравствуйте! Помогите пожалуйста решить вот эту задачу - Вверху справа налево медленно движется вражеский самолет (эллипс). В...

Движение автомобиля и самолета в противоположных направлениях
Люди, сделайте плиз анимацию чтоб, например, сверху самолет летит в одну сторорну а снизу машина едет в другую(если ето возможно) и с фоном...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга, Ты же видел моря и метели. Как сменялись короны и стяги, Как эпохи стрелою летели. - Этот мир — это крылья и горы, Снег и пламя, любовь и тревоги, И бескрайние. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru