Last updated: 2015 -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 = kg/秒2 )のバネを水平方向に x 伸ばすあるいは縮めると,ボールは水平に単振動をする.

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

      実際には空気抵抗や摩擦抵抗がありこれら抵抗力により減速が生じるがここでは無視する.


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

      (1) バネの伸びが x(m) の時,それによってバネに生じる力 F は,

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

      (2) ボールにバネによる力 F を加えると加速度が生じる.(運動の第2法則)

      力 = 質量 X 加速度 なので 加速度 = 力/質量 (m/s2 )

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

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

      水平方向のバネによる加速度ベクトル acceleration.x = -K * x (m/s2 )

      X軸の右向きを+とする.


    3. 抵抗力による減速を考えないバネ運動のプログラミング

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

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

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

       acceleration.x = -K * extension.x

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


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

       velocitiy.add(acceleration); ,//velocitiy.x = velocitiy.x + acceleration.x

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

       position.add(velocitiy); ,//position.x = position.x + velocitiy.x


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

      ソースファイル
      //水平バネ振り子--減衰はない(1フレーム 1秒) PVector position; //位置変数のベクトル宣言 position.x; position.y; PVector velocitiy; //速度変数のベクトル宣言 velocitiy.x; velocitiy.y; PVector acceleration; //加速度変数のベクトル宣言 acceleration.x; acceleration.y; float K = 0.05; //バネ定数 PVector length; //バネの自然長の宣言length.x;length.y; PVector extension; //バネの伸びた長さの宣言extension.x;extension.y; void setup(){ size(500, 200);//キャンバスのサイズは500mX200mを想像してください? length = new PVector(width/2, 0.0);//バネの自然長(x,y)の定義 //初期の引っ張ったバネの伸び(x,y) extension = new PVector(150.0, 0.0);//初期のバネの伸び //初期のボールの位置 position = new PVector(width/2+extension.x,height/2+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.x = -K/60 * extension.x; //水平バネに加わる加速度 velocitiy.add(acceleration); position.add(velocitiy); //基準線を描く strokeWeight(1);//線の太さを1ピクセルに stroke(255,0,0);//線色を赤 line(width/2, 0, width/2, height);// Y軸 line(0, height/2, width, height/2);// X軸 //バネを描く strokeWeight(20);//線の太さを20ピクセルに stroke (100);//線色をグレー line(0, position.y, position.x, position.y);//バネ //ボールを描く strokeWeight(1);//線の太さを1ピクセルに fill(255,0,0);//面色を赤 ellipse(position.x, position.y, 20, 20);//円 //saveFrame ("spring-h1-###.tif");// 連続画像で保存 }
      実行結果



  3. バネ運動に抵抗力による減速を取り入れた水平バネ振り子

    1. 抵抗力(空気抵抗や摩擦抵抗)による減速を考えたバネ運動のプログラミング

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

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

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

       acceleration.x = -K * extension.x

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


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

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

       現在の速度 = 以前の速度 * 減速率   velocitiy.x = velocitiy.x * deceleration;


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


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

      ソースファイル
      //水平バネ振り子--抵抗力による減衰(1フレーム 1秒) 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(500, 200); length = new PVector(width/2, 0.0);//バネの自然長(x,y)の定義 //初期の引っ張ったバネの伸び(x,y) extension = new PVector(150.0, 0.0);//初期のバネの伸び //初期のボールの位置 position = new PVector(width/2+extension.x,height/2+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); acceleration.x = -K/60 * extension.x; //水平バネに加わる加速度 velocitiy.add(acceleration); //減速 velocitiy.x = velocitiy.x * deceleration; position.add(velocitiy);// //基準線を描く strokeWeight(1);//線の太さを1ピクセルに stroke(255,0,0);//線色を赤 line(width/2, 0, width/2, height);// Y軸 line(0, height/2, width, height/2);// X軸 //バネを描く strokeWeight(20);//線の太さを20ピクセルに stroke (100);//線色をグレー line(0, position.y, position.x, position.y);//バネ //ボールを描く strokeWeight(1);//線の太さを1ピクセルに fill(255,0,0);//面色を赤 ellipse(position.x, position.y, 20, 20);//円 //saveFrame ("spring-h2-###.tif");// 連続画像で保存 }
      実行結果

[ 目次に戻る ]