(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 とりあえず置いてみました. ^^;
キーワード:
参照: