(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

ダウンロード

使用法

特にインストール作業はありません。ダウンロードしたスクリプトを 実行するだけです。

ただし、文字コードが EUC なので、Windows 環境などではヘルプが 文字化けするかもしれません。使用する前にファイルの文字コードを 手元の環境に変換してください。

使用例

アニメーションの一枚目が表示されます。 進めるには、表示された絵の上でクリックするか Enter キーを押してください。

% ruby oscillation.rb

以下のように --smooth オプションをつけると、自動的にアニメーションします。

% ruby oscillation.rb --smooth

異なる波数の波の重ね合わせを描画する場合には、--nm オプションで 波数の設定が可能だったりもします。

% ruby oscillation_lap.rb --smooth --nm 2:4 

更新履歴

  • 2008/03/07 とりあえず置いてみました. ^^;
更新日時:2008/03/11 10:45:50
キーワード:
参照: