Информатика: Движение тела в среде — различия между версиями
Материал из Department of Theoretical and Applied Mechanics
Строка 252: | Строка 252: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
+ | </div> |
Версия 23:06, 2 января 2016
Лебедев Станислав Описание программы: программа записывает в четыре файла результаты вычисления:
- Координаты, рассчитанные по формуле, при движении без сопротивления воздуха;
- Координаты, полученные методом Верле при линейной зависимости силы сопротивлении воздуха от скорости;
- Координаты, полученные из точного решения, при линейной зависимости силы сопротивлении воздуха от скорости;
- Координаты, полученные методом Верле при квадратичной зависимости силы сопротивлении воздуха от скорости.
Скачать можно тут.
Описание программы: программа записывает в четыре файла результаты вычисления:
- Координаты, рассчитанные по формуле, при движении без сопротивления воздуха;
- Координаты, полученные методом Верле при линейной зависимости силы сопротивлении воздуха от скорости;
- Координаты, полученные из точного решения, при линейной зависимости силы сопротивлении воздуха от скорости;
- Координаты, полученные методом Верле при квадратичной зависимости силы сопротивлении воздуха от скорости.
Визуализированный результат работы программы
- o1 - координаты, рассчитанные по формуле, при движении без сопротивления воздуха;
- o2 - координаты, полученные методом Верле при линейной зависимости силы сопротивлении воздуха от скорости;
- o3 - координаты, полученные из точного решения, при линейной зависимости силы сопротивлении воздуха от скорости;
- o4 - координаты, полученные методом Верле при квадратичной зависимости силы сопротивлении воздуха от скорости.
Для тела с массой 10,сопротивлением воздуха 1, угол бросания 30°, начальная скорость 30 м/с, ускорение свободного падения 9.8 м/c^2;
Примечание: графики o1 и o2 намеренно посчитаны с малой точностью, чтобы графики не сливались.
1 #include <iostream>
2 #include <math.h>
3 #include "Vector.h"
4 #include <cstring>
5 #include <cmath>
6 #include <malloc.h>
7 #include <fstream>
8
9 #include <iostream>
10 #include <math.h>
11 #include "Vector.h"
12 #include <cstring>
13 #include <cmath>
14 #include <malloc.h>
15 #include <fstream>
16
17 using namespace std;
18
19 int n = 100;
20 ofstream outfile;
21
22 class Ball //класс бросаемого тела
23 {
24 private:
25 double angle,m,k; //угол броска,масса,коэффицент сопротивления воздуха
26 Vector3D r,v,a; //радиус-вектор,вектор скорости,ускорения
27 public:
28
29 //задание начальных параметров через угол,начальное положение,скорость и ускорение,с которым движется тело. Без сопротивления воздуха
30 Ball(double _angle, Vector3D _r, Vector3D _v, Vector3D _a)
31 {
32 angle = _angle;
33 r = _r;
34 v = _v;
35 a = _a;
36 }
37
38 //задание начальных параметров через угол,начальное положение,скорость и ускорение,с которым движется тело. Без сопротивления воздуха
39 Ball(double _angle, double _m, double _k, Vector3D _r, Vector3D _v, Vector3D _a)
40 {
41 angle = _angle;
42 r = _r;
43 v = _v;
44 a = _a;
45 m = _m;
46 k = _k;
47 }
48
49 //точная формула зависимости координаты от времени
50 Vector3D positionReal(double t)
51 {
52 double c1 = m/k,c2 = fabs(a.y)*c1, c3 = exp(-t/c1), c4 = c2*t;
53 return MakeVector(v.x*c1*(1 - c3), c1*(v.y + c2)*(1 - c3) - c4 , 0 );
54 }
55
56 //вывод положения на экран
57 void writePosToScreen()
58 {
59 cout << r.x << " " << r.y << " " << r.z << endl;
60 }
61
62 //вывод положения в файл
63 void writePosToFile(char s[])
64 {
65 outfile.open(s,ios :: app);
66 outfile << r.x << " " << r.y << endl;
67 outfile.close();
68 }
69
70 //вывод произвольного вектора на экран
71 void WVTS(Vector3D v)
72 {
73 cout.width(15);
74 cout << v.x;
75 cout.width(15);
76 cout << v.y;
77 cout.width(15);
78 cout << v.z << endl;
79 }
80
81 //вывод произвольного вектора в файл
82 void WVTF(Vector3D v,char s[])
83 {
84 outfile.open(s,ios :: app);
85 outfile << v.x << " " << v.y << endl;
86 outfile.close();
87 }
88
89 //"пересчет" координаты по Верле(Линейная зависмость)
90 void changeR(Vector3D r1, double dt)
91 {
92 r = MakeVector(2 * r.x - r1.x - k/m*v.x*dt*dt,2*r.y - r1.y - (abs(a.y) + k/m*v.y)*dt*dt, 0 );
93 }
94
95 //"пересчет" координаты по Верле(Квадратичная зависимость)
96 void changeRSQ(Vector3D r1, double dt)
97 {
98 r = MakeVector(2 * r.x - r1.x - k/m*Length(v)*v.x*dt*dt,2*r.y - r1.y - (abs(a.y) + k/m*Length(v)*v.y)*dt*dt, 0 );
99 }
100 //пересчет скорости по Верле
101 void changeV(Vector3D r1,double dt)
102 {
103 v =VS((VmV(r,r1)),1/(2*dt));
104 }
105
106 //рассчет предыдущегт к 0ому элементу
107 Vector3D MR1(double dt)
108 {
109 return MakeVector(r.x - v.x * dt,r.y - v.y * dt,0);
110 }
111
112 //возращает координату тела
113 Vector3D getR()
114 {
115 return r;
116 }
117
118 //рассчет времени полета
119 double TimeOfFly()
120 {
121 return (2*Length(v)*sin(angle)/Length(a));
122 }
123
124 //рассчет координаты по точной формуле. без сопротивления воздуха.
125 Vector3D position(double t)
126 {
127 return MakeVector(r.x + v.x*t + a.x*t*t/2,r.y + v.y*t + a.y*t*t/2,r.z + v.z*t + a.z*t*t/2);
128 }
129
130 };
131
132 int main()
133 {
134 //задание начальных параметров
135 Vector3D g = {0,-9.8,0};
136 double a,dt = 0;
137 char s[20];
138
139 // cin >> dt;
140
141 dt = 0.1;
142 a = (M_PI * 30)/180;
143 Ball b1(a, MakeVector(0,0,0),MakeVector(30,a),g);
144
145 double tof = b1.TimeOfFly()+1; //единичка прибавлена,чтобы график красивым был
146
147 //Без сопростивления возлуха
148 strcpy(s,"");
149 strcat(s, "o1.txt");
150 outfile.open(s, ios :: trunc);
151 outfile.close();
152 for (double i = 0; i <= tof; i += dt)
153 {
154 b1.WVTS(b1.position(i));
155 b1.WVTF(b1.position(i), s);
156 }
157
158
159 //Верле(Линейная зависимость)
160 dt = 0.1;
161 a = (M_PI * 30)/180;
162 Ball b2(a,10 , 1, MakeVector(0,0,0),MakeVector(30,a),g);
163
164 strcpy(s,"");
165 strcat(s, "o2.txt");
166 outfile.open(s,ios :: trunc);
167 outfile.close();
168 Vector3D r1 = b2.MR1(dt),rp;
169 for (double i = 0; i <= 20; i += dt)
170 {
171 rp = b2.getR();
172 b2.writePosToFile(s);
173 b2.writePosToScreen();
174 b2.changeR(r1,dt);
175 b2.changeV(r1,dt);
176 r1.x = rp.x;
177 r1.y = rp.y;
178 }
179
180 //Точное решение (Линейная зависимость)
181 dt = 0.1;
182 a = (M_PI * 30)/180;
183 Ball b3(a,10 , 1, MakeVector(0,0,0),MakeVector(30,a),g);
184
185 strcpy(s,"");
186 strcat(s, "o3.txt");
187 outfile.open(s, ios :: trunc);
188 outfile.close();
189 for (double i = 0; i <= 20; i += dt)
190 {
191 b3.WVTS(b3.positionReal(i));
192 b3.WVTF(b3.positionReal(i), s);
193 }
194
195
196 //Верле (Квадратичная зависимость)
197 dt = 0.1;
198 a = (M_PI * 30)/180;
199 Ball b4(a,10 , 1, MakeVector(0,0,0),MakeVector(30,a),g);
200
201 strcpy(s,"");
202 strcat(s, "o4.txt");
203 outfile.open(s, ios :: trunc);
204 outfile.close();
205 r1 = b4.MR1(dt);
206 for (double i = 0; i <= 20; i += dt)
207 {
208 rp = b4.getR();
209 b4.writePosToFile(s);
210 b4.writePosToScreen();
211 b4.changeRSQ(r1,dt);
212 b4.changeV(r1,dt);
213 r1.x = rp.x;
214 r1.y = rp.y;
215 }
216
217 return 0;
218 }