C++で常微分方程式(オイラー法)
初速 150 km/h で, 45°の角度で投げたボールの軌跡をオイラー法で計算する
(空気抵抗を考慮しない)
#include <iostream> #include <iomanip> #include <math.h> using namespace std; int main(void) { // 角度 double degree = 45; double radian = degree * M_PI / 180.0; // 初速 150 km/h -> 秒速に変換 double v = 150 * 1000 / 3600; // 水平方向の速度 double vx = v * cos(radian); // 鉛直方向の速度 double vy = v * sin(radian); double vy0 = vy; // 重力加速度 double g = 9.8; // 時間間隔(秒) double dt = 0.1; // 経過秒数 double t = 0.0; // 位置 double x = 0.0; double y = 0.0; // Euler法 for (int i = 1; y >= 0.0; i++) { // 経過秒数 t = i * dt; // 位置 y = y + dt * vy; x = x + dt * vx; // 経過秒数 cout << setw(8) << fixed << setprecision(5) << t << "\t"; // 位置 (Euler法) cout << setw(8) << fixed << setprecision(5) << x << "\t"; cout << setw(8) << fixed << setprecision(5) << y << "\t"; // 位置 (正解) cout << setw(8) << fixed << setprecision(5) << vx * t << "\t"; cout << setw(8) << fixed << setprecision(5) << vy0 * t - (g * t * t) / 2 << endl; // 鉛直方向の速度 vy = vy - (dt * g); } return 0; }
0.10000 2.89914 2.89914 2.89914 2.85014 0.20000 5.79828 5.70028 5.79828 5.60228 0.30000 8.69741 8.40341 8.69741 8.25641 0.40000 11.59655 11.00855 11.59655 10.81255 0.50000 14.49569 13.51569 14.49569 13.27069 0.60000 17.39483 15.92483 17.39483 15.63083 0.70000 20.29396 18.23596 20.29396 17.89296 0.80000 23.19310 20.44910 23.19310 20.05710 0.90000 26.09224 22.56424 26.09224 22.12324 1.00000 28.99138 24.58138 28.99138 24.09138 1.10000 31.89052 26.50052 31.89052 25.96152 1.20000 34.78965 28.32165 34.78965 27.73365 1.30000 37.68879 30.04479 37.68879 29.40779 1.40000 40.58793 31.66993 40.58793 30.98393 1.50000 43.48707 33.19707 43.48707 32.46207 1.60000 46.38620 34.62620 46.38620 33.84220 1.70000 49.28534 35.95734 49.28534 35.12434 1.80000 52.18448 37.19048 52.18448 36.30848 1.90000 55.08362 38.32562 55.08362 37.39462 2.00000 57.98276 39.36276 57.98276 38.38276 2.10000 60.88189 40.30189 60.88189 39.27289 2.20000 63.78103 41.14303 63.78103 40.06503 2.30000 66.68017 41.88617 66.68017 40.75917 2.40000 69.57931 42.53131 69.57931 41.35531 2.50000 72.47845 43.07845 72.47845 41.85345 2.60000 75.37758 43.52758 75.37758 42.25358 2.70000 78.27672 43.87872 78.27672 42.55572 2.80000 81.17586 44.13186 81.17586 42.75986 2.90000 84.07500 44.28700 84.07500 42.86600 3.00000 86.97413 44.34413 86.97413 42.87413 3.10000 89.87327 44.30327 89.87327 42.78427 3.20000 92.77241 44.16441 92.77241 42.59641 3.30000 95.67155 43.92755 95.67155 42.31055 3.40000 98.57069 43.59269 98.57069 41.92669 3.50000 101.46982 43.15982 101.46982 41.44482 3.60000 104.36896 42.62896 104.36896 40.86496 3.70000 107.26810 42.00010 107.26810 40.18710 3.80000 110.16724 41.27324 110.16724 39.41124 3.90000 113.06637 40.44837 113.06637 38.53737 4.00000 115.96551 39.52551 115.96551 37.56551 4.10000 118.86465 38.50465 118.86465 36.49565 4.20000 121.76379 37.38579 121.76379 35.32779 4.30000 124.66293 36.16893 124.66293 34.06193 4.40000 127.56206 34.85406 127.56206 32.69806 4.50000 130.46120 33.44120 130.46120 31.23620 4.60000 133.36034 31.93034 133.36034 29.67634 4.70000 136.25948 30.32148 136.25948 28.01848 4.80000 139.15861 28.61461 139.15861 26.26261 4.90000 142.05775 26.80975 142.05775 24.40875 5.00000 144.95689 24.90689 144.95689 22.45689 5.10000 147.85603 22.90603 147.85603 20.40703 5.20000 150.75517 20.80717 150.75517 18.25917 5.30000 153.65430 18.61030 153.65430 16.01330 5.40000 156.55344 16.31544 156.55344 13.66944 5.50000 159.45258 13.92258 159.45258 11.22758 5.60000 162.35172 11.43172 162.35172 8.68772 5.70000 165.25085 8.84285 165.25085 6.04985 5.80000 168.14999 6.15599 168.14999 3.31399 5.90000 171.04913 3.37113 171.04913 0.48013 6.00000 173.94827 0.48827 173.94827 -2.45173 6.10000 176.84741 -2.49259 176.84741 -5.48159
参考文献