HOME > natural science Laboratory > コンピュータ・シミュレーション講座 > 仮想物理実験室

VisualC++ と OpenGL を利用した仮想物理実験室
【2-7-1】重力+空気抵抗力による斜方投射運動のシミュレーション

文責:遠藤 理平 (2010年8月29日) カテゴリ:仮想物理実験室(277)

【2-6】重力+空気抵抗力による運動:自由落下運動と同様に、【2-6-1】重力+空気抵抗力による運動の運動方程式とアルゴリズムにて導出した重力と空気抵抗力がある場合の運動方程式と、コンピュータでシミュレーションを行うためのアルゴリズムを用います。 本節では、重力+空気抵抗力がある場合の斜方投射運動のシミュレーションを行ないます。 【2-5】重力による運動:斜方投射運動2と同様に初速度を三角関数を用いて斜めに打ち上げます。

重力+空気抵抗力による運動のための計算アルゴリズム

速度・位置を逐次計算するアルゴリズム

//位置の計算
x  = x  + vx * dt; 
y  = y  + vy * dt; 
z  = z  + vz * dt; 
//速度の計算
vx = vx + ax * dt; 
vy = vy + ay * dt; 
vz = vz + az * dt; 
//加速度の計算
ax = -k/m * vx;    //<-----空気抵抗力からの寄与
ay = -k/m * vy;    //<-----空気抵抗力からの寄与
az = -g -k/m * vy; //<-----重力+空気抵抗力からの寄与

【9.1日目】重力による運動:斜方投射運動2の場合と比較して、質量m[kg]と空気抵抗係数 k[kg/s]が加えられています。

重力+空気抵抗力による斜方投射運動のシミュレーション

質量を 0.1[kg]から 1.0[kg]まで変化させた10個のボールを、 初速度 70[m/s]、角度60°で打ち上げたシミュレーションを行ないます。 軽いほど空気抵抗力の影響で、x軸方向の速度は 0[m/s]となることが確認できます。

VisualC++ + OpenGL プログラミング

【11日目】重力+空気抵抗力による運動:自由落下運動と同様に「【0日目】仮想物理実験室の構築 (ver1.0)」をベースにプログラミングします。上記で解説した逐次計算を行うアルゴリズムをプログラミングします。

仮想物理実験室変数の定義

//--------------------------------------------------------
// 仮想物理実験室変数の定義
//--------------------------------------------------------
double t = 0.0;     //時刻
double dt= 0.03;    //時間刻み
int tn = 0;         //ステップ数
double g = 9.80665; //重力加速度 g
double k = 10.0;    //空気抵抗の比例定数
double degree;      //角度:度(°)
double radian;      //角度:ラジアン(rad)
double v0=70.0;     //初速度

// ボールの定義
struct BALL {
  double m;          //質量
  double x, y, z;
  double vx, vy, vz;
  double ax, ay, az;
};
const int N = 10;
BALL ball[N];
void SetUp(void){
  for(int i=0; i<N; i++ ){
    degree = 60.0;                    //度数法で表現
    radian = 2.0 * PI * degree/360.0; //弧度法への変換
    ball[i].m = 0.1*double(i+1);      //質量の設定
    ball[i].x  = -50.0;
    ball[i].y  = 0.0;
    ball[i].z  = 0.0;
    ball[i].vx = v0 * cos(radian);
    ball[i].vy = 0.0;
    ball[i].vz = v0 * sin(radian);
    ball[i].ax = 0.0;
    ball[i].ay = 0.0;
    ball[i].az = -g;
  }
}

ボールの位置「x,y,z」、速度「vx,vy,vz」、加速度「ax,ay,az」に加えて、 質量 m[kg]も構造体「BALL」のメンバとします。「BALL」型の変数「ball1」を宣言と同時に初期値を設定しています。

速度・位置を逐次計算するアルゴリズム

//--------------------------------------------------------
// 計算と物体の描画
//--------------------------------------------------------
void Calculate(){
  t = dt * double(tn);
  for(int i=0; i<N; i++){
    //位置の算出
    ball[i].x = ball[i].x + ball[i].vx * dt;
    ball[i].y = ball[i].y + ball[i].vy * dt;
    ball[i].z = ball[i].z + ball[i].vz * dt;
    //速度の算出
    ball[i].vx = ball[i].vx + ball[i].ax * dt;
    ball[i].vy = ball[i].vy + ball[i].ay * dt;
    ball[i].vz = ball[i].vz + ball[i].az * dt;
    //加速度の算出
    ball[i].ax =    - k/ball[i].m * ball[i].vx * dt;
    ball[i].ay =    - k/ball[i].m * ball[i].vy * dt;
    ball[i].az = -g - k/ball[i].m * ball[i].vz * dt;
  }
 tn++;
}
void DrawStructure(){
  glPushMatrix();
    glMaterialfv(GL_FRONT, GL_AMBIENT, ms_ruby.ambient);
    glMaterialfv(GL_FRONT, GL_DIFFUSE, ms_ruby.diffuse);
    glMaterialfv(GL_FRONT, GL_SPECULAR, ms_ruby.specular);
    glMaterialfv(GL_FRONT, GL_SHININESS, &ms_ruby.shininess);
    glTranslated(ball1.x, ball1.y, ball1.z); //平行移動値の設定
    glutSolidSphere(4.0, 20, 20);            //引数:(半径, Z軸まわりの分割数, Z軸に沿った分割数)
  glPopMatrix();
}

位置「ball1.x」「ball1.y」「ball1.z」
速度「ball1.vx」「ball1.vy」「ball1.vz」
加速度「ball1.ax」「ball1.ay」「ball1.az」
を逐次計算します。

VisualC++ と OpenGL を利用した仮想物理実験室

第0章 仮想物理実験室の構築

第1章 様々な運動

第2章 ニュートンの運動方程式

第3章 剛体の運動(エネルギー保存則と運動量保存則)

付録

  • 【A-1】参考文献
    ・(A-1-1)OpenGL について
    ・(A-1-2)VisualC++ について
    ・(A-1-3)物理シミュレーション
    ・(A-1-4)数値計算

未分類

力学

量子力学

波動論



▲このページのトップNPO法人 natural science トップ

関連記事

仮想物理実験室







▲このページのトップNPO法人 natural science トップ