(Tips) 弦の振動描画ルーチン
作成者:森川 靖大
概要
(Tips) sin曲線描画ルーチン をちょっと改造し、 弦の振動のアニメーションを描画するスクリプトを作ってみました。
解いている式は d^2 u/dt^2 = d^2 u/dx^2 です。
微分には NArray の微分モジュール NumRu::Derivative を使用しています。 離散化は、空間は2次精度の差分 (Derivative モジュール参照)、 時間はオイラー法です。
使い方は -h オプションで表示されるヘルプを参照ください。
Ruby で簡単な描画を行う際の参考になりましたら幸いです。
ソースコード
描画部分を抜粋して記します.
nm = 1
iws = 1
# 次元定義
# x 次元
XMin = 0.0 # 下限値
XMax = 2.0 * PI # 上限値
NX = 100 # 空間解像度
DX = (XMax - XMin) / ( NX ) # 空間刻み
x = NArray.float( NX + 1 ).indgen! * DX
# time 次元
TMin = 0.0 # 初期値
TMax = 100.0 # 最終時刻
DT = 0.05 # 時間刻み
NT = (TMax - TMin) / ( DT ) # 時間ステップ
# 変数
u = sin(x * nm) # u
u[0] = 0.0 ; u[NX] = 0.0 # 境界条件
dudt = NArray.sfloat( NX + 1 ) # du/dt
dudx = NArray.sfloat( NX + 1 ) # du/dx
d2udx2 = NArray.sfloat( NX + 1 ) # d^2u/dx^2
# 描画
DCL::swlset('lalt', true)
DCL::swlset('lwait', false)
DCL::gropn(iws)
(0..NT).each{|i|
DCL::grfrm
DCL::grswnd(XMin, XMax, -1, 1) # 左・右・下・上の座標値
DCL::ussttl('X', '1', 'U', '1') # タイトルの設定
DCL::usgrph(x, u) # 値の設定
dudx = Derivative::cderiv(u, x, 0)
d2udx2 = Derivative::cderiv(dudx, x, 0)
dudt = dudt + d2udx2 * DT # {du/dt(t+Δt) - du/dt(t)} / Δt = d^2 u/dx^2
u = u + dudt * DT # {u(t+Δt) - u(t)} / Δt = du/dt
u[0] = 0.0 ; u[NX] = 0.0 # 境界条件
dudt[0] = 0.0 ; dudt[NX] = 0.0 # 境界条件
}
DCL::grcls
ダウンロード
- 単色波:oscillation.rb
- 初期値を変えてみた:oscillation_anyinit.rb
- 波数の違う波を重ね合わせてみた:oscillation_lap.rb
使用法
特にインストール作業はありません。ダウンロードしたスクリプトを 実行するだけです。
ただし、文字コードが EUC なので、Windows 環境などではヘルプが 文字化けするかもしれません。使用する前にファイルの文字コードを 手元の環境に変換してください。
使用例
アニメーションの一枚目が表示されます。 進めるには、表示された絵の上でクリックするか Enter キーを押してください。
% ruby oscillation.rb
以下のように --smooth オプションをつけると、自動的にアニメーションします。
% ruby oscillation.rb --smooth
異なる波数の波の重ね合わせを描画する場合には、--nm オプションで 波数の設定が可能だったりもします。
% ruby oscillation_lap.rb --smooth --nm 2:4
更新履歴
- 2008/03/07 とりあえず置いてみました. ^^;
キーワード:
参照: