<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
    <title>NPO法人 natural science</title>
    <link rel="alternate" type="text/html" href="http://www.natural-science.or.jp/" />
    <link rel="self" type="application/atom+xml" href="http://www.natural-science.or.jp/atom.xml" />
    <id>tag:www.natural-science.or.jp,2008-09-17://12</id>
    <updated>2010-09-01T13:19:03Z</updated>
    
    <generator uri="http://www.sixapart.com/movabletype/">Movable Type 4.261</generator>

<entry>
    <title>【2010.09.01】複数のLED点灯回路を作ろう!!</title>
    <link rel="alternate" type="text/html" href="http://www.natural-science.or.jp/article/20100901221837.php" />
    <id>tag:www.natural-science.or.jp,2010://12.9850</id>

    <published>2010-09-01T13:18:37Z</published>
    <updated>2010-09-01T13:19:03Z</updated>

    <summary> 夏期講座で残光掲示板を完成させたO嶋くん(小学校6年生,ものづくり講座2ヶ月)...</summary>
    <author>
        <name>八重樫 和之</name>
        
    </author>
    
        <category term="基礎編" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="led" label="LED" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ja" xml:base="http://www.natural-science.or.jp/">
        <![CDATA[
<p>夏期講座で残光掲示板を完成させたO嶋くん(小学校6年生,ものづくり講座2ヶ月)。
今回は回路図について勉強しました。
回路図を読み、25個のLEDを点灯させる回路の配置を考えます。
基板の制約条件を考えながら、どうすればすべてのLEDが点灯できるかという問題です。
O嶋くんは並列回路・直列回路の違いを考えながら写真のようにすべてLEDを点灯させました。
次回からは、このLEDの点灯パターンをマイコンで制御するデジタル花火回路を制作していきましょう!</p>
<p><span class="mt-enclosure mt-enclosure-image" style="display: inline;"><img alt="yattemiyou_20100901.gif" src="http://www.natural-science.or.jp/images/yattemiyou_20100901.gif" width="307" height="435" class="mt-image-center" style="text-align: center; display: block; margin: 0 auto 20px;" /></span></p>]]>
        
    </content>
</entry>

<entry>
    <title>VisualC++ と OpenGL を利用した仮想物理実験室【2-10-2】ばね弾性力＋重力による単振動運動（３次元）のシミュレーション</title>
    <link rel="alternate" type="text/html" href="http://www.natural-science.or.jp/article/20100830174454.php" />
    <id>tag:www.natural-science.or.jp,2010://12.9848</id>

    <published>2010-08-30T08:44:54Z</published>
    <updated>2010-08-30T08:50:37Z</updated>

    <summary> （2-10-1）【2-10-1】ばね弾性力＋重力による運動の運動方程式（３次元...</summary>
    <author>
        <name>遠藤 理平</name>
        <uri>http://www.natural-science.or.jp/article/members/cat-12/</uri>
    </author>
    
        <category term="仮想物理実験室" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="３次元" label="３次元" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="シミュレーション" label="シミュレーション" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="ばね弾性力" label="ばね弾性力" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="単振動運動" label="単振動運動" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="重力" label="重力" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ja" xml:base="http://www.natural-science.or.jp/">
        <![CDATA[<p>
（2-10-1）<a href="http://www.natural-science.or.jp/article/20100830173838.php">【2-10-1】ばね弾性力＋重力による運動の運動方程式（３次元）とアルゴリズム</a>では、
ばねの変位が xyz平面内の場合で、<span style="font-weight:600">ばね弾性力</span>と<span style="font-weight:600">重力</span>がボールに作用する場合の運動方程式の導出と、コンピュータでシミュレーションを行うためのアルゴリズムの導出を行ないました。
t=t_n[s]のときの加速度 a_n[m/s^2]は、
</p>
<div class="waku">
<div style="float:right">(2.10.1)</div>
<img src="http://www.natural-science.or.jp/images/20100302-13.gif" alt="差分方程式" />
</div>
<p>
となり、そのときのボールの位置 r_n = (x_n, y_n, z_n) によって決まる値となります。
L_n は、原点からボールまでの距離、
</p>
<div class="waku">
<div style="float:right">(2.10.2)</div>
<img src="http://www.natural-science.or.jp/images/20100302-14.gif" alt="差分方程式" />
</div>
<p>
です。コンピュータシミュレーションでは、
初期条件として、l_0 = 20.0[m]とし、１０個のボールの質量 m [kg]を変化させて運動の違いを確認します。
</p>
<h2>ばね弾性力＋重力による運動のための計算アルゴリズム</h2>
<h4>支柱の位置とボールの位置・速度・加速度の初期値</h4>
<p>
ばね定数を k、自然長 L[m] のばねの片側を固定した動かない支柱を原点に置き、ばねの反対側をボールつけ、x-y 平面上に伸ばします。時刻 t=t_n[s] のときのボールの位置を r_n とします。
</p>
<pre>
k = 10.0;    //ばね定数
L = 30.0;    //ばねの自然長
r = 20.0;    //ボールの初期半径
g =9.8
ball_r = 4.0;//ボールの半径

//支柱の定義
poll_x = 0.0;
poll_y = 0.0;
poll_z = 60.0;
poll_r = 5.0;  //半径
poll_h = 20.0; //高さ
</pre>

<h4>速度・位置を逐次計算するアルゴリズム</h4>
<pre>
//位置の計算
x  = x  + vx * dt;
y  = y  + vy * dt;
z  = z  + vz * dt;

l = sqrt(pow(ball[i].x,2)+pow(ball[i].y,2)+pow(poll_z-ball[i].z,2)); //&lt;-----支柱からボールまでの距離

//加速度の計算
ax = - k/ball[i].m * (1.0 - L/l) * ball[i].x;    //&lt;-----ばね弾性力からの寄与
ay = - k/ball[i].m * (1.0 - L/l) * ball[i].y;    //&lt;-----ばね弾性力からの寄与
az = - k/ball[i].m * (1.0 - L/l) * (ball[i].z-poll_z) -g;
//速度の計算
vx = vx + ax * dt;
vy = vy + ay * dt;
vz = vz + az * dt;
</pre>
<p>
このアルゴリズムでは誤差が大きく、時間と共に、単振動の振幅が大きくなってしまいます。
アルゴリズムの改善は、次に行ないます。
</p>


<h2>ばね弾性力による単振動のシミュレーション</h2>
<p>
動かない支柱にばねで繋がったボールが運動するシミュレーションです。運動は、ばね弾性力と重力による運動となります。
</p>
<div style="text-align:center">
<object width="425" height="344"><param name="movie" value="http://www.youtube.com/v/p7AvfRVd9kw&hl=ja&fs=1"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/p7AvfRVd9kw&hl=ja&fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"></embed></object>
</div>

<h2>VisualC++ ＋ OpenGL プログラミング</h2>
<p>
「<a href="http://www.natural-science.or.jp/article/20100315220132.php">【0.2日目】仮想物理実験室の構築 （ver1.1）</a>」をベースにプログラミングします。上記で解説した逐次計算を行うアルゴリズムをプログラミングします。
</p>
<h3>ばねの定義</h3>
<p>
ばねの定義については、<a href="http://www.natural-science.or.jp/article/20100830000939.php">ばね弾性力による運動の運動方程式（１次元）とアルゴリズム</a>をご覧下さい。
</p>
<h3>仮想物理実験室変数の定義</h3>
<pre>
//////////////////////////////////////////////////////////////////////////
// 変数の定義
//////////////////////////////////////////////////////////////////////////
#define _BITMAP 0 //アニメーション作成用ビットマップの保存 0:しない　1:する
ofstream ofs1( &quot;ball1.data&quot; );
//--------------------------------------------------------
// 仮想物理実験室変数の定義
//--------------------------------------------------------
double t = 0.0;     //時刻
double dt= 0.05;    //時間刻み
int tn = 0;         //ステップ数
double k = 10.0;    //ばね定数
double L = 30.0;    //ばねの自然長
double l = 20.0;    //ばねの初期長
double g =9.8;      //重力加速度
double radian, radian_phi, radian_theta; 
double theta;

//支柱の定義
double poll_x = 0.0;
double poll_y = 0.0;
double poll_z = 60.0;
double poll_r = 5.0;  //半径
double poll_h = 20.0; //高さ

// ボールの定義
double ball_r = 4.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&lt;N; i++ ){
    radian = 2.0 * PI * double(i)/double(N);
    ball[i].m  = 2.0*double(i+1)/double(N); //ボールの質量
    ball[i].x  = l * cos(radian);
    ball[i].y  = l * sin(radian);
    ball[i].z  = poll_z; //ボールがめり込まないように
    ball[i].vx = 0.0;
    ball[i].vy = 0.0;
    ball[i].vz = 0.0;
    ball[i].ax = 0.0;
    ball[i].ay = 0.0;
    ball[i].az = 0.0;
  }
}
</pre>
<p>
ボールの位置「x,y,z」、速度「vx,vy,vz」、加速度「ax,ay,az」を
構造体「BALL」のメンバとします。「BALL」型の変数「ball1」を宣言と同時に初期値を設定しています。
</p>
<h3>速度・位置を逐次計算するアルゴリズム</h3>
<pre>
//--------------------------------------------------------
// 計算と物体の描画
//--------------------------------------------------------
void Calculate(){
  t = dt * double(tn);
  //ofs1 &lt;&lt; dt*tn &lt;&lt; &quot; &quot; &lt;&lt; ball1.x &lt;&lt; &quot; &quot; &lt;&lt; ball1.vx &lt;&lt; &quot; &quot; &lt;&lt; ball1.ax &lt;&lt;endl;
  for(int i=0; i&lt;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;

    l = sqrt(pow(ball[i].x,2)+pow(ball[i].y,2)+pow(poll_z-ball[i].z,2)); // 支柱からボールまでの距離

    //加速度の算出
    ball[i].ax = - k/ball[i].m * (1.0 - L/l) * ball[i].x;
    ball[i].ay = - k/ball[i].m * (1.0 - L/l) * ball[i].y;
    ball[i].az = - k/ball[i].m * (1.0 - L/l) * (ball[i].z-poll_z) -g;
    //速度の算出
    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;
  }
 tn++;
}
void DrawStructure(){
  for(int i=0; i&lt;N; i++){
    glPushMatrix();
      glMaterialfv(GL_FRONT, GL_AMBIENT, ms_silver.ambient);
      glMaterialfv(GL_FRONT, GL_DIFFUSE, ms_silver.diffuse);
      glMaterialfv(GL_FRONT, GL_SPECULAR, ms_silver.specular);
      glMaterialfv(GL_FRONT, GL_SHININESS, &amp;ms_silver.shininess);
      glTranslated(ball[i].x, ball[i].y, ball[i].z); //平行移動値の設定
      glutSolidSphere(ball_r, 20, 20);            //引数：(半径, Z軸まわりの分割数, Z軸に沿った分割数)
    glPopMatrix();
  //バネ
    glPushMatrix();
      glMaterialfv(GL_FRONT, GL_AMBIENT, ms_yellow_rubber.ambient);
      glMaterialfv(GL_FRONT, GL_DIFFUSE, ms_yellow_rubber.diffuse);
      glMaterialfv(GL_FRONT, GL_SPECULAR, ms_yellow_rubber.specular);
      glMaterialfv(GL_FRONT, GL_SHININESS, &ms_yellow_rubber.shininess);  
      drowSolidSpring(box_x, box_y, box_z, (ball[i].x, (ball[i].y,(ball[i].z); //引数：(始点x, 始点y,  始点z, 終点x, 終点y, 終点z )
    glPopMatrix();
  }
  //軸（円錐）
  glPushMatrix();
      glMaterialfv(GL_FRONT, GL_AMBIENT, ms_copper.ambient);
      glMaterialfv(GL_FRONT, GL_DIFFUSE, ms_copper.diffuse);
      glMaterialfv(GL_FRONT, GL_SPECULAR, ms_copper.specular);
      glMaterialfv(GL_FRONT, GL_SHININESS, &amp;ms_copper.shininess);
      glTranslated(poll_x, poll_y, poll_z);
      glutSolidCone(5.0,20.0,20,20);//引数：(半径, 高さ, Z軸まわりの分割数, Z軸に沿った分割数)
  glPopMatrix();
}
</pre>
<p>
位置「ball1.x」「ball1.y」「ball1.z」<br />
速度「ball1.vx」「ball1.vy」「ball1.vz」<br />
加速度「ball1.ax」「ball1.ay」「ball1.az」<br />
を逐次計算します。
先にも述べましたが、このアルゴリズムでは誤差が大きく、
時間と共に単振動の振幅が大きくなってしまいます。
アルゴリズムの改善は、次回行ないます。
</p>
<!--
<span class="mt-enclosure mt-enclosure-image" style="display: inline;"><img alt="20100306-01.gif" src="http://www.natural-science.or.jp/images/20100306-01.gif" width="512" height="512" class="mt-image-none" style="" /></span>
-->
<mt:include module="仮想物理実験室　コンテンツ" />

]]>
        
    </content>
</entry>

<entry>
    <title>VisualC++ と OpenGL を利用した仮想物理実験室【2-10-1】ばね弾性力＋重力がある場合の運動方程式とアルゴリズム</title>
    <link rel="alternate" type="text/html" href="http://www.natural-science.or.jp/article/20100830173838.php" />
    <id>tag:www.natural-science.or.jp,2010://12.9847</id>

    <published>2010-08-30T08:38:38Z</published>
    <updated>2010-08-30T08:39:19Z</updated>

    <summary> 【2-9-1】ばね弾性力による運動の運動方程式と（２次元）アルゴリズムでは、ば...</summary>
    <author>
        <name>遠藤 理平</name>
        <uri>http://www.natural-science.or.jp/article/members/cat-12/</uri>
    </author>
    
        <category term="仮想物理実験室" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="アルゴリズム" label="アルゴリズム" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="ばね弾性力" label="ばね弾性力" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="運動方程式" label="運動方程式" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="重力" label="重力" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ja" xml:base="http://www.natural-science.or.jp/">
        <![CDATA[<p>
<a href="http://www.natural-science.or.jp/article/20100830002924.php">【2-9-1】ばね弾性力による運動の運動方程式と（２次元）アルゴリズム</a>では、<span style="font-weight:600">ばね弾性力</span>がある場合の運動方程式の導出と、コンピュータでシミュレーションを行うためのアルゴリズムの導出を行ないました。そして、<a href="http://www.natural-science.or.jp/article/20100830003436.php">【2-9-2】ばね弾性力による単振動運動（２次元）のシミュレーション</a>では、ばねが x-y 平面内で変位するばねの単振動のシミュレーションを行ないました。
</p>
<p>
本節では、xyz 空間内でばねが変位する場合をシミュレーションするためのアルゴリズムの導出をおこないます。
座標(0,0,z_{poll})に置かれた動かない支柱に、自然長 L_0[m] のばねの片側を固定し、反対側をボールつけ、xyz 空間内に伸ばします。時刻 t[s] のときのボールの位置を r(t)[m] とします。
</p>
<p style="text-align:center">
<img src="http://www.natural-science.or.jp/images/20100302-01.gif" alt="" />
</p>
<h4>ばね弾性力＋重力による運動の変数</h4>
<p>
■ 時刻 t[s]
■ ボールの位置 r(t)=(x(t),y(t),z(t))[m]<br />
■ ばねの自然長 L_0[m]<br />
■ ばねの長さ L(t)[m]<br />
■ ばねの変位 ΔL(t)[m]<br />
■ ばね弾性力 f_k = (f_{kx},f_{ky},f_{kz})[N]<br />
■ 重力 f_g = (0,0,f_f_{gz})[N]<br />
■ 角度 Φ[rad]、θ[rad]<br />
</p>
<p>
ボールに加わる力がばね弾性力だけでなく重力も加わるので、
ばね弾性力には添え字の k を、重力には、添え字に g をつけて区別することにします。
</p>

<h3>コンピュータアルゴリズム導出までのステップ</h3>
<p>
<a href="http://www.natural-science.or.jp/article/20100830003436.php">【2-9-2】ばね弾性力による単振動運動（２次元）のシミュレーション</a>と同様にすすめます。<br />
</p>
<p>
１．ばねの長さ L(t) <br />
２．ばねの変位 ΔL(t)<br />
３．ばね弾性力 f_k <br />
４．ばね弾性力の x,y,z 各成分 f_{kx},f_{ky},f_{kz}<br />
５．ボールへ加わる力の x,y,z 各成分 F_x, F_y, F_z<br />
６．ニュートン運動方程式から加速度の x,y,z 各成分 a_x(t),a_y(t),a_z(t) <br />
</p>

<h3>ばね弾性力 f_k の導出</h3>
<p>
<a href="http://www.natural-science.or.jp/article/20100830000939.php">【2-8-1】ばね弾性力による運動の運動方程式（１次元）とアルゴリズム</a>で導出したとおり、
ばね弾性力 f[N] とばねの変位 ΔL[m] との関係は、<span style="font-weight:600">フックの法則</span>と呼ばれる次の関係式を満たします。
</p>
<div class="waku">
<div style="float:right">(2.10.1)</div>
<img src="http://www.natural-science.or.jp/images/20100302-15.gif" alt="フックの法則" />
</div>
<p>
ばね弾性力 f[N] を導出するために、ばねの変位 ΔL[m] を得る必要があります。時刻 t[s] のときのばねの変位 ΔL(t) は、ばねの長さ L(t) からばねの自然長 L_0[m] を引いたものになります。ばねの長さ L(t) は、次の図の関係から求めることができます。
</p>
<p style="text-align:center">
<img src="http://www.natural-science.or.jp/images/20100302-02.gif" alt="" />
</p>
<p>
L(t) は、<span style="font-weight:600">三平方の定理</span>から、
</p>
<div class="waku">
<div style="float:right">(2.10.2)</div>
<img src="http://www.natural-science.or.jp/images/20100302-03.gif" alt="" />
</div>

<p>
ばねの変位 ΔL(t) は次のように決まります。
</p>
<div class="waku">
<div style="float:right">(2.10.3)</div>
<img src="http://www.natural-science.or.jp/images/20100302-04.gif" alt="" />
</div>
<p>
上式を(2.10.1)に代入することで、ばね弾性力 f[N] を求めることができます。
</p>
<div class="waku">
<div style="float:right">(2.10.4)</div>
<img src="http://www.natural-science.or.jp/images/20100302-16.gif" alt="" />
</div>
<p>
ついでに、角度Φも求まります。
</p>
<div class="waku">
<div style="float:right">(2.10.5)</div>
<img src="http://www.natural-science.or.jp/images/20100302-05.gif" alt="" />
</div>
<h3>ばね弾性力の x,y,z 各成分（f_{kx},f_{ky},f_{kz}）の導出</h3>
<p>
３次元の場合では、x,y,z 成分の一括で求めることができず、２段階で行ないます。
本節でははじめに、z 成分（f_{kz}）と xy平面成分（f_{kxy}）の２つに分割後、
さらに、xy平面成分（f_{kxy}）を x 成分（f_{kx}）と y 成分（f_{ky}）とに分解することで、全成分を導出します。
</p>
<h4>z 成分（f_{kz}）と xy平面成分（f_{kxy}）への分割</h4>
<p style="text-align:center">
<img src="http://www.natural-science.or.jp/images/20100302-06.gif" alt="" />
</p>
<p>
ばね弾性力 f_k と 角度Φ が求まっているので、z 成分（f_{kz}）と xy平面成分（f_{kxy}）はそれぞれ、sinΦ, cosΦ を掛けることで得られます。
</p>
<h4>x 成分（f_{kx}）と y 成分（f_{ky}）への分割</h4>
<p>
x 成分（f_{kx}）と y 成分（f_{ky}）への分割のために必要なのは、角度θです。
</p>
<p style="text-align:center">
<img src="http://www.natural-science.or.jp/images/20100302-07.gif" alt="" />
</p>
<p>
上図から、sinθ, cosθが求まります。
</p>
<div class="waku">
<div style="float:right">(2.10.6)</div>
<img src="http://www.natural-science.or.jp/images/20100302-08.gif" alt="" />
</div>
<p>
xy平面成分（f_{kxy}）に、sinθ, cosθをそれぞれ掛けることで、x 成分（f_{kx}）と y 成分（f_{ky}）が得られます。
</p>
<p style="text-align:center">
<img src="http://www.natural-science.or.jp/images/20100302-09.gif" alt="" />
</p>
<p>
ここまで得られた式を代入することで、
ばね弾性力の x,y,z 各成分（f_{kx},f_{ky},f_{kz}）の導出することができました。
</p>
<div class="waku">
<div style="float:right">(2.10.7)</div>
<img src="http://www.natural-science.or.jp/images/20100302-10.gif" alt="" />
</div>

<h2>ばね弾性力＋重力がある場合の運動方程式</h2>
<p>
ボールに、ばね弾性力と重力が働く場合、
ボールに作用するすべての力 F[N] は、ばね弾性力の各成分（f_{kx},f_{ky},f_{kz}）と 重力（0,0,f_{gz}）となります。x,y,z 成分それぞれに作用する力は、
</p>
<div class="waku">
<div style="float:right">(2.10.8)</div>
<img src="http://www.natural-science.or.jp/images/20100302-11.gif" alt="力" />
</div>
<p>
となります。式(2.10.8)を<a href="http://www.natural-science.or.jp/article/20100110005549.php">【５日目】 重力加速度、重力、ニュートンの運動方程式</a>で導出したニュートンの運動方程式
</p>
<div class="waku">
<div style="float:right">(2.10.9)</div>
<img src="http://www.natural-science.or.jp/images/20100203-01.gif" alt="ニュートンの運動方程式" />
</div>
<p>
に代入することで、空気抵抗がある場合のボールの運動方程式が得られます。
</p>
<div class="waku">
<div style="float:right">(2.10.10)</div>
<img src="http://www.natural-science.or.jp/images/20100302-12.gif" alt="運動方程式" />
</div>
<p>
ばね弾性力が働く場合、ボールの加速度の各成分は、<span style="font-weight:600">質量 m[kg]に反比例</span>することがわかります。つまり上式は、「<span style="font-weight:600">ばね弾性力による加速度は重いほど小さく、軽いほど大きくなる</span>」ことを意味しています。これは、直感的に成り立っていることがわかります。
</p>
<h2>ばね弾性力による運動のアルゴリズムの導出</h2>
<p>
式(2.10.10)として得られたニュートンの運動方程式を<a href="http://www.natural-science.or.jp/article/20100223005001.php">【13日目】ばね弾性力がある場合の運動方程式</a>と同様に、コンピュータでシミュレーションするためのアルゴリズム導出します。
式(2.10.10)を差分で表すと、
</p>
<div class="waku">
<div style="float:right">(2.10.11)</div>
<img src="http://www.natural-science.or.jp/images/20100302-13.gif" alt="差分方程式" />
</div>
<p>
となります。L_n は、支柱とボールとの距離です。
</p>
<div class="waku">
<div style="float:right">(2.10.12)</div>
<img src="http://www.natural-science.or.jp/images/20100302-14.gif" alt="差分方程式" />
</div>
<p>
式(2.10.11)は、<span style="font-weight:600">t = t_n[s] のときの加速度 a_n[m/s^2] は、そのときの速度 v_n[m/s]</span>で得られることを表しています。得られた加速度と<a href="http://www.natural-science.or.jp/article/20091225234208.php">等加速度直線運動のアルゴリズム</a>を用いることで、速度 v[m/s] と位置 x[m]とを決定することができます。
</p>
<div class="waku">
<div style="float:right">(2.10.12)</div>
<img src="http://www.natural-science.or.jp/images/20100206-01.gif" alt="速度" />
</div><br />
<div class="waku">
<div style="float:right">(2.10.13)</div>
<img src="http://www.natural-science.or.jp/images/20100206-02.gif" alt="位置" />
</div>
<p>
本節では、ばねの変位を x軸方向に限定しているので、初期位置 x_0, 初速度 v_{x0} を指定することで、様々な運動のシミュレーションを行うことができます。
次節では、具体的なシミュレーションを行ないます。
</p>
<!--
<span class="mt-enclosure mt-enclosure-image" style="display: inline;"><img alt="20100302-01.gif" src="http://www.natural-science.or.jp/images/20100302-01.gif" width="574" height="374" class="mt-image-none" style="" /></span>
-->
<mt:include module="仮想物理実験室　コンテンツ" />
]]>
        
    </content>
</entry>

<entry>
    <title>2010年8月29日付河北新報社朝刊にて、NPO法人 natural science 主催 『ものづくり講座』の記事を掲載いただきました。</title>
    <link rel="alternate" type="text/html" href="http://www.natural-science.or.jp/article/20100830090755.php" />
    <id>tag:www.natural-science.or.jp,2010://12.9845</id>

    <published>2010-08-30T00:07:55Z</published>
    <updated>2010-08-30T00:08:41Z</updated>

    <summary> NPO法人natural science 主催　『ものづくり講座』の記事を掲載...</summary>
    <author>
        <name>遠藤 理平</name>
        <uri>http://www.natural-science.or.jp/article/members/cat-12/</uri>
    </author>
    
        <category term="パブリシティ" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="ものづくり講座" label="ものづくり講座" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="河北新報社" label="河北新報社" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ja" xml:base="http://www.natural-science.or.jp/">
        <![CDATA[<p>
NPO法人natural science 主催　『<a href="http://www.natural-science.or.jp/colledge/monodukuri/index.php" target="_blank">ものづくり講座</a>』の記事を掲載いただきました。
</p>
<p>
<span class="mt-enclosure mt-enclosure-image" style="display: inline;"><a href="http://www.natural-science.or.jp/assets_c/2010/08/20100829-6730.php" onclick="window.open('http://www.natural-science.or.jp/assets_c/2010/08/20100829-6730.php','popup','width=2042,height=1080,scrollbars=no,resizable=no,toolbar=no,directories=no,location=no,menubar=no,status=no,left=0,top=0'); return false"><img src="http://www.natural-science.or.jp/assets_c/2010/08/20100829-thumb-600x317-6730.gif" width="600" height="317" alt="20100829.gif" class="mt-image-none" style="" /></a></span>
</p>
<p>
■科学　不思議発見　好奇心は満開<br />
■大学生が生きた知識
</p>
]]>
        
    </content>
</entry>

<entry>
    <title>VisualC++ と OpenGL を利用した仮想物理実験室【2-9-2】ばね弾性力による単振動運動（２次元）のシミュレーション</title>
    <link rel="alternate" type="text/html" href="http://www.natural-science.or.jp/article/20100830003436.php" />
    <id>tag:www.natural-science.or.jp,2010://12.9842</id>

    <published>2010-08-29T15:34:36Z</published>
    <updated>2010-08-29T15:36:45Z</updated>

    <summary> 前節ばね弾性力による運動の運動方程式と（２次元）アルゴリズムでは、 ばねの変位...</summary>
    <author>
        <name>遠藤 理平</name>
        <uri>http://www.natural-science.or.jp/article/members/cat-12/</uri>
    </author>
    
        <category term="仮想物理実験室" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="２次元" label="２次元" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="シミュレーション" label="シミュレーション" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="ばね弾性力" label="ばね弾性力" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="単振動運動" label="単振動運動" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ja" xml:base="http://www.natural-science.or.jp/">
        <![CDATA[<p>
前節<a href="http://www.natural-science.or.jp/article/20100830002924.php">ばね弾性力による運動の運動方程式と（２次元）アルゴリズム</a>では、
ばねの変位が x-y 平面内の場合における、<span style="font-weight:600">ばね弾性力</span>の運動方程式の導出と、コンピュータでシミュレーションを行うためのアルゴリズムの導出を行ないました。t=t_n[s]のときの加速度 a_n[m/s^2]は、
</p>
<div class="waku">
<div style="float:right">(2.9.1)</div>
<img src="http://www.natural-science.or.jp/images/20100228-12.gif" alt="差分方程式" />
</div>
<p>
と、そのときのボールの位置 x_n[m/s]によって決まる値となります。
|r_n| とは、原点からボールまでの距離、
</p>
<div class="waku">
<div style="float:right">(2.9.1)</div>
<img src="http://www.natural-science.or.jp/images/20100228-03.gif" alt="差分方程式" />
</div>
<p>
です。コンピュータシミュレーションでは、
初期条件として、r_0 = 20.0[m]とし、１０個のボールの質量 m [kg]を変化させて運動の違いを確認します。
</p>
<h2>ばね弾性力による運動のための計算アルゴリズム</h2>
<h4>支柱の位置とボールの位置・速度・加速度の初期値</h4>
<p>
ばね定数を k、自然長 L[m] のばねの片側を固定した動かない支柱を原点に置き、ばねの反対側をボールつけ、x-y 平面上に伸ばします。時刻 t=t_n[s] のときのボールの位置を r_n とします。
</p>
<pre>
k = 10.0;    //ばね定数
L = 30.0;    //ばねの自然長
r = 20.0;    //ボールの初期半径

ball_r = 4.0;//ボールの半径

//支柱の定義
double poll_x = 0.0;
double poll_y = 0.0;
double poll_z = 0.0;
double poll_r = 5.0;  //半径
double poll_h = 20.0; //高さ
</pre>

<h4>速度・位置を逐次計算するアルゴリズム</h4>
<pre>
//位置の計算
x  = x  + vx * dt;
y  = y  + vy * dt;
z  = z  + vz * dt;

r = sqrt(pow(x,2)+pow(y,2));   //&lt;--原点からボールの距離（＝ばねの長さ）

//加速度の計算
ax = - k/m * (r - L) * x/r;    //&lt;-----ばね弾性力からの寄与
ay = - k/m * (r - L) * y/r;    //&lt;-----ばね弾性力からの寄与
az = 0.0;
//速度の計算
vx = vx + ax * dt;
vy = vy + ay * dt;
vz = vz + az * dt;
</pre>
<p>
このアルゴリズムでは誤差が大きく、時間と共に、単振動の振幅が大きくなってしまいます。
アルゴリズムの改善は、次に行ないます。
</p>


<h2>ばね弾性力による単振動のシミュレーション</h2>
<p>
つるつるの床に、動かない支柱とばねで繋がったボールが運動するシミュレーションです。運動は、ばね弾性力のみによる単振動運動となります。
</p>
<div style="text-align:center">
<object width="425" height="344"><param name="movie" value="http://www.youtube.com/v/kWjLKLFIco4&hl=ja&fs=1"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/kWjLKLFIco4&hl=ja&fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"></embed></object>
</div>

<h2>VisualC++ ＋ OpenGL プログラミング</h2>
<p>
「<a href="http://www.natural-science.or.jp/article/20100315220132.php">【0.2日目】仮想物理実験室の構築 （ver1.1）</a>」をベースにプログラミングします。上記で解説した逐次計算を行うアルゴリズムをプログラミングします。
</p>
<h3>仮想物理実験室変数の定義</h3>
<pre>
//////////////////////////////////////////////////////////////////////////
// 変数の定義
//////////////////////////////////////////////////////////////////////////
#define _BITMAP 1 //アニメーション作成用ビットマップの保存 0:しない　1:する
ofstream ofs1( &quot;ball1.data&quot; );
//--------------------------------------------------------
// 仮想物理実験室変数の定義
//--------------------------------------------------------
double t = 0.0;     //時刻
double dt= 0.01;    //時間刻み
int tn = 0;         //ステップ数
double k = 10.0;    //ばね定数
double L = 30.0;    //ばねの自然長
double r = 20.0;    //ボールの初期半径
double radian; 
double theta;

//支柱の定義
double poll_x = 0.0;
double poll_y = 0.0;
double poll_z = 0.0;
double poll_r = 5.0;  //半径
double poll_h = 20.0; //高さ

// ボールの定義
double ball_r = 4.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&lt;N; i++ ){
    radian = 2.0 * PI * double(i)/double(N);
    ball[i].m  = 2.0*double(i+1)/double(N); //ボールの質量
    ball[i].x  = r * cos(radian);
    ball[i].y  = r * sin(radian);
    ball[i].z  = ball_r; //ボールがめり込まないように
    ball[i].vx = 0.0;
    ball[i].vy = 0.0;
    ball[i].vz = 0.0;
    ball[i].ax = 0.0;
    ball[i].ay = 0.0;
    ball[i].az = 0.0;
  }
}
</pre>
<p>
ボールの位置「x,y,z」、速度「vx,vy,vz」、加速度「ax,ay,az」を
構造体「BALL」のメンバとします。「BALL」型の変数「ball1」を宣言と同時に初期値を設定しています。
</p>
<h3>速度・位置を逐次計算するアルゴリズム</h3>
<pre>
//--------------------------------------------------------
// 計算と物体の描画
//--------------------------------------------------------
void Calculate(){
  t = dt * double(tn);
  //ofs1 &lt;&lt; dt*tn &lt;&lt; &quot; &quot; &lt;&lt; ball1.x &lt;&lt; &quot; &quot; &lt;&lt; ball1.vx &lt;&lt; &quot; &quot; &lt;&lt; ball1.ax &lt;&lt;endl;
  for(int i=0; i&lt;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;
    r = sqrt(pow(ball[i].x,2)+pow(ball[i].y,2));

    //加速度の算出
    ball[i].ax = - k/ball[i].m * (r - L) * ball[i].x/r;
    ball[i].ay = - k/ball[i].m * (r - L) * ball[i].y/r;
    ball[i].az = 0.0;
    //速度の算出
    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;
  }
 tn++;
}
void DrawStructure(){
  for(int i=0; i&lt;N; i++){
    glPushMatrix();
      glMaterialfv(GL_FRONT, GL_AMBIENT, ms_silver.ambient);
      glMaterialfv(GL_FRONT, GL_DIFFUSE, ms_silver.diffuse);
      glMaterialfv(GL_FRONT, GL_SPECULAR, ms_silver.specular);
      glMaterialfv(GL_FRONT, GL_SHININESS, &amp;ms_silver.shininess);
      glTranslated(ball[i].x, ball[i].y, ball[i].z); //平行移動値の設定
      glutSolidSphere(ball_r, 20, 20);            //引数：(半径, Z軸まわりの分割数, Z軸に沿った分割数)
    glPopMatrix();
  //バネ
    glPushMatrix();
      glMaterialfv(GL_FRONT, GL_AMBIENT, ms_yellow_rubber.ambient);
      glMaterialfv(GL_FRONT, GL_DIFFUSE, ms_yellow_rubber.diffuse);
      glMaterialfv(GL_FRONT, GL_SPECULAR, ms_yellow_rubber.specular);
      glMaterialfv(GL_FRONT, GL_SHININESS, &ms_yellow_rubber.shininess);  
      drowSolidSpring(box_x, box_y, box_z, (ball[i].x, (ball[i].y,(ball[i].z); //引数：(始点x, 始点y,  始点z, 終点x, 終点y, 終点z )
    glPopMatrix();
  }
  //軸（円錐）
  glPushMatrix();
      glMaterialfv(GL_FRONT, GL_AMBIENT, ms_copper.ambient);
      glMaterialfv(GL_FRONT, GL_DIFFUSE, ms_copper.diffuse);
      glMaterialfv(GL_FRONT, GL_SPECULAR, ms_copper.specular);
      glMaterialfv(GL_FRONT, GL_SHININESS, &amp;ms_copper.shininess);
      glutSolidCone(5.0,20.0,20,20);//引数：(半径, 高さ, Z軸まわりの分割数, Z軸に沿った分割数)
  glPopMatrix();

}
</pre>
<p>
位置「ball1.x」「ball1.y」「ball1.z」<br />
速度「ball1.vx」「ball1.vy」「ball1.vz」<br />
加速度「ball1.ax」「ball1.ay」「ball1.az」<br />
を逐次計算します。
先にも述べましたが、このアルゴリズムでは誤差が大きく、
時間と共に単振動の振幅が大きくなってしまいます。
アルゴリズムの改善は、次回行ないます。
</p>

<!--
<span class="mt-enclosure mt-enclosure-image" style="display: inline;"><img alt="20100301-1.gif" src="http://www.natural-science.or.jp/images/20100301-1.gif" width="512" height="512" class="mt-image-none" style="" /></span>
-->
<mt:include module="仮想物理実験室　コンテンツ" />
]]>
        
    </content>
</entry>

<entry>
    <title>VisualC++ と OpenGL を利用した仮想物理実験室【2-9-1】ばね弾性力による運動の運動方程式と（２次元）アルゴリズム</title>
    <link rel="alternate" type="text/html" href="http://www.natural-science.or.jp/article/20100830002924.php" />
    <id>tag:www.natural-science.or.jp,2010://12.9841</id>

    <published>2010-08-29T15:29:24Z</published>
    <updated>2010-08-29T15:30:08Z</updated>

    <summary> 【2-8-1】ばね弾性力による運動の運動方程式とアルゴリズムでは、ばね弾性力が...</summary>
    <author>
        <name>遠藤 理平</name>
        <uri>http://www.natural-science.or.jp/article/members/cat-12/</uri>
    </author>
    
        <category term="仮想物理実験室" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="アルゴリズム" label="アルゴリズム" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="ばね弾性力" label="ばね弾性力" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="運動方程式" label="運動方程式" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ja" xml:base="http://www.natural-science.or.jp/">
        <![CDATA[<p>
<a href="http://www.natural-science.or.jp/article/20100830000939.php">【2-8-1】ばね弾性力による運動の運動方程式とアルゴリズム</a>では、<span style="font-weight:600">ばね弾性力</span>がある場合の運動方程式の導出と、コンピュータでシミュレーションを行うためのアルゴリズムの導出を行ないました。さらに、<a href="http://www.natural-science.or.jp/article/20100223233220.php">【２－８】ばね弾性力による運動：単振動運動（１次元）</a>では、ばねが x 軸方向のみに変位するばねの単振動のシミュレーションを行ないました。
</p>
<p>
本節では、x-y 平面上でばねが変位する場合をシミュレーションするためのアルゴリズムの導出をおこないます。
自然長 L[m] のばねの片側を固定した動かない支柱を原点に置き、ばねの反対側をボールつけ、x-y 平面上に伸ばします。時刻 t=t_n[s] のときのボールの位置を r_n とします。
</p>
<p style="text-align:center">
<img src="http://www.natural-science.or.jp/images/20100228-01.gif" alt="" />
</p>
<h4>パラメータ</h4>
<p>
■ ボールの位置 r_n=(x_n,y_n)[m]<br />
■ ばねの長さ L[m]<br />
■ ばねの変位 ΔL[m]<br />
■ ばね弾性力 f=(f_x,f_y)[N]<br />
■ 変位の方向と x 軸方向とのなす角度 θ[rad]<br />
パラメータの関係性のみを図示します。
</p>
<h2>ばね弾性力 f[N] の導出</h2>
<p>
<a href="http://www.natural-science.or.jp/article/20100223005001.php">【13日目】ばね弾性力がある場合の運動方程式</a>で導出したとおり、
ばね弾性力 f[N] とばねの変位 ΔL[m] との関係は、<span style="font-weight:600">フックの法則</span>と呼ばれる次の関係式を満たします。
</p>
<div class="waku">
<div style="float:right">(2.9.1)</div>
<img src="http://www.natural-science.or.jp/images/20100228-06.gif" alt="フックの法則" />
</div>
<p>
ばね弾性力 f[N] が、<span style="font-weight:600">ニュートンの運動方程式</span>から、シミュレーションのアルゴリズムを導出できます。ばね弾性力 f[N] を導出するために、ばねの変位 ΔL[m] を得る必要があります。関係性をわかりやすくするために、パラメータの関係を模式的に図示します。
</p>
<p style="text-align:center">
<img src="http://www.natural-science.or.jp/images/20100228-02.gif" alt="" />
</p>
<p>
原点からボールまでの距離 |r_n| は、<span style="font-weight:600">三平方の定理</span>から、
</p>
<div class="waku">
<div style="float:right">(2.9.2)</div>
<img src="http://www.natural-science.or.jp/images/20100228-03.gif" alt="" />
</div>
<p>
のように得られます。これにより、ばねの変位 ΔL[m] を導出します。
</p>
<div class="waku">
<div style="float:right">(2.9.3)</div>
<img src="http://www.natural-science.or.jp/images/20100228-04.gif" alt="" />
</div>
<p>
ばねの変位 ΔL[m] が導出できたので、これを 式(2.9.1)に代入することで、ばね弾性力 f[N] を求めることができます。しかしながら、ニュートンの運動方程式に当てはめるためには、ばね弾性力の x 成分 f_x と y 成分 f_y を得る必要があります。各成分を導出するために必要な情報は、ばねの変位の方向と x 軸方向とのなす角を θ[rad] です。cosθとsinθは、ボールの座標 r_n = (x_n, y_n) とを用いて次のように表すことができます。
</p>
<div class="waku">
<div style="float:right">(2.9.4)</div>
<img src="http://www.natural-science.or.jp/images/20100228-05.gif" alt="" />
</div>
<p>
式(2.9.4)を用いることで、ばね弾性力の各成分 f=(f_x, f_y) を導出することができます。 
</p>
<p style="text-align:center">
<img src="http://www.natural-science.or.jp/images/20100228-07.gif" alt="" />
</p>

<div class="waku">
<div style="float:right">(2.9.5)</div>
<img src="http://www.natural-science.or.jp/images/20100228-08.gif" alt="" />
</div>
<p>
式(2.9.5)に ばね弾性力 f[N]、ばねの変位 ΔL[m]、cosθ、sinθを代入します。
</p>
<div class="waku">
<div style="float:right">(2.9.6)</div>
<img src="http://www.natural-science.or.jp/images/20100228-09.gif" alt="" />
</div>
<p>
上式は、ボールの位置 r_n = (x_n, y_n) が得られれば、ばね弾性力の各成分 f=(f_x, f_y) が決まることを表しています。上式は、任意の時刻 t[s] の位置 r(t) =(x(t), y(t)) でも成り立ちます。
</p>

<h2>ばね弾性力がある場合の運動方程式</h2>
<p>
ばね弾性力以外にボールに力が働かないとすると、
ボールに作用するすべての力 F[N] は、ばね弾性力 f_x[N] と f_y[N]のみとなります。
x,y,z 成分それぞれに作用する力は、
</p>
<div class="waku">
<div style="float:right">(2.9.7)</div>
<img src="http://www.natural-science.or.jp/images/20100228-10.gif" alt="力" />
</div>
<p>
となります。式(10-6)を<a href="http://www.natural-science.or.jp/article/20100110005549.php">【５日目】 重力加速度、重力、ニュートンの運動方程式</a>で導出したニュートンの運動方程式
</p>
<div class="waku">
<div style="float:right">(2.9.8)</div>
<img src="http://www.natural-science.or.jp/images/20100203-01.gif" alt="ニュートンの運動方程式" />
</div>
<p>
に代入することで、空気抵抗がある場合のボールの運動方程式が得られます。
</p>
<div class="waku">
<div style="float:right">(2.9.9)</div>
<img src="http://www.natural-science.or.jp/images/20100228-11.gif" alt="ニュートンの運動方程式" />
</div>
<p>
ばね弾性力を考慮すると、x 軸方向のボールの加速度 a_x[m/s^2]は、<span style="font-weight:600">質量 m[kg]に反比例</span>することがわかります。つまり上式は、「<span style="font-weight:600">ばね弾性力による加速度は重いほど小さく、軽いほど大きくなる</span>」ことを意味しています。これは、直感的に成り立っていることがわかります。
</p>
<h2>ばね弾性力による運動のアルゴリズムの導出</h2>
<p>
式(2.9.9)として得られたニュートンの運動方程式を<a href="http://www.natural-science.or.jp/article/20100223005001.php">【13日目】ばね弾性力がある場合の運動方程式</a>と同様に、コンピュータでシミュレーションするためのアルゴリズム導出します。
式(2.9.9)を差分で表すと、
</p>
<div class="waku">
<div style="float:right">(2.9.10)</div>
<img src="http://www.natural-science.or.jp/images/20100228-12.gif" alt="差分方程式" />
</div>
<p>
となります。上式は、<span style="font-weight:600">t = t_n[s] のときの加速度 a_n[m/s^2] は、そのときの速度 v_n[m/s]</span>で得られることを表しています。得られた加速度と<a href="http://www.natural-science.or.jp/article/20091225234208.php">等加速度直線運動のアルゴリズム</a>を用いることで、速度 v[m/s] と位置 x[m]とを決定することができます。
</p>
<div class="waku">
<div style="float:right">(2.9.11)</div>
<img src="http://www.natural-science.or.jp/images/20100206-01.gif" alt="速度" />
</div><br />
<div class="waku">
<div style="float:right">(2.9.12)</div>
<img src="http://www.natural-science.or.jp/images/20100206-02.gif" alt="位置" />
</div>
<p>
本節では、ばねの変位を x軸方向に限定しているので、初期位置 x_0, 初速度 v_{x0} を指定することで、様々な運動のシミュレーションを行うことができます。
次節では、具体的なシミュレーションを行ないます。
</p>
<!--
<span class="mt-enclosure mt-enclosure-image" style="display: inline;"><img alt="20100228-01.gif" src="http://www.natural-science.or.jp/images/20100228-01.gif" width="426" height="409" class="mt-image-none" style="" /></span>
-->
<mt:include module="仮想物理実験室　コンテンツ" />
]]>
        
    </content>
</entry>

<entry>
    <title>VisualC++ と OpenGL を利用した仮想物理実験室【2-8-2】ばね弾性力による単振動運動（１次元）のシミュレーション</title>
    <link rel="alternate" type="text/html" href="http://www.natural-science.or.jp/article/20100830001656.php" />
    <id>tag:www.natural-science.or.jp,2010://12.9840</id>

    <published>2010-08-29T15:16:56Z</published>
    <updated>2010-08-29T15:19:58Z</updated>

    <summary> 前節ばね弾性力による運動の運動方程式とアルゴリズムでは、 ばね弾性力がある場合...</summary>
    <author>
        <name>遠藤 理平</name>
        <uri>http://www.natural-science.or.jp/article/members/cat-12/</uri>
    </author>
    
        <category term="仮想物理実験室" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="シミュレーション" label="シミュレーション" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="ばね弾性力" label="ばね弾性力" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="単振動" label="単振動" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ja" xml:base="http://www.natural-science.or.jp/">
        <![CDATA[<p>
前節<a href="http://www.natural-science.or.jp/article/20100830000939.php">ばね弾性力による運動の運動方程式とアルゴリズム</a>では、
<span style="font-weight:600">ばね弾性力</span>がある場合の運動方程式の導出と、コンピュータでシミュレーションを行うためのアルゴリズムの導出を行ないました。
t=t_n[s]のときの加速度 a_n[m/s^2]は、
</p>
<div class="waku">
<div style="float:right">(2.8.1)</div>
<img src="http://www.natural-science.or.jp/images/20100222-10.gif" alt="差分方程式" />
</div>
<p>
と、そのときの位置 x_n[m/s]によって決まる値となります。この加速度 a[m/s^2]から速度 v[m/s]、位置 x[m]を順番に計算することで、ばね弾性力のある場合のシミュレーションを行うことができます。前回のアルゴリズムが x軸方向の変位のみを仮定しているため、今回は初期条件として、初期位置（x_0, 0, 0）, 初速度(0, 0, 0) と指定します。
</p>
<p style="text-align:center">
<img src="http://www.natural-science.or.jp/images/20100223-02.gif" alt="" />
</p>
<p>
今回は、上図のようにばねを縮めるように初期のボールを配置します。すると、ばね弾性力でボールは箱とは反対側に押し出されます。ある程度の伸びると今度は逆に、ばねが縮もうとして箱側に引っ張られます。そして、また最初の位置に戻ってきます。
その結果として、行ったり来たりの運動を繰り返すのです。
この運動のことは、<span style="font-weight:600">単振動運動</span>と呼ばれ、物理学では非常に重要な運動のひとつとなります。
</p>
<h2>ばね弾性力による運動のための計算アルゴリズム</h2>
<h4>動かない箱の位置とボールの位置・速度・加速度の初期値</h4>
<p>
動かない箱の一辺の長さ box_L 、 位置を (box_x, box_y, box_z) で指定します。
箱の位置は、箱の中心の座標なので、床にめり込まないように box_z = box_L/2.0 とします。
次にばねについてですが、ばねの自然長を L 、ばね定数を k とします。
</p>
<pre>
k = 10.0;     //ばね定数
L = 30.0;     //ばねの自然長 
box_L = 10.0; //箱の一辺の長さ
box_x = -20.0;
box_y = 0.0;
box_z = box_L/2.0;  //箱が床にめり込まないように

ball_r = 4.0;//ボールの半径

// 位置・速度・加速度の初期値 
x = 0.0;
y = 0.0;
z = ball_r;
vx = 0.0;
vy = 0.0;
vz = 0.0;
ax = 0.0;
ay = 0.0;
az = 0.0;
</pre>

<h4>速度・位置を逐次計算するアルゴリズム</h4>
<pre>
//位置の計算
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 * ((ball[i].x - box_x) - L);    //&lt;-----ばね弾性力からの寄与
ay = 0.0;
az = 0.0;
</pre>
<p>
このアルゴリズムでは誤差が大きく、時間と共に、単振動の振幅が大きくなってしまいます。
アルゴリズムの改善は、次に行ないます。
</p>


<h2>ばね弾性力による単振動のシミュレーション</h2>
<p>
つるつるの床に、動かない箱とばねで繋がったボールが置かれている状況のシミュレーションです。運動は、ばね弾性力のみによる単振動運動となります。
</p>
<div style="text-align:center">
<object width="425" height="344"><param name="movie" value="http://www.youtube.com/v/7l9AU6HBcRc&hl=ja&fs=1"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/7l9AU6HBcRc&hl=ja&fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"></embed></object>
</div>


<h2>VisualC++ ＋ OpenGL プログラミング</h2>
<p>
「<a href="http://www.natural-science.or.jp/article/20100315220132.php">【0.2日目】仮想物理実験室の構築 （ver1.1）</a>」をベースにプログラミングします。上記で解説した逐次計算を行うアルゴリズムをプログラミングします。
</p>

<h3>仮想物理実験室変数の定義</h3>
<pre>
//////////////////////////////////////////////////////////////////////////
// 変数の定義
//////////////////////////////////////////////////////////////////////////
#define _BITMAP 0 //アニメーション作成用ビットマップの保存 0:しない　1:する
//--------------------------------------------------------
// 仮想物理実験室変数の定義
//--------------------------------------------------------
double t = 0.0;     //時刻
double dt= 0.01;    //時間刻み
int tn = 0;         //ステップ数
double k = 10.0;     //ばね定数
double L = 30.0;     //ばねの自然長 

//箱の場所
double box_L = 10.0; //箱の一辺の長さ
double box_x = -20.0;
double box_y = 0.0;
double box_z = box_L/2.0;  //箱が床にめり込まないように

// ボールの定義
double ball_r = 4.0;//ボールの半径
struct BALL {
  double x, y, z;
  double vx, vy, vz;
  double ax, ay, az;
};
const int N = 1;
BALL ball[N];
void SetUp(void){
  for(int i=0; i&lt;N; i++ ){
    ball[i].x  = 0.0;
    ball[i].y  = 0.0;
    ball[i].z  = ball_r; //ボールがめり込まないように
    ball[i].vx = 0.0;
    ball[i].vy = 0.0;
    ball[i].vz = 0.0;
    ball[i].ax = 0.0;
    ball[i].ay = 0.0;
    ball[i].az = 0.0;
  }
}
</pre>
<p>
ボールの位置「x,y,z」、速度「vx,vy,vz」、加速度「ax,ay,az」を
構造体「BALL」のメンバとします。「BALL」型の変数「ball1」を宣言と同時に初期値を設定しています。
</p>
<h3>速度・位置を逐次計算するアルゴリズム</h3>
<pre>
//--------------------------------------------------------
// 計算と物体の描画
//--------------------------------------------------------
void Calculate(){
  t = dt * double(tn);
  //ofs1 << dt*tn << " " << ball1.x << " " << ball1.vx << " " << ball1.ax <<endl;
  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].x - box_x) - L);
    ball[i].ay = 0.0;
    ball[i].az = 0.0;
  }
 tn++;
}
void DrawStructure(){
  for(int i=0; i<N; i++){
  //ボール
    glPushMatrix();
      glMaterialfv(GL_FRONT, GL_AMBIENT, ms_silver.ambient);
      glMaterialfv(GL_FRONT, GL_DIFFUSE, ms_silver.diffuse);
      glMaterialfv(GL_FRONT, GL_SPECULAR, ms_silver.specular);
      glMaterialfv(GL_FRONT, GL_SHININESS, &ms_silver.shininess);
      glTranslated(ball[i].x, ball[i].y, ball[i].z); //平行移動値の設定
      glutSolidSphere(ball_r, 20, 20);            //引数：(半径, Z軸まわりの分割数, Z軸に沿った分割数)
    glPopMatrix();
  //バネ
    glPushMatrix();
      glMaterialfv(GL_FRONT, GL_AMBIENT, ms_yellow_rubber.ambient);
      glMaterialfv(GL_FRONT, GL_DIFFUSE, ms_yellow_rubber.diffuse);
      glMaterialfv(GL_FRONT, GL_SPECULAR, ms_yellow_rubber.specular);
      glMaterialfv(GL_FRONT, GL_SHININESS, &ms_yellow_rubber.shininess);  
      drowSolidSpring(box_x, box_y, box_z, (ball[i].x, (ball[i].y,(ball[i].z); //引数：(始点x, 始点y,  始点z, 終点x, 終点y, 終点z )
    glPopMatrix();
  }
  //箱（立方体）
  glPushMatrix();
      glMaterialfv(GL_FRONT, GL_AMBIENT, ms_copper.ambient);
      glMaterialfv(GL_FRONT, GL_DIFFUSE, ms_copper.diffuse);
      glMaterialfv(GL_FRONT, GL_SPECULAR, ms_copper.specular);
      glMaterialfv(GL_FRONT, GL_SHININESS, &ms_copper.shininess);
      glTranslated( box_x, box_y, box_z);//平行移動値の設定
      glutSolidCube(box_L);//引数：(一辺の長さ)
  glPopMatrix();
}
</pre>
<p>
位置「ball1.x」「ball1.y」「ball1.z」<br />
速度「ball1.vx」「ball1.vy」「ball1.vz」<br />
加速度「ball1.ax」「ball1.ay」「ball1.az」<br />
を逐次計算します。
先にも述べましたが、このアルゴリズムでは誤差が大きく、
時間と共に単振動の振幅が大きくなってしまいます。
アルゴリズムの改善は、次回行ないます。
</p>

<!--
<span class="mt-enclosure mt-enclosure-image" style="display: inline;"><img alt="20100223-01.gif" src="http://www.natural-science.or.jp/images/20100223-01.gif" width="512" height="512" class="mt-image-none" style="" /></span>
-->
<mt:include module="仮想物理実験室　コンテンツ" />

]]>
        
    </content>
</entry>

<entry>
    <title>VisualC++ と OpenGL を利用した仮想物理実験室【2-8-1】ばね弾性力による運動の運動方程式とアルゴリズム</title>
    <link rel="alternate" type="text/html" href="http://www.natural-science.or.jp/article/20100830000939.php" />
    <id>tag:www.natural-science.or.jp,2010://12.9839</id>

    <published>2010-08-29T15:09:39Z</published>
    <updated>2010-08-29T15:13:17Z</updated>

    <summary> ここまで、重力と空気抵抗力の２つの力[N]という物理量を定義し、そのシミュレー...</summary>
    <author>
        <name>遠藤 理平</name>
        <uri>http://www.natural-science.or.jp/article/members/cat-12/</uri>
    </author>
    
        <category term="仮想物理実験室" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="アルゴリズム" label="アルゴリズム" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="ばね弾性力" label="ばね弾性力" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="運動方程式" label="運動方程式" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ja" xml:base="http://www.natural-science.or.jp/">
        <![CDATA[<p>
ここまで、<span style="font-weight:600">重力</span>と<span style="font-weight:600">空気抵抗力</span>の２つの<span>力[N]という物理量を定義し、そのシミュレーションを行ないました。
そして、初期値（初期位置、初期速度など）を設定することで、様々な運動を行なうことを理解しました。

本節では、<span style="font-weight:600">ばね弾性力</span>という力を定義します。
ばね弾性力とは、その名のとおり、ばねを引いたときの元に戻ろうとする力（復元力）のことで、
我々の日常生活でも非常におなじみの力です。
</p>
<p style="text-align:center">
<img src="http://www.natural-science.or.jp/images/20100222-02.gif" alt="" />
</p>
<p>
ボールと箱がばねでつながれていて、x軸方向にばねが伸び縮みする系を考えます。
上図は、ばねが<span style="font-weight:600">自然長</span>で長さが L[m] で、ボールには何の力もかかっていない状態であるとします。この状態からボールを x軸方向に動かすと、ばねが自然長から変位します。変位したばねが戻ろうとして、変位と反対方向に力が発生します。これが<span style="font-weight:600">ばね弾性力</span>と呼ばれる力です。
</p>
<p style="text-align:center">
<img src="http://www.natural-science.or.jp/images/20100222-03.gif" alt="" />
</p>
<p>
ばね弾性力は、ばねの変位 ΔL に対して比例の関係があります。
。ばねの変位を ΔL[m] は、上図からわかるとおり、
</p>
<div class="waku">
<div style="float:right">(2.8.5)</div>
<img src="http://www.natural-science.or.jp/images/20100222-08.gif" alt="" />
</div>
<p>
となります。
</p>
<h4>ばね弾性力とばねの変位の関係</h4>
<div class="waku">
<div style="float:right">(2.8.1)</div>
<img src="http://www.natural-science.or.jp/images/20100222-04.gif" alt="" />
</div>
<p>
また、力の単位である[N]は、<a href="http://www.natural-science.or.jp/article/20100110005549.php">【５日目】 重力加速度、重力、ニュートンの運動方程式</a>で定義したとおり、
</p>
<div class="waku">
<div style="float: right;">(2.8.2)</div>
<img src="http://www.natural-science.or.jp/images/20100104-05.gif" alt="Nの定義">
</div>
<p>
なので、比例定数の単位は[kg m/s^2]と決まります。ばね弾性力における比例定数は、<span style="font-weight:600">ばね定数</span>と呼ばれます。
</p>

<h3>物理量：ばね弾性力[N]とばね定数[kg/s^2]</h3>
<div class="waku">
<div style="float:right">(2.8.3)</div>
<img src="http://www.natural-science.or.jp/images/20100222-05.gif" alt="" />
</div>
<p>
ばね弾性力を f_x[N]、ばね定数を k[kg m/s^2]、ばねの変位を ΔL[m] と表すと、
上記の関係は次の式で書くことができます。
</p>
<div class="waku">
<div style="float:right">(2.8.4)</div>
<img src="http://www.natural-science.or.jp/images/20100222-06.gif" alt="" />
</div>
<p>
この関係式は<span style="font-weight:600">フックの法則</span>として知られています
</p>




<h2>ばね弾性力がある場合の運動方程式</h2>
<p>
ばね弾性力以外にボールに力が働かないとすると、
ボールに作用するすべての力 F[N] は、ばね弾性力 f_x[N] のみとなります。
x,y,z 成分それぞれに作用する力は、
</p>
<div class="waku">
<div style="float:right">(2.8.6)</div>
<img src="http://www.natural-science.or.jp/images/20100222-07.gif" alt="力" />
</div>
<p>
となります。式(10-6)を<a href="http://www.natural-science.or.jp/article/20100110005549.php">【５日目】 重力加速度、重力、ニュートンの運動方程式</a>で導出したニュートンの運動方程式
</p>
<div class="waku">
<div style="float:right">(2.8.6)</div>
<img src="http://www.natural-science.or.jp/images/20100203-01.gif" alt="ニュートンの運動方程式" />
</div>
<p>
に代入することで、ばね弾性力がある場合のボールの運動方程式が得られます。
</p>
<div class="waku">
<div style="float:right">(2.8.7)</div>
<img src="http://www.natural-science.or.jp/images/20100222-09.gif" alt="ニュートンの運動方程式" />
</div>
<p>
ばね弾性力を考慮すると、x 軸方向のボールの加速度 a_x[m/s^2]は、<span style="font-weight:600">質量 m[kg]に反比例</span>することがわかります。つまり上式は、「<span style="font-weight:600">ばね弾性力による加速度は重いほど小さく、軽いほど大きくなる</span>」ことを意味しています。これは、直感的に成り立っていることがわかります。
</p>
<h2>ばね弾性力による運動のアルゴリズムの導出</h2>
<p>
式(2.8.7)として得られたニュートンの運動方程式を<a href="http://www.natural-science.or.jp/article/20100111001518.php">【６日目】重力による運動：自由落下</a>と同様に、コンピュータでシミュレーションするためのアルゴリズム導出します。
式(2.8.7)を差分で表すと、
</p>
<div class="waku">
<div style="float:right">(2.8.8)</div>
<img src="http://www.natural-science.or.jp/images/20100222-10.gif" alt="差分方程式" />
</div>
<p>
となります。上式は、<span style="font-weight:600">t = t_n[s] のときの加速度 a_n[m/s^2] は、そのときの速度 v_n[m/s]</span>で得られることを表しています。得られた加速度と<a href="http://www.natural-science.or.jp/article/20091225234208.php">等加速度直線運動のアルゴリズム</a>を用いることで、速度 v[m/s] と位置 x[m]とを決定することができます。
</p>
<div class="waku">
<div style="float:right">(2.8.9)</div>
<img src="http://www.natural-science.or.jp/images/20100206-01.gif" alt="速度" />
</div><br />
<div class="waku">
<div style="float:right">(2.8.10)</div>
<img src="http://www.natural-science.or.jp/images/20100206-02.gif" alt="位置" />
</div>
<p>
本節では、ばねの変位を x軸方向に限定しているので、初期位置 x_0, 初速度 v_{x0} を指定することで、様々な運動のシミュレーションを行うことができます。
次節では、具体的なシミュレーションを行ないます。
</p>
<p style="text-align:center">
<span class="mt-enclosure mt-enclosure-image" style="display: inline;"><img alt="20100222-01.gif" src="http://www.natural-science.or.jp/images/20100222-01.gif" width="512" height="512" class="mt-image-none" style="" /></span>
</p>
<mt:include module="仮想物理実験室　コンテンツ" />

]]>
        
    </content>
</entry>

<entry>
    <title>VisualC++ と OpenGL を利用した仮想物理実験室【2-7-1】重力＋空気抵抗力による斜方投射運動のシミュレーション</title>
    <link rel="alternate" type="text/html" href="http://www.natural-science.or.jp/article/20100829233752.php" />
    <id>tag:www.natural-science.or.jp,2010://12.9838</id>

    <published>2010-08-29T14:37:52Z</published>
    <updated>2010-08-29T14:49:17Z</updated>

    <summary> 【２－６】重力＋空気抵抗力による運動：自由落下運動と同様に、【2-6-1】重力...</summary>
    <author>
        <name>遠藤 理平</name>
        <uri>http://www.natural-science.or.jp/article/members/cat-12/</uri>
    </author>
    
        <category term="仮想物理実験室" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="シミュレーション" label="シミュレーション" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="斜方投射運動" label="斜方投射運動" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="空気抵抗" label="空気抵抗" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="重力" label="重力" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ja" xml:base="http://www.natural-science.or.jp/">
        <![CDATA[<p>
【２－６】<a href="http://www.natural-science.or.jp/article/20100206212544.php">重力＋空気抵抗力による運動：自由落下運動</a>と同様に、<a href="http://www.natural-science.or.jp/article/20100829225427.php">【2-6-1】重力＋空気抵抗力による運動の運動方程式とアルゴリズム</a>にて導出した重力と空気抵抗力がある場合の運動方程式と、コンピュータでシミュレーションを行うためのアルゴリズムを用います。
本節では、重力＋空気抵抗力がある場合の<span>斜方投射運動</span>のシミュレーションを行ないます。
<a href="http://www.natural-science.or.jp/article/20100127224657.php">【２－５】重力による運動：斜方投射運動２</a>と同様に初速度を三角関数を用いて斜めに打ち上げます。
</p>
<p style="text-align:center">
<img src="http://www.natural-science.or.jp/images/20100125-01.gif" alt="" />
</p>

<h2>重力＋空気抵抗力による運動のための計算アルゴリズム</h2>
<h4>速度・位置を逐次計算するアルゴリズム</h4>
<pre>
//位置の計算
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;    //&lt;-----空気抵抗力からの寄与
ay = -k/m * vy;    //&lt;-----空気抵抗力からの寄与
az = -g -k/m * vy; //&lt;-----重力＋空気抵抗力からの寄与
</pre>
<p>
<a href="http://www.natural-science.or.jp/article/20100111001518.php">【9.1日目】重力による運動：斜方投射運動２</a>の場合と比較して、質量m[kg]と空気抵抗係数 k[kg/s]が加えられています。
</p>
<h2>重力＋空気抵抗力による斜方投射運動のシミュレーション</h2>
<p>
質量を 0.1[kg]から 1.0[kg]まで変化させた１０個のボールを、
初速度 70[m/s]、角度60°で打ち上げたシミュレーションを行ないます。
軽いほど空気抵抗力の影響で、x軸方向の速度は 0[m/s]となることが確認できます。
</p>
<div style="text-align:center">
<object width="425" height="344"><param name="movie" value="http://www.youtube.com/v/vA0P5lNtdDA&hl=ja&fs=1"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/vA0P5lNtdDA&hl=ja&fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"></embed></object>
</div>

<h2>VisualC++ ＋ OpenGL プログラミング</h2>
<p>
<a href="http://www.natural-science.or.jp/article/20100206212544.php">【11日目】重力＋空気抵抗力による運動：自由落下運動</a>と同様に「<a href="http://www.natural-science.or.jp/article/20091209225032.php">【０日目】仮想物理実験室の構築 （ver1.0）</a>」をベースにプログラミングします。上記で解説した逐次計算を行うアルゴリズムをプログラミングします。
</p>
<h3>仮想物理実験室変数の定義</h3>
<pre>
//--------------------------------------------------------
// 仮想物理実験室変数の定義
//--------------------------------------------------------
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&lt;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;
  }
}</pre>
<p>
ボールの位置「x,y,z」、速度「vx,vy,vz」、加速度「ax,ay,az」に加えて、
質量 m[kg]も構造体「BALL」のメンバとします。「BALL」型の変数「ball1」を宣言と同時に初期値を設定しています。
</p>
<h3>速度・位置を逐次計算するアルゴリズム</h3>
<pre>
//--------------------------------------------------------
// 計算と物体の描画
//--------------------------------------------------------
void Calculate(){
  t = dt * double(tn);
  for(int i=0; i&lt;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, &amp;ms_ruby.shininess);
    glTranslated(ball1.x, ball1.y, ball1.z); //平行移動値の設定
    glutSolidSphere(4.0, 20, 20);            //引数：(半径, Z軸まわりの分割数, Z軸に沿った分割数)
  glPopMatrix();
}
</pre>
<p>
位置「ball1.x」「ball1.y」「ball1.z」<br />
速度「ball1.vx」「ball1.vy」「ball1.vz」<br />
加速度「ball1.ax」「ball1.ay」「ball1.az」<br />
を逐次計算します。
</p>

<!--
<span class="mt-enclosure mt-enclosure-image" style="display: inline;"><img alt="20100125-01_.gif" src="http://www.natural-science.or.jp/images/20100125-01_.gif" width="414" height="183" class="mt-image-none" style="" /></span>
-->

<mt:include module="仮想物理実験室　コンテンツ" />

]]>
        
    </content>
</entry>

<entry>
    <title>VisualC++ と OpenGL を利用した仮想物理実験室【2-6-2】重力＋空気抵抗力による自由落下運動のシミュレーション</title>
    <link rel="alternate" type="text/html" href="http://www.natural-science.or.jp/article/20100829232938.php" />
    <id>tag:www.natural-science.or.jp,2010://12.9837</id>

    <published>2010-08-29T14:29:38Z</published>
    <updated>2010-08-29T14:30:21Z</updated>

    <summary> 前節重力＋空気抵抗力による運動の運動方程式とアルゴリズムでは、 重力と空気抵抗...</summary>
    <author>
        <name>遠藤 理平</name>
        <uri>http://www.natural-science.or.jp/article/members/cat-12/</uri>
    </author>
    
        <category term="仮想物理実験室" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="シミュレーション" label="シミュレーション" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="空気抵抗力" label="空気抵抗力" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="自由落下運動" label="自由落下運動" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="重力" label="重力" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ja" xml:base="http://www.natural-science.or.jp/">
        <![CDATA[<p>
前節<a href="http://www.natural-science.or.jp/article/20100829225427.php">重力＋空気抵抗力による運動の運動方程式とアルゴリズム</a>では、
重力と空気抵抗力がある場合の運動方程式の導出と、コンピュータでシミュレーションを行うためのアルゴリズムの導出を行ないました。
t=t_n[s]のときの加速度 a_n[m/s^2]は、
</p>
<div class="waku">
<div style="float:right">(2.6.1)</div>
<img src="http://www.natural-science.or.jp/images/20100206-03.gif" alt="差分方程式" />
</div>
<p>
と、そのときの速度 v_n[m/s]によって決まる値となります。
あとは、加速度 a[m/s^2]から速度 v[m/s]、位置 x[m]を順番に計算することで、重力＋空気抵抗力のある場合のシミュレーションを行うことができます。
今回は、<span style="font-weight:600">重力＋空気抵抗力</span>における自由落下運動のシミュレーションを行います。位置、速度の初期値は【２－１】<a href="http://www.natural-science.or.jp/article/20100111001518.php">重力による運動：自由落下運動</a>と同様、初期位置（x_0, y_0, z_0）, 初速度(v_{x0}, v_{y0}, v_{z0}) を指定します。
</p>
<h2>重力＋空気抵抗力による運動のための計算アルゴリズム</h2>
<h4>位置・速度・加速度の初期値（自由落下）</h4>
<pre>
g = 9.80665 //重力加速度
k = 10.0 //空気抵抗係数
m = 1.0  //ボールの質量
// 位置・速度・加速度の初期値 
x = 0.0;
y = 0.0;
z = 80.0;
vx = 0.0;
vy = 0.0;
vz = 0.0;
ax = 0.0;
ay = 0.0;
az = -g;
</pre>
<h4>速度・位置を逐次計算するアルゴリズム</h4>
<pre>
//位置の計算
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;    //&lt;-----空気抵抗力からの寄与
ay = -k/m * vy;    //&lt;-----空気抵抗力からの寄与
az = -g -k/m * vy; //&lt;-----重力＋空気抵抗力からの寄与
</pre>
<p>
<a href="http://www.natural-science.or.jp/article/20100111001518.php">【６日目】重力による運動：自由落下</a>の場合と比較して、質量m[kg]と空気抵抗係数 k[kg/s]が加えられています。
</p>
<h2>重力＋空気抵抗力による自由落下運動のシミュレーション</h2>
<p>
質量を 0.1[kg]から 1.0[kg]まで変化させた１０個のボールを、
z = 80[m]の位置からの自由落下運動させたときのシミュレーションを行ないます。
軽いほど空気抵抗力の影響が大きく、結果として等速直線運動のように見えます。
</p>
<div style="text-align:center">
<object width="425" height="344"><param name="movie" value="http://www.youtube.com/v/h4dntQnpvKA&hl=ja&fs=1"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/h4dntQnpvKA&hl=ja&fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"></embed></object>
</div>


<h2>VisualC++ ＋ OpenGL プログラミング</h2>
<p>
<a href="http://www.natural-science.or.jp/article/20100111001518.php">【６日目】重力による運動：自由落下</a>と同様に「<a href="http://www.natural-science.or.jp/article/20091209225032.php">【０日目】仮想物理実験室の構築 （ver1.0）</a>」をベースにプログラミングします。上記で解説した逐次計算を行うアルゴリズムをプログラミングします。
</p>
<h3>仮想物理実験室変数の定義</h3>
<pre>
//--------------------------------------------------------
// 仮想物理実験室変数の定義
//--------------------------------------------------------
double t = 0.0;     //時刻
double dt= 0.01;    //時間刻み
int tn = 0;         //ステップ数
double g = 9.80665; //重力加速度 g
double k  = 10.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++ ){
    ball[i].m = 0.1*double(i+1);//質量の設定
    ball[i].x  = 0.0;
    ball[i].y  = 0.0;
    ball[i].z  = 80.0;
    ball[i].vx = 0.0;
    ball[i].vy = 0.0;
    ball[i].vz = 0.0;
    ball[i].ax = 0.0;
    ball[i].ay = 0.0;
    ball[i].az = -g;
  }
}
</pre>
<p>
ボールの位置「x,y,z」、速度「vx,vy,vz」、加速度「ax,ay,az」に加えて、
質量 m[kg]も構造体「BALL」のメンバとします。「BALL」型の変数「ball1」を宣言と同時に初期値を設定しています。
</p>
<h3>速度・位置を逐次計算するアルゴリズム</h3>
<pre>
//--------------------------------------------------------
// 計算と物体の描画
//--------------------------------------------------------
void Calculate(){
  t = dt * double(tn);
  //ofs1 &lt;&lt; dt*tn &lt;&lt; &quot; &quot; &lt;&lt; ball1.x &lt;&lt; &quot; &quot; &lt;&lt; ball1.vx &lt;&lt; &quot; &quot; &lt;&lt; ball1.ax &lt;&lt;endl;
  for(int i=0; i&lt;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, &amp;ms_ruby.shininess);
    glTranslated(ball1.x, ball1.y, ball1.z); //平行移動値の設定
    glutSolidSphere(4.0, 20, 20);            //引数：(半径, Z軸まわりの分割数, Z軸に沿った分割数)
  glPopMatrix();
}
</pre>
<p>
位置「ball1.x」「ball1.y」「ball1.z」<br />
速度「ball1.vx」「ball1.vy」「ball1.vz」<br />
加速度「ball1.ax」「ball1.ay」「ball1.az」<br />
を逐次計算します。
</p>
<p>
<span class="mt-enclosure mt-enclosure-image" style="display: inline;"><img alt="20100110-05.gif" src="http://www.natural-science.or.jp/images/20100110-05.gif" width="512" height="512" class="mt-image-none" style="" /></span>
</p>
<mt:include module="仮想物理実験室　コンテンツ" />
]]>
        
    </content>
</entry>

<entry>
    <title>VisualC++ と OpenGL を利用した仮想物理実験室【2-6-1】重力＋空気抵抗力による運動の運動方程式とアルゴリズム</title>
    <link rel="alternate" type="text/html" href="http://www.natural-science.or.jp/article/20100829225427.php" />
    <id>tag:www.natural-science.or.jp,2010://12.9836</id>

    <published>2010-08-29T13:54:27Z</published>
    <updated>2010-08-29T14:23:02Z</updated>

    <summary> 【2-1-1】加速度・力・質量の関係：ニュートンの運動方程式で導出したニュート...</summary>
    <author>
        <name>遠藤 理平</name>
        <uri>http://www.natural-science.or.jp/article/members/cat-12/</uri>
    </author>
    
        <category term="仮想物理実験室" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="アルゴリズム" label="アルゴリズム" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="空気抵抗" label="空気抵抗" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="運動方程式" label="運動方程式" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="重力" label="重力" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ja" xml:base="http://www.natural-science.or.jp/">
        <![CDATA[
<p>
<a href="http://www.natural-science.or.jp/article/20100110005549.php">【2-1-1】加速度・力・質量の関係：ニュートンの運動方程式</a>で導出したニュートンの運動方程式から、<a href="http://www.natural-science.or.jp/article/20100829144539.php">【2-1-2】重力による運動のアルゴリズムの導出</a>では、重力による運動のアルゴリズムを導出しました。
</p>
<div class="waku">
<div style="float:right">(2.6.1)</div>
<img src="http://www.natural-science.or.jp/images/2010012.6.04.gif" alt="時刻 t=tn[s] におけるニュートンの運動方程式" />
</div>
<p>
初速度の設定によって、様々な運動をすることをシミュレーションしました。
簡単にまとめると以下のとおりです。<br />
<br />
■初速度なし：<a href="http://www.natural-science.or.jp/article/20100111001518.php">自由落下運動</a><br />
■初速度 v_{z0}：<a href="http://www.natural-science.or.jp/article/20100112235205.php">鉛直投射運動</a><br />
■初速度 v_{x0}：<a href="http://www.natural-science.or.jp/article/20100113204237.php">水平投射運動</a><br />
■初速度 v_{z0}と v_{x0}：<a href="http://www.natural-science.or.jp/article/20100120211317.php">斜方投射運動</a><br />
■初速度 v_{0}と投射角度θ：<a href="http://www.natural-science.or.jp/article/20100127224657.php">斜方投射運動２</a><br />
</p>
<p>
これまでの運動はすべて、物体に作用している力が<span style="font-weight:600">重力</span>のみの場合でした。しかしながら、日常の体験では、投げられたボールは<span style="font-weight:600">空気抵抗</span>によって飛距離が伸びないことを知っています。
本節では、<span style="font-weight:600">空気抵抗</span>を加味した運動方程式を導出し、シミュレーションのためのアルゴリズムを構築します。
</p>
<h2>空気抵抗とは</h2>
<p>
本節では、無風の状態を考えます。
無風の中でじっとしている場合、我々は重力を除いて他に力を受けていません。
また、車から手を少し出した場合、手は車の進行方向とは逆に力を受けます。
さらに車の速度が上がるほど、手が受ける力は大きくなります。
運動しているボールの場合を考えた場合、、ボールにかかる空気抵抗力に次の関係があると<span style="color:red;font-weight:600">仮定</span>します。
</p>
<div class="waku">
<div style="float:right">(2.6.2)</div>
<img src="http://www.natural-science.or.jp/images/20100128-01.gif" alt="空気抵抗力と速度の関係" />
</div>
<p>
上記の関係は空気抵抗力と速度とが<span style="font-weight:600">比例関係</span>にあることを表現しています。
マイナスをつけたのは、ボールが感じる空気抵抗力が、進んでいる方向とは逆の方向にかかっていることを表すためです。
「<span style="font-weight:600">空気抵抗力</span>」とは、ボールの形状や変形、回転、ボール周辺の空気の流れなどを全部加味した、非常に複雑な振る舞いによる力です。本節ではそのような複雑な議論には入らずに、ボールは速いほど空気抵抗力は大きくなるという日常の経験的な因果関係から、速度と空気抵抗力は<span style="font-weight:600">比例関係</span>であると「<span style="color:red;font-weight:600">仮定</span>」します。</p>
<p>
また、力の単位である[N]は、<a href="http://www.natural-science.or.jp/article/20100110005549.php">【2-1-1】加速度・力・質量の関係：ニュートンの運動方程式</a>で定義したとおり、
</p>
<div class="waku">
<div style="float:right">(2.6.3)</div>
<img src="http://www.natural-science.or.jp/images/20100104-05.gif" alt="Nの定義" />
</div>
<p>
なので、比例定数の単位は[kg/s]と決まります。
</p>
<h3>物理量：空気抵抗力</h3>
<div class="waku">
<div style="float:right">(2.6.4)</div>
<img src="http://www.natural-science.or.jp/images/20100128-02.gif" alt="空気抵抗力と速度の関係" />
</div>
<p>
この関係がx軸, y軸, z軸それぞれに対して成り立つとすると、
空気抵抗力 f[N] は次のようになります。
</p>
<div class="waku">
<div style="float:right">(2.6.5)</div>
<img src="http://www.natural-science.or.jp/images/20100201-01.gif" alt="空気抵抗力と速度の関係式" />
</div>


<h2>重力＋空気抵抗力がある場合の運動方程式</h2>
<p>
ボールに作用する力 F[N] は、-z 軸方向の重力と速度に比例する空気抵抗力の合力となります。
x,y,z 成分それぞれに作用する力は、
</p>
<div class="waku">
<div style="float:right">(2.6.6)</div>
<img src="http://www.natural-science.or.jp/images/20100203-02.gif" alt="力" />
</div>
<p>
となります。式(2.6.6)を<a href="http://www.natural-science.or.jp/article/20100110005549.php">【2-1-1】加速度・力・質量の関係：ニュートンの運動方程式</a>で導出したニュートンの運動方程式
</p>
<div class="waku">
<div style="float:right">(2.6.7)</div>
<img src="http://www.natural-science.or.jp/images/20100203-01.gif" alt="ニュートンの運動方程式" />
</div>
<p>
に代入することで、空気抵抗がある場合のボールの運動方程式が得られます。
</p>
<div class="waku">
<div style="float:right">(2.6.8)</div>
<img src="http://www.natural-science.or.jp/images/20100203-03.gif" alt="ニュートンの運動方程式" />
</div>
<p>
空気抵抗を考慮すると、これまでボールの運動に関与しなかった<span style="font-weight:600">質量</span>がでてきます。
上式の x 成分を見ると、ボールの加速度 a_x[m/s^2]は、<span style="font-weight:600">質量 m[kg]に反比例</span>することがわかります。つまり上式は、「<span style="font-weight:600">空気抵抗力による加速度は重いほど小さく、軽いほど大きくなる</span>」ことを意味しています。
これは、直感的に成り立っていることがわかります。
</p>
<h2>重力＋気抵抗力による運動のアルゴリズムの導出</h2>
<p>
式(2.6.8)として得られたニュートンの運動方程式を【２－１】<a href="http://www.natural-science.or.jp/article/20100111001518.php">重力による運動：自由落下運動</a>と同様に、コンピュータでシミュレーションするためのアルゴリズム導出します。
式(2.6.8)を差分で表すと、
</p>
<div class="waku">
<div style="float:right">(2.6.9)</div>
<img src="http://www.natural-science.or.jp/images/20100206-03.gif" alt="差分方程式" />
</div>
<p>
となります。上式は、<span style="font-weight:600">t = t_n[s] のときの加速度 a_n[m/s^2] は、そのときの速度 v_n[m/s]</span>で得られることを表しています。得られた加速度と<a href="http://www.natural-science.or.jp/article/20091225234208.php">等加速度直線運動のアルゴリズム</a>を用いることで、速度 v[m/s] と位置 x[m]とを決定することができます。
</p>
<div class="waku">
<div style="float:right">(2.6.10)</div>
<img src="http://www.natural-science.or.jp/images/20100206-01.gif" alt="速度" />
</div><br />
<div class="waku">
<div style="float:right">(2.6.11)</div>
<img src="http://www.natural-science.or.jp/images/20100206-02.gif" alt="位置" />
</div>
<p>
初期位置（x_0, y_0, z_0）, 初速度(v_{x0}, v_{y0}, v_{z0}) を指定することで、様々な運動のシミュレーションを行うことができます。
次節は、<span style="font-weight:600">重力＋空気抵抗力＋自由落下運動</span>のシミュレーションを行います。
</p>

<!--
<span class="mt-enclosure mt-enclosure-image" style="display: inline;"><img alt="20100203-04.gif" src="http://www.natural-science.or.jp/images/20100203-04.gif" width="500" height="226" class="mt-image-none" style="" /></span>
-->
<mt:include module="仮想物理実験室　コンテンツ" />

]]>
        
    </content>
</entry>

<entry>
    <title>VisualC++ と OpenGL を利用した仮想物理実験室【2-5-2】重力による斜方投射運動２のシミュレーション</title>
    <link rel="alternate" type="text/html" href="http://www.natural-science.or.jp/article/20100829223635.php" />
    <id>tag:www.natural-science.or.jp,2010://12.9835</id>

    <published>2010-08-29T13:36:35Z</published>
    <updated>2010-08-29T13:45:15Z</updated>

    <summary> 【2-5-1】重力による斜方投射運動における初速度の分解にて導入した初期値を用...</summary>
    <author>
        <name>遠藤 理平</name>
        <uri>http://www.natural-science.or.jp/article/members/cat-12/</uri>
    </author>
    
        <category term="仮想物理実験室" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="シミュレーション" label="シミュレーション" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="斜方投射" label="斜方投射" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="重力" label="重力" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ja" xml:base="http://www.natural-science.or.jp/">
        <![CDATA[<p>
<a href="http://www.natural-science.or.jp/article/20100829223554.php">【2-5-1】重力による斜方投射運動における初速度の分解</a>にて導入した初期値を用いて、斜方投射運動のシミュレーションを行います。初速度 v_0[m/s]を固定したまま、投射角度θを変更します。
θ= 0°～ 90°まで、10°刻みで変えて投射するシミュレーションを行ないます。
当然、角度によって v_{x0}と v_{z0}とが変わり運動の様子が変化しますが、
それぞれ z軸方向の<a href="http://www.natural-science.or.jp/article/20091225234208.php">等加速度直線運動</a>と、x軸方向の<a href="http://www.natural-science.or.jp/article/20091223172523.php">等速直線運動</a>であることは変わりません。
</p>

<div style="text-align:center">
<object width="425" height="344"><param name="movie" value="http://www.youtube.com/v/1Ul_asJPWqQ&hl=ja&fs=1"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/1Ul_asJPWqQ&hl=ja&fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"></embed></object>
</div>

<h2>VisualC++ ＋ OpenGL プログラミング</h2>
<p>
<a href="http://www.natural-science.or.jp/article/20100113204237.php">【９日目】重力による運動：斜方投射運動</a>の初期値を変更することで、シミュレーションを行ないます。
</p>
<h3>仮想物理実験室変数の定義</h3>
<pre>
//--------------------------------------------------------
// 仮想物理実験室変数の定義
//--------------------------------------------------------
double t = 0.0;     //時刻
double dt= 0.03;    //時間刻み
int tn = 0;         //ステップ数
double g = 9.80665; //重力加速度 g
double degree;      //角度：度（°）
double radian;      //角度：ラジアン(rad)
double v0=40.0;     //初速度

// ボールの定義
struct BALL {
  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&lt;N; i++ ){
    degree = 10.0 * double(i);        //度数法で表現
    radian = 2.0 * PI * degree/360.0; //弧度法への変換
    ball[i].x  = -50.0;
    ball[i].y  = 0.0;
    ball[i].z  = 0.0;
    ball[i].vx = v0 * sin(radian);
    ball[i].vy = 0.0;
    ball[i].vz = v0 * cos(radian);
    ball[i].ay = 0.0;
    ball[i].az = -g;
  }
}
</pre>
<p>
ボールを１０個用意して、それぞれの投射角度を１０°ずつ変更します。
</p>
<h4>計算と物体の描画</h4>
<pre>
void Calculate(){
  t = dt * double(tn);
  for(int i=0; i&lt;N; i++){
    //速度の算出
    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].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;
  }
 tn++;
}
void DrawStructure(){
  for(int i=0; i&lt;N; i++){
    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, &amp;ms_ruby.shininess);
      glTranslated(ball[i].x, ball[i].y, ball[i].z); //平行移動値の設定
      glutSolidSphere(4.0, 20, 20);            //引数：(半径, Z軸まわりの分割数, Z軸に沿った分割数)
    glPopMatrix();
  }
}
</pre>
<p>
i 番目のボールの
位置「ball[i].x」「ball[i].y」「ball[i].z」<br />
速度「ball[i].vx」「ball[i].vy」「ball[i].vz」<br />
加速度「ball1.ax」「ball[i].ay」「ball[i].az」<br />
を逐次計算します。水平方向には<a href="http://www.natural-science.or.jp/article/20091223172523.php">等速直線運動</a>、鉛直方向（z軸方向）には、重力による<a href="http://www.natural-science.or.jp/article/20091223172523.php">等加速度直線運動</a>を行ないます。初期値として、v_{z0}と v_{x0} を設定することでシミュレーションすることができます。
</p>
<p>
<span class="mt-enclosure mt-enclosure-image" style="display: inline;"><img alt="20100127-01.gif" src="http://www.natural-science.or.jp/images/20100127-01.gif" width="512" height="512" class="mt-image-none" style="" /></span>
</p>
<mt:include module="仮想物理実験室　コンテンツ" />
]]>
        
    </content>
</entry>

<entry>
    <title>VisualC++ と OpenGL を利用した仮想物理実験室【2-5-1】重力による斜方投射運動における初速度の分解</title>
    <link rel="alternate" type="text/html" href="http://www.natural-science.or.jp/article/20100829223554.php" />
    <id>tag:www.natural-science.or.jp,2010://12.9834</id>

    <published>2010-08-29T13:35:54Z</published>
    <updated>2010-08-29T13:54:20Z</updated>

    <summary> 【２－４】重力による運動：斜方投射運動では、【2-1-2】重力による運動のアル...</summary>
    <author>
        <name>遠藤 理平</name>
        <uri>http://www.natural-science.or.jp/article/members/cat-12/</uri>
    </author>
    
        <category term="仮想物理実験室" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="初速度" label="初速度" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="斜方投射" label="斜方投射" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="重力" label="重力" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ja" xml:base="http://www.natural-science.or.jp/">
        <![CDATA[<p>
<a href="http://www.natural-science.or.jp/article/20100120211317.php">【２－４】重力による運動：斜方投射運動</a>では、<a href="http://www.natural-science.or.jp/article/20100829144539.php">【2-1-2】重力による運動のアルゴリズムの導出</a>で導出したニュートンの運動方程式を用いて、<span style="font-weight:600">初期値</span>として x 軸方向の初速度 v_{x0}と z 軸方向の初速度 v_{z0} 設定することで、斜方投射運動をシミュレーション行ないましました。
前回と同じ斜方投射運動のシミュレーションですが、初期値の与え方を変えます。これまでのとおり、<a href="http://www.natural-science.or.jp/article/20100829144539.php">【2-1-2】重力による運動のアルゴリズムの導出</a>で導出したニュートンの運動方程式のアルゴリズムからスタートします。
</p>
<div class="waku">
<div style="float:right">(9.1-1)</div>
<img src="http://www.natural-science.or.jp/images/20100110-04.gif" alt="時刻 t=tn[s] におけるニュートンの運動方程式" />
</div>
<h2>斜方放射運動の初期値２</h2>
<p>
<a href="http://www.natural-science.or.jp/article/20100120211317.php">【２－４】重力による運動：斜方投射運動</a>では、v_{z0}を一定として、v_{x0}の値を変化させ場合のシミュレーションを行ないました。v_{z0}と v_{x0}の組み合わせで、初速度 v_0 を計算することができました。
</p>
<div class="waku">
<div style="float:right">(9.1-2)</div>
<img src="http://www.natural-science.or.jp/images/20100118-02.gif" alt="" />
</div>
<p>
今度は逆に、初速度 v_0 と<span style="font-weight:600">角度θ</span>で運動の初期条件を表現します。多分、多くの人はボールを斜方に投げるとき、z 軸方向の初速度○○、x 軸方向の初速度△△、といったことをイメージしながら投げるということをしていないので、今回の表現のほうが自然ではないでしょうか。
</p>
<h3>定義：三角比</h3>
<p>
x-y 平面に長さ１の円を配置し、x 軸方向から y軸方向へ、なす角度θで直線を描きます。
円との交点から x軸と y軸に垂線を下ろします。
そのときの原点0 と垂線と x 軸との交点までの長さを cosθ、
原点と y 軸との交点までの長さを sinθ と表します。
</p>
<p style="text-align:center">
<img src="http://www.natural-science.or.jp/images/20100125-02.gif" alt="速度の分解" />
</p>
<p>
cosθと sinθ は、θの値が変わると変化します。
例えば、<br />
θ=0° → cosθ = 1, sinθ = 0<br />
θ=30°→ cosθ = √3/2 , sinθ = 1/2<br />
θ=45°→ cosθ = 1/√2 , sinθ = 1/√2<br />
θ=60°→ cosθ = 1/2   , sinθ = √3/2<br />
θ=90°→ cosθ = 0 , sinθ = 1<br />
などは、中学生で学習する<span style="font-weight:600">直角三角形の線分の比</span>と同じで、
<span style="font-weight:600">三平方の定理</span>で計算することができます。
そのほかのθの場合には暗算できませんが、コンピュータが計算してくれるので心配ありません。
</p>
<p>
日常生活において、角度の単位は円周を360等分した量で測る<span style="font-weight:600">度数法（単位：度、記号：°）</span>を用いることが多いです。しかしながら数式で角度を扱う場合、単位円の弧の長さで測る<span style="font-weight:600">弧度法（単位：ラジアン、記号：rad）</span>と呼ばれるものさしを使います。
半径1 の円周の長さは、2π と小学生で学習します。
例えば、<br />
弧の長さが 2π → θ= 360°<br />
弧の長さが π  → θ= 180°<br />
弧の長さが π/2  → θ= 90°<br />
弧の長さが π/3  → θ= 60°<br />
弧の長さが π/4  → θ= 45°<br />
弧の長さが π/6  → θ= 30°<br />
弧の長さが 0  → θ= 0°<br />
と、弧の長さが決まれば、角度θが決まります。
逆の言い方をすれば、弧の長さだけで角度を表すことができるので、
わざわざ度数法の「°」という単位を使う必要がありません。
弧度法では、角度を π[rad]のように指定します。
もともと、πは直径と直径との比という神様が決めた量であるのに対して、
円周を360等分する度数法、たぶん人間が勝手に（歴史的に）決めた量なので、
弧度法のほうがより客観的であることが言えます。
上図の場合、角度がθ[rad]であれば、太線で描いてある弧の長さはθ[m]となります。
（同じθですが、単位が異なります。）
</p>
<h3>物理量：角度[rad]</h3>
<div class="waku">
<div style="float:right">(9.1-3)</div>
<img src="http://www.natural-science.or.jp/images/20100125-03.gif" alt="角度" />
</div>
<p>
コンピュータプログラミングの際も、この弧度法が利用されています。
とはいえ、度数法もこれまで慣れしてきた分、直感的にイメージしやすいので、今後も利用します。
</p>
<h2>初速度の設定</h2>
<p>
以上の三角比を用いて、初速度の z 成分と x 成分とに<span style="font-weight:600">速度の分解</span>を行ないます。
次の図は、x 軸方向から z 軸方向に角度θ の方向に初速度 v_0 の投射した場合です。
</p>
<p style="text-align:center">
<img src="http://www.natural-science.or.jp/images/20100125-01.gif" alt="速度の分解" />
</p>
<p>
初速度 v_0[m/s]に、cos と sin を掛けたものが、z成分 x成分の初速度となります。
この初速度を用いてシミュレーションを行ないます。
</p>
<!--
<span class="mt-enclosure mt-enclosure-image" style="display: inline;"><img alt="20100125-02_.gif" src="http://www.natural-science.or.jp/images/20100125-02_.gif" width="319" height="298" class="mt-image-none" style="" /></span>
-->


<mt:include module="仮想物理実験室　コンテンツ" />
]]>
        
    </content>
</entry>

<entry>
    <title>VisualC++ と OpenGL を利用した仮想物理実験室【2-4-1】重力による水平投射運動のシミュレーション</title>
    <link rel="alternate" type="text/html" href="http://www.natural-science.or.jp/article/20100829222458.php" />
    <id>tag:www.natural-science.or.jp,2010://12.9833</id>

    <published>2010-08-29T13:24:58Z</published>
    <updated>2010-08-29T13:25:54Z</updated>

    <summary> 【２－３】重力による運動：水平投射運動では、【2-1-2】重力による運動のアル...</summary>
    <author>
        <name>遠藤 理平</name>
        <uri>http://www.natural-science.or.jp/article/members/cat-12/</uri>
    </author>
    
        <category term="仮想物理実験室" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="シミュレーション" label="シミュレーション" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="水平投射" label="水平投射" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="重力" label="重力" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ja" xml:base="http://www.natural-science.or.jp/">
        <![CDATA[<p>
<a href="http://www.natural-science.or.jp/article/20100113204237.php">【２－３】重力による運動：水平投射運動</a>では、<a href="http://www.natural-science.or.jp/article/20100829144539.php">【2-1-2】重力による運動のアルゴリズムの導出</a>で導出したニュートンの運動方程式を用いて、<span style="font-weight:600">初期値</span>として x 方向の初速度 v_{x0} 設定することで、水平投射運動をシミュレーション行ないましました。
今回は、<span style="font-weight:600">斜方投射運動</span>と呼ばれる運動をシミュレーションします。
</p>
<div class="waku">
<div style="float:right">(2.4-1)</div>
<img src="http://www.natural-science.or.jp/images/20100110-04.gif" alt="時刻 t=tn[s] におけるニュートンの運動方程式" />
</div>
<p>
重力による運動は、上記のアルゴリズムと t=t_0[s]のときの状態、<span style="font-weight:600">初期値</span>を適切に設定することですべての運動を表現することができます。初期値として、v_{x0}を設定することで水平投射運動をシミュレーションしました。さらに異なった初期値に対する運動のシミュレーションを行ないます。
</p>
<h2>斜方放射運動</h2>
<p>
斜方放射運動とは、ボールを斜めに投射する運動をさします。
斜めに投射することは、初期値として z軸方向（鉛直方向）の初速度 v_{z0}と、x軸方向（水平方向）の初速度 v_{x0}を設定することです。つまり、z軸方向の<a href="http://www.natural-science.or.jp/article/20100112235205.php">鉛直投射運動</a>と x軸方向の<a href="http://www.natural-science.or.jp/article/20100113204237.php">水平投射運動</a>を組み合わせた運動となります。
</p>
<p>
<img src="http://www.natural-science.or.jp/images/20100118-01.gif" alt="斜方放射運動の図" />
</p>
<p>
上記の図では、初速度として z軸方向には v_{z0}、x軸方向には v_{x0}を与えたときの様子を表しています。ボールは斜め上の方向への初速度となります。つまり、中学生で学習する<span>三平方の定理</span>を適用することで、初速度の大きさを計算することができます。
</p>
<div class="waku">
<div style="float:right">(9-2)</div>
<img src="http://www.natural-science.or.jp/images/20100118-02.gif" alt="初速度の計算" />
</div>
<p>
また、一般的に初速度をベクトルは
</p>
<div class="waku">
<div style="float:right">(9-3)</div>
<img src="http://www.natural-science.or.jp/images/20100118-03.gif" alt="初速度のベクトル表記" />
</div>
<p>
と表現でます。また、初速度の大きさはベクトルの大きさで表すことができます。
</p>
<div class="waku">
<div style="float:right">(9-4)</div>
<img src="http://www.natural-science.or.jp/images/20100118-04.gif" alt="初速度のベクトル表記" />
</div>
<p>
これも中学生で学習する３次元版の<span>三平方の定理</span>と同じで、３つの辺の長さが v_{x0} v_{y0} v_{z0} の直方体の対角線の長さとなります。「|～|」の記号は、中学生学習する<span style="font-weight:600">絶対値</span>と意味で、この場合、３次元ベクトルの大きさを表します。
中学生では、実数の絶対値（例えば |-4.2|= 4.2 ）について学習しますが、これは単に「-（マイナス）」を消すという操作ではなく、実数も、実数軸方向の１次元のベクトルと考えることができるので、<span>２乗してルート</span>をとるという操作を行なった結果です。
</p>
<h3>位置・速度・加速度の初期値（斜方放射運動）</h3>
<pre>
g = 9.80665 //重力加速度
// 位置・速度・加速度の初期値 
x = -50.0;
y =   0.0;
z = 0.0;
vx = 10.0; //&lt;---------------x軸方向の初期速度を設定
vy = 0.0;
vz = 40.0; //&lt;---------------z軸方向の初期速度を設定
ax = 0.0;
ay = 0.0;
az = -g;  //重力
</pre>

<h2>斜方放射運動のシミュレーション</h2>
<p>
z軸方向の初速度 v_{z0}を 40[m/s]と固定したまま、
x軸方向の初速度 v_{x0}を 0～20[m/s]まで変化させてシミュレーションします。
v_{z0}は一定なので、すべてのボールは同じ高さまで上がり、重力によりすべてのボールは<a href="http://www.natural-science.or.jp/article/20091225234208.php">等加速度直線運動</a>することが確認できます。
また x軸方向には v_{x0} の大きさに応じて<a href="http://www.natural-science.or.jp/article/20091223172523.php">等速直線運動</a>することもわかります。
</p>

<div style="text-align:center">
<object width="425" height="344"><param name="movie" value="http://www.youtube.com/v/F8IflLS8dxE&hl=ja&fs=1"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/F8IflLS8dxE&hl=ja&fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"></embed></object>
</div>


<h2>VisualC++ ＋ OpenGL プログラミング</h2>
<p>
<a href="http://www.natural-science.or.jp/article/20100113204237.php">【２－３】重力による運動：水平投射運動</a>の初期値を変更することで、斜方投射運動のシミュレーションを行ないます。
</p>
<h3>仮想物理実験室変数の定義</h3>
<pre>
//--------------------------------------------------------
// 仮想物理実験室変数の定義
//--------------------------------------------------------
double t = 0.0;  //時刻
double dt= 0.03; //時間刻み
int tn = 0;      //ステップ数
double g = 9.80665; //重力加速度 g

// ボールの定義
struct BALL {
  double x, y, z;
  double vx, vy, vz;
  double ax, ay, az;
};
const int N = 11;//&lt;--------------------- ボールの個数を設定
BALL ball[N];
void SetUp(void){
  for(int i=0; i&lt;N; i++ ){
    ball[i].x  = -50.0;
    ball[i].y  = 0.0;
    ball[i].z  = 0.0;
    ball[i].vx = 2.0*double(i);//&lt;-----------vx の値を変化させる
    ball[i].vy = 0.0;
    ball[i].vz = 40.0;
    ball[i].ax = 0.0;
    ball[i].ay = 0.0;
    ball[i].az = -g;
  }
}
</pre>
<p>
ボールの個数を簡単に変化させることとができるように、
ボールの個数を意味する変数 N としました。今回は N=11 としました。
</p>
<h4>計算と物体の描画</h4>
<pre>
void Calculate(){
  t = dt * double(tn);
  for(int i=0; i&lt;N; i++){
    //速度の算出
    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].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;
  }
 tn++;
}
void DrawStructure(){
  for(int i=0; i&lt;N; i++){
    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, &amp;amp;ms_ruby.shininess);
      glTranslated(ball[i].x, ball[i].y, ball[i].z); //平行移動値の設定
      glutSolidSphere(4.0, 20, 20);            //引数：(半径, Z軸まわりの分割数, Z軸に沿った分割数)
    glPopMatrix();
  }
}
</pre>
<p>
i 番目のボールの
位置「ball[i].x」「ball[i].y」「ball[i].z」<br />
速度「ball[i].vx」「ball[i].vy」「ball[i].vz」<br />
加速度「ball1.ax」「ball[i].ay」「ball[i].az」<br />
を逐次計算します。水平方向には<a href="http://www.natural-science.or.jp/article/20091223172523.php">等速直線運動</a>、鉛直方向（z軸方向）には、重力による<a href="http://www.natural-science.or.jp/article/20091223172523.php">等加速度直線運動</a>を行ないます。初期値として、v_{z0}と v_{x0} を設定することでシミュレーションすることができます。
</p>

<p>
<span class="mt-enclosure mt-enclosure-image" style="display: inline;"><img alt="20100118-05.gif" src="http://www.natural-science.or.jp/images/20100118-05.gif" width="512" height="512" class="mt-image-none" style="" /></span>
</p>


<mt:include module="仮想物理実験室　コンテンツ" />
]]>
        
    </content>
</entry>

<entry>
    <title>VisualC++ と OpenGL を利用した仮想物理実験室【2-3-1】重力による水平投射運動のシミュレーション</title>
    <link rel="alternate" type="text/html" href="http://www.natural-science.or.jp/article/20100829220907.php" />
    <id>tag:www.natural-science.or.jp,2010://12.9832</id>

    <published>2010-08-29T13:09:07Z</published>
    <updated>2010-08-29T13:19:41Z</updated>

    <summary> 【２－３】重力による運動：鉛直投射運動では、【2-1-2】重力による運動のアル...</summary>
    <author>
        <name>遠藤 理平</name>
        <uri>http://www.natural-science.or.jp/article/members/cat-12/</uri>
    </author>
    
        <category term="仮想物理実験室" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="シミュレーション" label="シミュレーション" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="水平投射運動" label="水平投射運動" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="重力" label="重力" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ja" xml:base="http://www.natural-science.or.jp/">
        <![CDATA[<p>
<a href="http://www.natural-science.or.jp/article/20100112235205.php">【２－３】重力による運動：鉛直投射運動</a>では、<a href="http://www.natural-science.or.jp/article/20100829144539.php">【2-1-2】重力による運動のアルゴリズムの導出</a>で導出したニュートンの運動方程式を用いて、<span style="font-weight:600">初期値</span>として v_{z0} 設定することで、鉛直投射運動をシミュレーション行ないましました。今回は、<span style="font-weight:600">水平投射運動</span>と呼ばれる運動をシミュレーションします。
</p>
<div class="waku">
<div style="float:right">(2.3-1)</div>
<img src="http://www.natural-science.or.jp/images/20100110-04.gif" alt="時刻 t=tn[s] におけるニュートンの運動方程式" />
</div>
<p>
重力による運動は、上記のアルゴリズムと t=t_0[s]のときの状態、<span style="font-weight:600">初期値</span>を適切に設定することですべての運動を表現することができます。初期値として、v_{z0} を設定することで、鉛直投射運動をシミュレーションしました。
異なった初期値に対する運動のシミュレーションを行ないます。
</p>
<h2>水平放射運動</h2>
<p>
水平放射運動とは、水平方向（x軸方向）に初速度 v_{x0}を与えたときの運動をさします。
鉛直方向には、重力がかかっているので、加速度的に落下します。
</p>
<p>
<img src="http://www.natural-science.or.jp/images/20100113-01.gif" alt="水平投射運動の図" />
</p>
<h3>位置・速度・加速度の初期値（水平投射運動）</h3>
<pre>
g = 9.80665 //重力加速度
// 位置・速度・加速度の初期値 
x = -50.0;
y =   0.0;
z = 100.0;
vx = 5.0; //&lt;---------------x軸方向の初期速度を設定
vy = 0.0;
vz = 0.0; 
ax = 0.0;
ay = 0.0;
az = -g;  //重力
</pre>

<h2>水平投射運動のシミュレーション</h2>
<p>
x軸方向の初速度 v_{x0}を 0～40[m/s]まで変化させてシミュレーションしました。重力により、すべてのボールは同じ加速度で落下することが確認できます。
</p>

<div style="text-align:center">
<object width="425" height="344"><param name="movie" value="http://www.youtube.com/v/M8Je2JM86rM&hl=ja&fs=1"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/M8Je2JM86rM&hl=ja&fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"></embed></object>
</div>

<h2>VisualC++ ＋ OpenGL プログラミング</h2>
<p>
<a href="http://www.natural-science.or.jp/article/20100111001518.php">【７日目】重力による運動：鉛直投射運動</a>の初期値を変更することで、水平投射運動のシミュレーションを行ないます。
</p>
<h3>仮想物理実験室変数の定義</h3>
<pre>
//--------------------------------------------------------
// 仮想物理実験室変数の定義
//--------------------------------------------------------
double t = 0.0;  //時刻
double dt= 0.03; //時間刻み
int tn = 0;      //ステップ数
double g = 9.80665; //重力加速度 g

// ボールの定義
struct BALL {
  double x, y, z;
  double vx, vy, vz;
  double ax, ay, az;
};
const int N = 10;  //&lt;--------------------- ボールの個数を設定
BALL ball[N];
void SetUp(void){
  for(int i=0; i&lt;N; i++ ){
    ball[i].x = -50.0;
    ball[i].y = 0.0;
    ball[i].z = 100.0;
    ball[i].vx = 5.0*(i);//&lt;-----------vx の値を変化させる
    ball[i].vy = 0.0;
    ball[i].vz = 0.0;
    ball[i].ax = 0.0;
    ball[i].ay = 0.0;
    ball[i].az = -g;
  }
}
</pre>
<p>
今後、ボールの個数を簡単に変化させることとができるように、
ボールの個数を意味する変数 N を用意します。今回は N=10 としました。
</p>
<h4>計算と物体の描画</h4>
<pre>
void Calculate(){
  t = dt * double(tn);
  for(int i=1; i&lt;=N; i++){
    //速度の算出
    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].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;
  }
 tn++;
}
void DrawStructure(){
  for(int i=1; i&lt;=N; i++){
    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, &amp;amp;ms_ruby.shininess);
      glTranslated(ball[i].x, ball[i].y, ball[i].z); //平行移動値の設定
      glutSolidSphere(4.0, 20, 20);            //引数：(半径, Z軸まわりの分割数, Z軸に沿った分割数)
    glPopMatrix();
  }
}
</pre>
<p>
i 番目のボールの
位置「ball[i].x」「ball[i].y」「ball[i].z」<br />
速度「ball[i].vx」「ball[i].vy」「ball[i].vz」<br />
加速度「ball1.ax」「ball[i].ay」「ball[i].az」<br />
を逐次計算します。水平方向には<a href="http://www.natural-science.or.jp/article/20091223172523.php">等速直線運動</a>、鉛直方向（z軸方向）には、重力による<a href="http://www.natural-science.or.jp/article/20091223172523.php">等加速度直線運動</a>を行ないます。初期値として、v_{x0} を設定することでシミュレーションすることができます。
</p>
<p>
<span class="mt-enclosure mt-enclosure-image" style="display: inline;"><img alt="20100113-1.gif" src="http://www.natural-science.or.jp/images/20100113-1.gif" width="590" height="219" class="mt-image-none" style="" /></span>
</p>
<mt:include module="仮想物理実験室　コンテンツ" />

]]>
        
    </content>
</entry>

</feed>
