/*********************************************************************

    kinematics.c

                                      ミ サ イ ル の 運 動

                                 入力:半射程角、長径、離心率

                                 出力: 飛翔距離、平均速度、飛翔時間

                                                                            1999.08.09

                                                                            By T.Kubota

*********************************************************************/

#include <stdio.h>

#include <math.h>

#define PI 3.14159265358979

#define R 6378136                                 /* 地球赤道面平均半径(m) */

#define U (3.98602e+14)                          /* 地心引力係数 */

#define N 100                                       /* 降弧の分割数 */

int main(void) {

    double a;                                           /* 楕円軌道長径 */

    double e;                                          /* 楕円軌道の離心率 */

    double r;                                           /* 動径 */

    double v;                                          /* ミサイル速度(m/s) */

    double vm;                                       /* ミサイル平均速度(m/s) */

    double vs;                                        /* ミサイル速度の加算値 */

    double w;                                         /* 半射程角(rad) */

    double dw;                                       /* 分割半射程角 w/N */

    double rad;                                      /* 度→ラジアン変換係数 */

    double ds,dx,dy;                               /* 弾道経路の微少分 */

    double s;                                        /* 弾道距離(m) */

    double tf;                                       /* 飛翔時間(s) */

    int hh,mm;                                     /* 時 分 */

    double ss;                                     /* 秒 */

    double tmp1,tmp2;                         /* 作業用変数 */

    int i;

    rad=PI/180.0;

    printf("半射程角(°)、長径(km) 、離心率を入力して下さい。--->");

    scanf("%lf %lf %lf",&w,&a,&e);

    printf("半射程角 = %4.1lf(°)\n",w);

    printf("長  径 = %6.1lf(Km)\n",a);

    printf("離 心 率 = %6.4lf\n\n",e);

    w=w*rad;

    dw=w/N;

    a=a*1000;

    vs=0.0;

    ds=0.0;

    printf(" 角度  動径(km) 速度(m/s)\n");

    for (i=0;i<=N;i++){

        r=a*(1.0-e*e)/(1.0-e*cos(dw*i));

        v=sqrt(U*((2.0/r)-(1.0/a)));

        vs+=v;

            if(i==0){

                tmp1=r;

            }

            else{

                tmp2=r;

            }

            if(i>1){

                dx=tmp2*sin(dw);

                dy=tmp1-tmp2*cos(dw);

                ds+=sqrt(dx*dx+dy*dy);

                tmp1=tmp2;

            }

            if(i%10==0){                                 /* 100 分割中の 10 データを抽出表示する */

                printf(" %8.5lf %6.1lf %6.1lf\n",dw*i/rad,r/1000,v);

            }

    }

    s=ds*2.0;                                     /* 飛翔距離(昇弧+降弧) */

    vm=vs/(N+1);                               /* 平均速度 */

    tf=s/vm;                                     /* 飛翔時間(秒) */

    hh=(int)(tf/3600);                         /* 秒→時:分:秒 変換 */

    mm=(int)((tf-hh*3600)/60.0);

    ss=tf-hh*3600-mm*60;

    printf("\n 平均速度= %6.1lf (m/s)\n",vm);

    printf("\n 飛翔距離= %6.1lf (km)\n",s/1000);

    printf("\n 飛翔時間= %6.1lf (s) <%2d:%2d:%4.1lf>\n",tf,hh,mm,ss);

    getchar();getchar();

    return 0;

}

      2地点間の距離を求めるプログラムへ     弾道軌道を求めるプログラムへ

      プログラムの解説のページへ          このページの先頭へ