授業資料/14 の変更点


#contents

* 前回の課題について [#t35efe13]
さて,前回の総仕上げは単純な振り子の運動をシミュレーションしてみようというものだった.

まず,鉛直下方向からの角度を θ rad とすると Newton の運動方程式が
CENTER:&ref(./pendulum-eq.png,70%);
CENTER:''振り子の運動方程式''

に帰着するのは高校の物理の授業でやっているはずだ(人によっては中学生で学んでいるね).これも解がわかってしまうが((問題を線形近似した簡単なものに置き換えれば単純に,そうでなければ楕円関数を使って)),プログラムで近似解を求めよという問題なのでそのようにしよう.
まず,このままでは扱いにくいので,前回の授業同様従属変数を増やして一階微分方程式に変形しよう.
CENTER:&ref(./pendulum-eq-mod.png,70%);
CENTER:''振り子の運動方程式(変形版)''

という感じになるだろう.そして,上の方程式に対して Euler 法を適用すると,
CENTER:&ref(./pendulum-euler.png,70%);
CENTER:''振り子の運動方程式(変形版の Euler 法による近似)''

という近似式が得られる.さらにこれを扱いやすく直して,
CENTER:&ref(./pendulum-euler-mod.png,70%);
CENTER:''振り子の運動方程式(変形版の Euler 法による近似をわかりやすくしたもの)''

とできるので,これをもとにプログラムを組もう.様々な具体的条件も込みで,前回の例題のプログラムとほとんど変わらない形で,たとえば次のようになるだろう.
// programu source 表記
#highlighter(language=ruby,number=on,cache=on){{
include Math

# Euler 法に基づいて,次の時間ステップの u,v を計算する
def euler(u,v,dt,l)
  g = 9.8

  u_new = u + v*dt
  v_new = v - (g/l)*sin(u)*dt

  return u_new, v_new
end

# x, yを出力する
def outputXY(u,l)
  x = l*sin(u)
  y = - l*cos(u)
  print(x,", ",y,"\n")
end

# 以下,プログラム本体

# 問題条件
l = 1.0

# 初期値
u = PI/3.0
v = 0.0
time = 0.0

# 終了時間
t_limit = 5.0

# 時間刻み幅
dt = 0.01

# 終了時間までは計算を繰り返す
while (time < t_limit) do

  # x, y を出力
  outputXY(u,l)

  # Euler 法で次の時間ステップの u,v を計算する
  u,v = euler(u,v,dt,l)

  # 時間を更新
  time += dt
end
}}
例えばこのプログラムを動かせば,全部で 501 行となるデータファイルが出来上がる.そこで,そのデータファイル名が例えば ''pendulum.dat'' だとして,これを動画的に表示するための gnuplot の設定ファイルを用意する.
まずは設定ファイル本体を ''pendulum.plt'' として
// programu source 表記
#highlighter(language=ruby,number=on,cache=on){{
set xrange[-1.0:1.0]
set yrange[-1.0:0.0]
set xlabel "x"
set ylabel "y"
unset key

line=0
load "pendulum.loop"
}}
と用意し,さらに1行ずつグラフを書く部分のためのファイル ''pendulum.loop'' を以下のように用意しよう.
// programu source 表記
#highlighter(language=ruby,number=on,cache=on){{
plot "pendulum.dat" every ::line::line w p pt 6 ps 3
line=line+1
pause 0.01
if(line<501) reread
}}
これで gnuplot 上で
  load "pendulum.plt"

とすれば(そこそこ速い PC ならば) 現実とほぼ同じ動作を画面で見ることができるはずだ.
&br;

&ref(/materials/warning.png); 1行ずつのグラフを画像ファイルにしてそれをもとに動画を作る場合は,例えば ''pendulum.plt'' を
// programu source 表記
#highlighter(language=ruby,number=on,cache=on){{
set xrange[-1.0:1.0]
set yrange[-1.0:0.0]
set xlabel "x"
set ylabel "y"
unset key

set terminal png font arial 18 size 800,600

line=0
load "pendulum.loop"

set terminal win
set output
}}
とし,ループ部分の設定ファイル ''pendulum.loop'' を
// programu source 表記
#highlighter(language=ruby,number=on,cache=on){{
op = sprintf("p-%03d.png",line)
set output op
plot "pendulum.dat" every ::line::line w p pt 6 ps 3
line=line+1
if(line<501) reread
}}
などとすれば,gnuplot で
  load "pendulum.plt"

とすると,501 枚の png 画像ファイルがさくっと作られることになる.
あとはこれを前回紹介した方法で動画に変えれば,動画が得られる.
例えば,この 501 枚の画像から FFmpeg で作成した flv ファイルは &ref(/materials/JNorth_arrow-right-sm.png);''&ref(./pendulum-50fps.flv,noicon,振り子運動の動画ファイル);'' のようになる(ただし,遅い PC でも再生できるように画像を間引いて 50fps に落としてある).

&br;
* 特別レポート [#qbf06e53]

これまでのレポートに加え,特別に加点する「特別レポート」を用意した(配点については授業中に口頭で伝えてあるね).
課題,条件,提出については以下の通り.
&br;

** ''課題'' [#e9160035]
数学,物理,化学,生物等の理論,予想を確かめるようなプログラムを作り,結果を解析せよ.
&br;

** ''条件'' [#v4c1199c]
+ 授業時に授業アンケートに答えてないものはアンケートと一緒に提出すること(&ref(/materials/JNorth_arrow-right-sm.png);&ref(./questionnaire.pdf,noicon,アンケート用紙);).
+ 紙で提出すること
+ 対象を「独自」にすること. 複数人で対象が同じ場合,配点は按分される.
+ レポートの「構成」をきちんとすること.よくわからないという人は,せめて以下の構成にすること.
++ 一章: 対象理論の解説
++ 二章: プログラムの説明およびプログラムリストの提示
++ 三章: 実験結果
++ 四章: 実験結果の解析
+ いつものように,各自の情報をきちんと記載すること.
++ 授業名
++ 「特別レポート」という表題
++ 所属(学部,学科)
++ 学籍番号
++ 学年
++ 氏名
++ レポート提出日
&br;

** ''提出について'' [#rcae66a5]
+ 提出先: 豊中サイバーメディアセンター 6F 615 号室 木田様へ(平日 4:30 PM まで)
+ 提出期限: 2010年 8月17日(ただし,アンケートの提出期限は 8月6日)
+ 提出物: レポート,およびアンケート(授業時のアンケートに記入する機会を持たなかった者のみ.ただし,アンケート提出期限には留意せよ)

** ''注意'' [#n36eacaa]

学生それぞれから,ポツポツとレポートが届いており,中にはなかなかの労作もあり感心しています.
逆に,残念なことに他人の web 等からの ''盗用'' の疑いがもたれるレポートが複数ありました.
&br;

&size(20){''レポートの盗用は,''};
&br;

- &size(20){''筆記試験等における「不正行為」である''};
(「筆記試験等」にはレポート提出も含まれる旨定義されています)
- &size(20){''著作権法違反となる「違法行為」である''};
&br;

&size(20){''という重大な反社会的行為であり,退学を含む厳しい処分が大学によってくだされる可能性があります.''};
&br;

みなさまは自らの力で正々堂々とレポートを作って提出いたしますよう頑張ってください.
みなさまは自らの力で正々堂々とレポートを作って提出するべく頑張ってください.



// (&ref(/materials/JNorth_arrow-right-sm.png);&ref(./questionnaire.pdf,noicon,アンケート用紙);)

* about Icons, ClipArts [#w04c90f9]
Some icons in this page are downloadable at [[ICONFINDER:http://www.iconfinder.net/]].

The "note" icon &ref(/materials/notes.png); designed by [[Marco Martin:http://www.notmart.org/]] is distributed with the LGPL licence,
the "warning" icon &ref(/materials/warning.png); designed by [[Alexandre Moore:http://nuovext.pwsp.net/]] with the GPL licence
and the "triangle" icon &ref(/materials/JNorth_arrow-right-sm.png); designed by [[Joseph North:http://sweetie.sublink.ca/]] is distributed with the [[Creative Commons (Attribution-Noncommercial-Share Alike 3.0 Unported):http://creativecommons.org/licenses/by-nc-sa/3.0/]] licence.

Some clip arts used in this page are downloadable at [[Open Clip Art Library:http://www.openclipart.org/]].
We deeply appreciate their superb works. With licence, they describe that "the actual clipart content on open clipart library is Public domain" in the web.

// ━┃┏┓┛┗┣┳┫┻╋


// コマンドライン入力は「行頭をブランクで始める」.
// コマンドライン出力は「行頭を > で始める」.

// 実習アイコン
// &ref(/materials/notes.png); 

// 注意アイコン
// &ref(/materials/warning.png);

// Link アイコン
// &ref(/materials/JNorth_arrow-right-sm.png);

// OK アイコン
// &ref(/materials/OK.png);

// NG アイコン
// &ref(/materials/NG.png);

// 大文字での強調 
// CENTER:&size(24){''ほげほげ''};

// programu source 表記
// #highlighter(language=ruby,number=on,cache=on){{}}