0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

野球における打球の軌跡

0
Last updated at Posted at 2025-12-20
課題

image.png

コード
#include <stdio.h>
#include <stdlib.h>
#include <math.h>

double g = 9.8;
double k = 0.008;

double a_x(double vx, double vy) {
    return -k * sqrt(vx * vx + vy * vy) * vx;
}

double a_y(double vx, double vy) {
    return -g - k * sqrt(vx * vx + vy * vy) * vy;
}

void sim(double degree, double v0, double dt, int n_steps,
         double* out_v, double* out_d, double* out_radian)
{
    double radian = degree * M_PI / 180.0;

    double vx0 = v0 * cos(radian);
    double vy0 = v0 * sin(radian);

    double* vx = (double*)malloc(sizeof(double) * n_steps);
    double* vy = (double*)malloc(sizeof(double) * n_steps);
    double* dx = (double*)malloc(sizeof(double) * n_steps);
    double* dy = (double*)malloc(sizeof(double) * n_steps);

    vx[0] = vx0;
    vy[0] = vy0;
    dx[0] = 0.0;
    dy[0] = 0.0;

    int last = 0;

    for (int i = 1; i < n_steps; i++) {
        if (dy[i - 1] >= 0.0) {

            double k1_vx = a_x(vx[i - 1], vy[i - 1]) * dt;
            double k1_vy = a_y(vx[i - 1], vy[i - 1]) * dt;

            double k2_vx = a_x(vx[i - 1] + k1_vx / 2.0,
                               vy[i - 1] + k1_vy / 2.0) * dt;
            double k2_vy = a_y(vx[i - 1] + k1_vx / 2.0,
                               vy[i - 1] + k1_vy / 2.0) * dt;

            vx[i] = vx[i - 1] + k2_vx;
            vy[i] = vy[i - 1] + k2_vy;

            dx[i] = dx[i - 1] + vx[i - 1] * dt;
            dy[i] = dy[i - 1] + vy[i - 1] * dt;

            last = i;
        }
        else {
            break;
        }
    }

    *out_v = sqrt(vx[last] * vx[last] + vy[last] * vy[last]);
    *out_d = dx[last];
    *out_radian = radian;

    free(vx);
    free(vy);
    free(dx);
    free(dy);
}

int main() {
    double v0 = 55.0;
    double dt = 0.01;
    int n_steps = 1000;

    double degreeList[100];
    double distanceList[100];
    int idx = 0;

    for (int degree = 10; degree <= 90; degree += 5) {

        double v, d, radian;
        sim(degree, v0, dt, n_steps, &v, &d, &radian);

        printf("角度 %d 度  ラジアン %.5f\n", degree, radian);
        printf("最終速さ %.2f m/s\n", v);
        printf("飛距離 %.2f m\n\n", d);

        degreeList[idx] = degree;
        distanceList[idx] = d;
        idx++;
    }

    // 最大飛距離を探す
    double maxDist = distanceList[0];
    double bestDeg = degreeList[0];

    for (int i = 1; i < idx; i++) {
        if (distanceList[i] > maxDist) {
            maxDist = distanceList[i];
            bestDeg = degreeList[i];
        }
    }

    printf("最大飛距離 %.2f m は角度 %.2f 度で達成されます\n",
           maxDist, bestDeg);

    return 0;
}
実行結果
角度 10 度  ラジアン 0.17453
最終速さ 31.73 m/s
飛距離 70.56 m

角度 15 度  ラジアン 0.26180
最終速さ 27.87 m/s
飛距離 89.97 m

角度 20 度  ラジアン 0.34907
最終速さ 25.95 m/s
飛距離 103.86 m

角度 25 度  ラジアン 0.43633
最終速さ 25.16 m/s
飛距離 113.34 m

角度 30 度  ラジアン 0.52360
最終速さ 25.07 m/s
飛距離 119.44 m

角度 35 度  ラジアン 0.61087
最終速さ 25.37 m/s
飛距離 122.51 m

角度 40 度  ラジアン 0.69813
最終速さ 25.85 m/s
飛距離 122.66 m

角度 45 度  ラジアン 0.78540
最終速さ 26.43 m/s
飛距離 120.34 m

角度 50 度  ラジアン 0.87266
最終速さ 27.03 m/s
飛距離 115.55 m

角度 55 度  ラジアン 0.95993
最終速さ 27.60 m/s
飛距離 108.40 m

角度 60 度  ラジアン 1.04720
最終速さ 28.11 m/s
飛距離 98.97 m

角度 65 度  ラジアン 1.13446
最終速さ 28.57 m/s
飛距離 87.32 m

角度 70 度  ラジアン 1.22173
最終速さ 28.93 m/s
飛距離 73.49 m

角度 75 度  ラジアン 1.30900
最終速さ 29.22 m/s
飛距離 57.59 m

角度 80 度  ラジアン 1.39626
最終速さ 29.41 m/s
飛距離 39.78 m

角度 85 度  ラジアン 1.48353
最終速さ 29.54 m/s
飛距離 20.41 m

角度 90 度  ラジアン 1.57080
最終速さ 29.58 m/s
飛距離 0.00 m

最大飛距離 122.66 m は角度 40.00 度で達成されます
参考
ポータルサイト
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?