Last updated: 2016 -2014. Kajiyama                    [ 目次に戻る ]

極座標系を使い棒先についたボールを鉛直面上で回転運動させる--振り子運動


  1. 角運動で振り子シミュレーションの解説

    3章 振動(3.9),"The Nature of Cord 自然現象のシミュレーション入門",Daniel Shiffman,岡利崇訳,ボーンデジタル,p85-117, 2014.


  2. 復習: 鉛直面上での,棒先についたボールの等加速度円運動

    ・基本の運動として,鉛直面上の円周をまわり続ける「円運動」のシミュレーションを考える.

    (1) 水平面上で円周をまわり続ける「円運動」と同じと考える.

      重力や支点の摩擦と空気抵抗により減速するがここでは無視する.

    (2) ここでは,重力の影響を考慮し,角度の基準は鉛直軸,重力方向を新基準軸とする.

      ボールの最初の位置は,水平線上,右にある.angle = -PI/2

    (3) 角速度(angular_velocitiy)と角加速度(angular_acceleration)の関係

      現在の角速度ω = 以前の角速度ω + 現在の角加速度α

      angular_velocity = angular_velocity + angular_acceleration;

    (4) 回転角度(angular_position)と角速度(angular_velocitiy)の関係

      現在の角度θ = 以前の角度θ + 現在の角速度ω

      angle = angle + angular_velocity;



    鉛直面での回転運動を考える

    ・次のソースファイルをコピーして,Processing開発環境のエディタ領域に貼り付ける.

    ソースファイル
    // 鉛直面上での等加速度円運動(1ピクセル = 1m,1フレーム 1/60秒) int length;// 棒の長さ,回転半径 float angle = -PI/2;// 新基準軸でのスタートの回転角,角度はラジアン float angular_velocity = 0.0/60;// 角速度 float angular_acceleration = 0.012/60;// 角加速度 void setup() { size(500, 500);//キャンバスのサイズは500mX500mを想像してください? length = width*2/5;// 棒の長さ,回転半径 } void draw() { background(255);//フレーム毎に,白く塗り以前の描画を消す stroke(255,0,0);//軸の線色を赤 line(0, height/2, width, height/2);//水平軸 line(width/2, 0, width/2, height);//鉛直軸 translate(width/2, height/2);// 座標軸の原点(0,0)を移動 rotate(angle+PI/2);// 以下の図形を原点を中心に回転 stroke(0); strokeWeight(2);//線の太さをピクセル単位で line(0, 0, length, 0);// 棒先の形状 fill(255,0,0); ellipse(length, 0, 20, 20);// ボールの形状 angular_velocity = angular_velocity + angular_acceleration; angle = angle + angular_velocity; //save("polar_coordinates01c-1.jpg");// 実行結果を画像で保存 //saveFrame("polar_coordinates01c-###.tif");// 連続画像で保存 }
    実行結果


  3. 大車輪--重力による円運動---ボールに重力による角加速度を加える

    (1) 先述の角加速度の代わりに,重力による角加速度を与える.

      重力gの接線方向の力 F = 重力 * sin (θ) が常にボールPに加わる.

      角加速度は重力に比例し回転半径に反比例する.

      支点の摩擦と空気抵抗による減速は無視する.

      重力による角加速度 = -重力 * sin(θ) /回転半径

      角加速度α = -9.8*sin(angle)/length

    (2) 角速度ω = 角速度ω + 角加速度α

    (3) 角度θ = 角度θ + 角速度ω

    (4) やや頂点の位置でボールを手放す.角度 angle = PI+0.001



    接線方向の力 Fを取り出す.

    F = 重力 * sin (θ)


    角速度は重力に比例し,

    回転半径に反比例する.

    ・次のソースファイルをコピーして,Processing開発環境のエディタ領域に貼り付ける.

    ソースファイル
    // 鉛直面上での重力による角加速度円運動 // (1ピクセル = 1m,1フレーム1/60秒) int length;// 棒の長さ,回転半径 float angle = PI+0.001;// 新基準軸でのスタートの回転角,ラジアン float angular_velocity = 0.0/60;// 角速度 float angular_acceleration;// 重力による角加速度 void setup() { size(500, 500); length = width*2/5;// 棒の長さ,回転半径 } void draw() { background(255);//フレーム毎に,白く塗り以前の描画を消す stroke(255,0,0);//軸の線色を赤 line(0, height/2, width, height/2);//水平軸 line(width/2, 0, width/2, height);//鉛直軸 angular_acceleration = -9.8/60*sin(angle)/length;//重力の角加速度 translate(width/2, height/2);// 座標軸の原点(0,0)を移動 rotate(angle+PI/2);// 以下の図形を原点を中心に回転 stroke(0); strokeWeight(2);//線の太さをピクセル単位で line(0, 0, length, 0);// 棒の形状 fill(255,0,0); ellipse(length, 0, 20, 20);// ボールの形状 angular_velocity = angular_velocity + angular_acceleration; angle = angle + angular_velocity; //save("polar_coordinates01c-2.jpg");// 実行結果を画像で保存 //saveFrame("polar_coordinates01c-###.tif");// 連続画像で保存 }
    実行結果


  4. 重力による振り子運動---水平位置からボールを離す・ボールには重力による角加速度を加える

    先述の頂点の位置と異なり水平位置からボールを離すとどうなるか.角度 angle = -PI/2,1ピクセル = 1m,1フレーム = 1/60秒とする.

    (1) 重力と角加速度(angular_acceleration)の関係

      ・重力による角加速度α = 重力 * sin(θ)/回転半径 α = -9.8*sin(angle)/length

    (2) 角速度(angular_velocitiy)と角加速度(angular_acceleration)の関係

      ・角速度ω = 角速度ω + 角加速度α

    (3) 回転角度(angular_position)と角速度(angular_velocitiy)の関係

      ・角度θ = 角度θ + 角速度ω


    ・次のソースファイルをコピーして,Processing開発環境のエディタ領域に貼り付ける.

    ソースファイル
    // 鉛直面上での重力による角加速度 振り子永久運動 //((1ピクセル = 1m,1フレーム 1/60秒) int length;// 棒の長さ,回転半径 float angle = -PI/2;// 新基準軸でのスタートの回転角,ラジアン float angular_velocity = 0.0/60;// 角速度 float angular_acceleration;// 重力による角加速度 void setup() { size(500, 500); length = width*2/5;// 棒の長さ,回転半径 } void draw() { background(255);//フレーム毎に,白く塗り以前の描画を消す angular_acceleration = -9.8/60*sin(angle)/length;//重力の角加速度 stroke(255,0,0);//軸の線色を赤 line(0, height/2, width, height/2);//水平軸 line(width/2, 0, width/2, height);//鉛直軸 translate(width/2, height/2);// 座標軸の原点(0,0)を移動 rotate(angle+PI/2);// 以下の図形を原点を中心に回転 stroke(0); strokeWeight(2);//線の太さをピクセル単位で line(0, 0, length, 0);// 棒の形状 fill(255,0,0); ellipse(length, 0, 20, 20);// ボールの形状 angular_velocity = angular_velocity + angular_acceleration; angle = angle + angular_velocity; //save("polar_coordinates01c-3.jpg");// 実行結果を画像で保存 //saveFrame("polar_coordinates01c-###.tif");// 連続画像で保存 }
    実行結果


  5. 減衰する振り子運動---減衰係数を用いる

    先述の振り子運動に,支点の摩擦と空気抵抗を考慮し,振り子運動を減速する.1ピクセル = 1m,1フレーム = 1/60秒とする.

    (1) 重力と角加速度(angular_acceleration)の関係

      ・重力による角加速度α = 重力 * sin(θ)/回転半径 α = -9.8*sin(angle)/length

    (2) 角速度(angular_velocitiy)と角加速度(angular_acceleration)の関係

      ・角速度ω = 角速度ω + 角加速度α

    (3) 角速度(angular_velocitiy)と減衰係数の関係

      ・角速度ω = 角速度ω * (支点の摩擦と空気抵抗による)減衰係数d

    (4) 回転角度(angular_position)と角速度(angular_velocitiy)の関係

      ・角度θ = 角度θ + 角速度ω



    ・次のソースファイルをコピーして,Processing開発環境のエディタ領域に貼り付ける.

    ソースファイル
    // 鉛直面上での重力による角加速度 振り子減衰運動 //(1ピクセル = 1m,1フレーム 1/60秒) int length;// 棒の長さ,回転半径 float angle = -PI/2;// 新基準軸でのスタートの回転角,ラジアン float angular_velocity = 0.0/60;// 角速度 float angular_acceleration;// 重力による角加速度 float damping_coefficient = 0.995;//減衰係数 void setup() { size(500, 500); length = width*2/5;// 棒の長さ,回転半径 } void draw() { background(255);//フレーム毎に,白く塗り以前の描画を消す angular_acceleration = -9.8/60*sin(angle)/length;//重力の角加速度 stroke(255,0,0);//軸の線色を赤 line(0, height/2, width, height/2);//水平軸 line(width/2, 0, width/2, height);//鉛直軸 translate(width/2, height/2);// 座標軸の原点(0,0)を移動 rotate(angle+PI/2);// 以下の図形を原点を中心に回転 stroke(0); strokeWeight(2);//線の太さをピクセル単位で line(0, 0, length, 0);// 棒の形状 fill(255,0,0); ellipse(length, 0, 20, 20);// ボールの形状 angular_velocity = angular_velocity + angular_acceleration; angular_velocity = angular_velocity * damping_coefficient;//減衰 angle = angle + angular_velocity; //save("polar_coordinates01c-4.jpg");// 実行結果を画像で保存 //saveFrame("polar_coordinates01c-###.tif");// 連続画像で保存 }
    実行結果

[ 目次に戻る ]