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

鉛直バネ振り子--バネの運動


  1. Processing はベクトルをバネ運動に利用する

    1. Processing ではPVector がベクトルで position(位置),velocitiy(速度),acceleration(加速度), 減速率(deceleration)を表す

      ・復習 ばねとは -wikipedia  ・ ばね振り子

      ・高校の復習 速さ(スカラー)と速度(ベクトル)

      ・高校の復習 等速直線運動  ・ 等加速度直線運動

      ・リファレンス ベクトルのクラス
      PVector クラスの機能ベクトルの計算メソッドを準備している
      ユークリッド幾何のベクトル
      ベクトルx成分:
      ベクトルy成分:
      PVector 変数名;
       変数名.x
       変数名.y
      ベクトル足し算add();
      ベクトル引き算sub();
      ベクトルをスカラー倍mult();
      ベクトルをスカラーで割るdiv();
    2. 運動シミュレーションの解説

      ボールに力を加えない限り,ボールは静止状態を続け、動いているボールは等速直線運動を続ける.(運動の第1法則)

      ボールの質量 M (kg)に力 F (N = kg・m/秒2 )を加えると加速度 a (m/秒2 )が生じる.(運動の第2法則) F = M * a , a = F/M

      1章 ベクトル,"The Nature of Cord 自然現象のシミュレーション入門",Daniel Shiffman,岡利崇訳,ボーンデジタル,p23-52, 2014.

      2章 力,"The Nature of Cord 自然現象のシミュレーション入門",Daniel Shiffman,岡利崇訳,ボーンデジタル,p53-84, 2014.

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


  2. バネ運動に重力加速度を考えない鉛直バネ振り子

    1. ボールの速度と鉛直位置の変化--重力加速度を考えない

      一端を固定したバネの先端にボール(質量 M )が付き,鉛直につるされている.バネの質量は無視できる.

      バネ定数K (N/m)のバネを鉛直方向に x 伸ばすあるいは縮めると,バネの力によりボールは上下に単振動をする.

      この「鉛直ばね振り子」のシミュレーションを考える.

      ・最初に,バネの力による速度の変化と,空気抵抗や摩擦抵抗がありこれら抵抗力により速度の減少を考える.

       ここでは重力加速度による速度の変化は考えない.

      ・これは,先述した「水平振り子のバネ運動」を鉛直方向に置き換えたシミュレーションである.


    2. 復習 フックの法則  As extension, so is force.

      バネの伸びが x(m) の時,それによってバネに生じる力 F (N = kg・m/秒2 ) は,

      F = -K * xであり,これがボールの質量 M (kg)に働く.

      ボールの加速度をa (m/秒2 )とすると,F = M * a, M * a = -K*x,  a = -K/M * x

      ボールの質量 M = 1(kg)とし,ばねを x(m) 引っ張って離した時の

      鉛直方向のバネによる加速度ベクトル acceleration = -K * x Y軸下向きを+とする.

      鉛直方向の重力加速度ベクトルはないものとする.

    3. 重力加速度を考えないバネ運動のプログラミング

      Processingのフレームが変わるたびに,鉛直に伸びたバネの長さが変わるので,質量 M = 1(kg)のボールに働く加速度が変わる.

      1ピクセル = 1m,1フレーム = 1/60 秒とすると,

      (1) バネの伸び(extension)の変化によりボールに加わる加速度(acceleration) = -K * extension

       acceleration.y = -K * extension.y

       1/60秒間隔の1フレームで考えると,換算して  acceleration.y = -K/60 * extension.y

      (2) 1/60 秒後の現在の速度=以前の速度+加速度

       velocitiy.add(acceleration); ,velocitiy.y = velocitiy.y +acceleration.y

      (3) さらに,空気抵抗や摩擦による抵抗を考え速度を減衰する.減速率 decelerationを設定する.

       現在の速度=以前の速度 * 減速率

       velocitiy.y = velocitiy.y * deceleration;

      (4) 1/60 秒後の現在のフレームの位置=以前の位置+速度

       position.add(velocitiy); ,position.y = position.y + velocitiy.y


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

      ソースファイル
      //鉛直バネ振り子 重力加速度を考えない(1フレーム 1/60 秒) PVector position; //位置変数のベクトル宣言 position.x; position.y; PVector velocitiy; //速度変数のベクトル宣言 velocitiy.x; velocitiy.y; PVector acceleration; //加速度変数のベクトル宣言 acceleration.x; acceleration.y; float K = 0.05;//バネ定数 float deceleration = 0.995;//減速率 PVector length; //バネの自然長の宣言length.x;length.y; PVector extension; //バネの伸びた長さの宣言extension.x;extension.y; void setup(){ size(200, 500); length = new PVector(0, height/3);//バネの自然長(x,y)の定義 //初期の引っ張ったバネの伸び(x,y) extension = new PVector(0, 150); //初期のボールの位置 position = new PVector(width/2,length.y+extension.y); //初期の速度(x,y) 加速度(x,y)の定義 velocitiy = new PVector(0.0/60, 0.0/60); acceleration = new PVector(0.0/60, 0.0/60); } void draw(){ background(255);//画面を白く塗りバネの軌跡を消す //ボールの位置 extension = new PVector(position.x-length.x, position.y-length.y); acceleration.y = -K/60 * extension.y; //鉛直バネに加わる加速度 velocitiy.add(acceleration); velocitiy.y = velocitiy.y * deceleration; //減速 position.add(velocitiy);// //基準線を描く strokeWeight(1);//線の太さを1ピクセルに stroke(255,0,0);//線色を赤 line(width/2, 0, width/2, height);// Y軸 line(0, length.y, width, length.y);// X軸 //バネを描く strokeWeight(20);//線の太さを20ピクセルに stroke (100);//線色をグレー line(position.x, 0, position.x, position.y);// バネ //円を描く strokeWeight(1);//線の太さを1ピクセルに fill(255,0,0);//面色を赤 ellipse(position.x, position.y, 20, 20);// 円 //saveFrame("spring-v1-###.tif");// 連続画像で保存 }
      実行結果



  3. バネ運動に重力加速度を取り入れた鉛直バネ振り子

    1. ボールの速度と鉛直位置 の変化--重力加速度を考慮に入れる

      ここでは重力加速度による速度の変化も考慮する.重力加速度はgravity = 9.8 (m/秒2 )である.

      (1) バネをつけて鉛直に垂らした時のバネの長さを自然長とする.ただしバネには質量はない.

      (2) バネに質量 M (kg) のボールを付ける.ボールの重さによりバネが自然長よりxg (m)伸びる.

       このボールの重さにより釣り合った位置(自然長 + xg)を新たな基準点とする.

       重力によるバネの伸びによる力 Fg (N = kg・m/秒2 )は,

       フックの法則により,Fg = M*gravity, M*gravity = K*xg, xg = (M*gravity)/K

      (3) バネを x (m) 引っ張って離した時の,バネに生じる力 F (N = kg・m/秒2 ) は,F = -K * xである.

      (4) ボールにはF と Fg の二つの上向きのバネによる力が働いている.

       F + Fg = (-K*xg) + (-K * x) = -K (xg + x)

       さらに,ボールには重力 M*gravity が常に下向きの力として働いている.

      (5) これら,上向きと下向きの合力は Fspring = M*gravity -( F + Fg ) = K*xg - K (xg + x) = -K*x

       バネの振動には,重力加速度の影響はないことがわかる.




    2. 重力加速度を取り入れたバネ運動のプログラミング

      Processingのフレームが変わるたびに,鉛直に伸びたバネの長さが変わるので,質量 M = 1(kg)のボールに働く加速度が変わる.

      1ピクセル = 1m,1フレーム = 1/60 秒とすると,

      (1) バネの伸び(extension)の変化によりボールに加わる加速度(acceleration) = -K * extension

       1/60秒間の1フレームで考えると,換算して  acceleration.y = -K/60 * extension.y


      (2) 1/60 秒後の現在の速度=以前の速度+加速度

       velocitiy.add(acceleration); ,velocitiy.y = velocitiy.y +acceleration.y

      (3) さらに,空気抵抗や摩擦による抵抗を考え速度を減衰する.減速率 decelerationを設定する.

       現在の速度=以前の速度 * 減速率

       velocitiy.y = velocitiy.y * deceleration;

      (4) 1/60 秒後の現在のフレームの位置=以前の位置+速度

       position.add(velocitiy); ,position.y = position.y + velocitiy.y


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

      ソースファイル
      //鉛直バネ振り子 重力加速度を取り入れる(1フレーム 1/60 秒) PVector position; //位置変数のベクトル宣言 position.x; position.y; PVector velocitiy; //速度変数のベクトル宣言 velocitiy.x; velocitiy.y; PVector acceleration; //加速度変数のベクトル宣言 acceleration.x; acceleration.y; float K = 0.05;//バネ定数 float deceleration = 0.995;//減速率 PVector length; //バネの自然長の宣言length.x;length.y; PVector extension; //バネの伸びた長さの宣言extension.x;extension.y; float gravity = 9.8;//重力加速度 float xg = gravity/K;//重力で伸びた長さ void setup(){ size(200, 500); length = new PVector(0, height/3);//バネの自然長(x,y)の定義 //初期の引っ張ったバネの伸び(x,y) extension = new PVector(0, 150); //初期のボールの位置(x,y) position = new PVector(width/2,length.y + xg + extension.y) ; //初期の速度(x,y) 加速度(x,y)の定義 velocitiy = new PVector(0.0, 0.0); acceleration = new PVector(0.0, 0.0); } void draw(){ background(255);//画面を白く塗りバネの軌跡を消す //ボールの位置 extension = new PVector(position.x-length.x, position.y - (length.y + xg ) ); acceleration.y = -K/60 * extension.y; //鉛直バネに加わる加速度 velocitiy.add(acceleration); velocitiy.y = velocitiy.y * deceleration; //減速 position.add(velocitiy);// //基準線を描く strokeWeight(1);//線の太さを1ピクセルに stroke(255,0,0);//線色を赤 line(width/2, 0, width/2, height);// Y軸 line(0, length.y, width, length.y);// X軸1 自然長 line(0, length.y+xg, width, length.y+xg);// X軸2 xg //バネを描く strokeWeight(20);//線の太さを20ピクセルに stroke (100);//線色をグレー line(position.x, 0, position.x, position.y);// バネ //円を描く strokeWeight(1);//線の太さを1ピクセルに fill(255,0,0);//面色を赤 ellipse(position.x, position.y, 20, 20);// 円 //saveFrame("spring-v2-###.tif");// 連続画像で保存 }
      実行結果

[ 目次に戻る ]