Информатика: Движение тела в среде

Материал из Department of Theoretical and Applied Mechanics
Перейти к: навигация, поиск

Лебедев Станислав Описание программы: программа записывает в четыре файла результаты вычисления:

  1. Координаты, рассчитанные по формуле, при движении без сопротивления воздуха;
  2. Координаты, полученные методом Верле при линейной зависимости силы сопротивлении воздуха от скорости;
  3. Координаты, полученные из точного решения, при линейной зависимости силы сопротивлении воздуха от скорости;
  4. Координаты, полученные методом Верле при квадратичной зависимости силы сопротивлении воздуха от скорости.


Скачать можно тут.

Описание программы: программа записывает в четыре файла результаты вычисления:

  1. Координаты, рассчитанные по формуле, при движении без сопротивления воздуха;
  2. Координаты, полученные методом Верле при линейной зависимости силы сопротивлении воздуха от скорости;
  3. Координаты, полученные из точного решения, при линейной зависимости силы сопротивлении воздуха от скорости;
  4. Координаты, полученные методом Верле при квадратичной зависимости силы сопротивлении воздуха от скорости.



1.png

Визуализированный результат работы программы Graph.png

  1. o1 - координаты, рассчитанные по формуле, при движении без сопротивления воздуха;
  2. o2 - координаты, полученные методом Верле при линейной зависимости силы сопротивлении воздуха от скорости;
  3. o3 - координаты, полученные из точного решения, при линейной зависимости силы сопротивлении воздуха от скорости;
  4. 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 }