■ movie 関数

 [2006/07/13]

 mc (matrix calculator) には QuickTimeMovie を作る関数がありましたが CalendarMemo に移行したとき忘れていました。同じ関数名にしようかとは思ったのですがHelpから探すとき面倒だと思い QuickTimeMovie 関連の関数は movie_ で始まる名前に統一する事にしました。以下が QuickTimeMovie 関連の関数です。


movie_create(0); ~ 動画ウインドウを開く

movie_close(0); ~ 動画ウインドウを閉じる

movie_save(fileFullPath$); ~ 作成した動画を指定パスで保存

movie_saveAs(0); ~ パネルで指定し動画を保存

movie_pasteImage(img#,time); ~ 動画に画像を挿入

movie_addImage(img#,time); ~ 動画に画像を挿入

movie_start(0); ~ 動画を再生する

movie_stop(0); ~ 動画再生を停止する

movie_setRate(rate) ~ 再生速度を指定

movie_gotoBeginning(0); ~ ポインターを動画開始位置に移動

movie_gotoEnd(0); ~ ポインターを動画の最後に移動

movie_stepBack(0); ~ ポインターを一つ戻す

movie_stepForward(0); ~ ポインターを一つ進める

movie_copy(0); ~ クリップボードへコピー
movie_cut(0); ~ 削除&クリップボードへコピー

movie_delete(0); ~ 削除

movie_paste(0); ~ クリップボードからペースト

movie_selectAll(0); ~ 動画を全て選択


【例 】


●振り子の位置をシミュレーション

 振り子の位置は数値微分を解く Runge-Kutta-Gill 4次法を使います。モデルは次のようなモジュールを設定します。

module 振り子(t,y,p)

{

g = p[1,1]; l = p[1,2];

θ= y[1,1]; ω= y[1,2];

dω = -g/l*sin(θ);

dθ = ω;

return(|dθ,dω|);

}

 tは時間(秒)、yは角度と角速度の微分値です。また g,l,θ,ω はそれぞれ重力加速度、振り子の長さ、垂直に対する角度、角速度です。


●シミュレーション(数値)

 分割時間 h = 0.05 秒、振り子の長さを2mで計算させてみましょう。最初の振り子の角度は80度です。

h = 0.05;

g = 9.8;

l = 2.0;

n = 200;

θ= 80;

y = |θ*Pai/180,0|;

t = 0; p = |g,l|;

z = addP(t,y);

for(i=0;i<n;i++){

y = rkg_4(h,t,y,p,"振り子");

t = t+h;

z = cat(z,addP(t,y));

}

parametricLinePlot(z[#,1],z[#,2|3]*180/Pai);

Pasted Graphic 23.pict.OK.


黒線が角度θで赤線が角速度です。本シミュレーションで必要なのは黒線の角 度であります。


●アニメ

 ウインドウの大きさを横400、縦300ピクセルとし1ピクセルが1cmであるとしましょう。

この時、角度がθラジアンの振り子の状態は

x0 = 200;

y0 = 10;

θ = 10*Pai/180;

yy = y0 + lcos(θ)*100;

xx = x0 + lsin(θ)*100;

zz = |0,0,3,3,1,x0*2,y0|

|x0,y0, 0, 1, 1, 0, 0|

|xx,yy, 1, 2, 2, 0, 0|

|xx-10,yy-10,5,1,1,20,20|;

a#= draw(zz,|400,300|);

a#;

Pasted Graphic 24.pict.OK.

 となります。あとは角度θをこのプログラムに与えれば良い訳です。

●動画

 動画を作る上で重要なのは時間です。シミュレーションでは時間間隔をhとしているので1秒間の フレーム枚数は 1/h 枚になります。これをchangeMovieFrameRate関数の引数にし動画のフレーム速度にします。あとは通常の動画作成と同じになります。

~ 例1

h = 0.05; g = 9.8; l = 2.0; n = 200;

x0 = 200;

y0 = 10;

θ = 80;

y = |θ*Pai/180,0|;

t = 0; p = |g,l|;

movie_create(0);

for(i=0;i<n;i++){

y = rkg_4(h,t,y,p,"振り子");

t = t+h;

yy = y0 + lcos(y[1,1])*100;

xx = x0 + lsin(y[1,1])*100;

zz = |0,0,3,3,1,x0*2,y0|

|x0,y0, 0, 1, 1, 0, 0|

|xx,yy, 1, 2, 2, 0, 0|

|xx-10,yy-10,5,1,1,20,20|;

a#= draw(zz,|400,300|);

movie_addImage(a#+0, h);

}

movie_saveAs(0);

movie_close(0);


●応用例

 さて、これで動画ができました。実際の振り子を作って実験しても同じ結果になるでしょう(ウ ソ)。ところで高校で振り子の周期を求める時、モデルの微分方程式を解いたと思います。でもそのままで微分方程式は解けないのである仮定をしましたね。振 り子の角度が小さいと sin(θ) がθに等しいという仮定です。それでは振り子の初期状態(角度)が違えばどうなるのでしょうか?

~ 例2

h = 0.05; g = 9.8; l = 2.0; n = 400;

x0 = 200;

y0 = 10;

θ1 = 80;θ2 = 30;

y1 = |θ1*π/180,0|;

y2 = |θ2*π/180,0|;

t = 0; p = |g,l|;

movie_create(0);

for(i=0;i<n;i++){

y1 = rkg_4(h,t,y1,p,"振り子");

y2 = rkg_4(h,t,y2,p,"振り子");

t = t+h;

yy1 = y0 + lcos(y1[1,1])*100;

xx1 = x0 + lsin(y1[1,1])*100;

yy2 = y0 + lcos(y2[1,1])*100;

xx2 = x0 + lsin(y2[1,1])*100;

zz = |0,0,3,3,1,x0*2,y0|

|x0,y0, 0, 1, 1, 0, 0|

|xx1,yy1, 1, 2, 1, 0, 0|

|xx1-10,yy1-10,5,1,1,20,20|

|x0,y0, 0, 1, 1, 0, 0|

|xx2,yy2, 1, 3, 1, 0, 0|

|xx2-10,yy2-10,4,4,1,20,20|;

a#= draw(zz,|400,300|);

movie_addImage(a#+0, h);

}

movie_saveAs(0);

movie_close(0);


同じ振り子の長さなのに最初の角度(振幅)が違えば周期も変わってきますね。