仮想計算機構

IT業界と無縁な派遣社員のブログ

SageMathで固有振動のアニメーションを作る

固有振動


n=1,2,...に対して基準振動を下記で定義します。


u_n(x,t)=A\sin (\frac{n\pi}{l}x)\cos(\frac{n\pi}{l}ct)

l は弦の長さ、c は弦を伝わる横波の速さを表します。t を変化させた場合のアニメーションをSageMathで作ります。
SageMath - Open-Source Mathematical Software System

プログラム

main.sageを作成します。

def lcm(x, y):
    return (x * y) // math.gcd(x, y)

def wave1(A,l,c,dt,n):
    sine = [plot(A*sin(n*pi*x/l)*cos(n*pi*c*t/l), (0,2*l), color=Color(1,0,0), ymin=-A, ymax=A)
            for t in sxrange(0,2*l/n/c,dt)]
    return sine

def wave2(A,l,c,dt,n1,n2):
    sine = [plot(A/2*sin(n1*pi*x/l)*cos(n1*pi*c*t/l)+A/2*sin(n2*pi*x/l)*cos(n2*pi*c*t/l), (0,2*l), color=Color(1,0,0), ymin=-A, ymax=A)
            for t in sxrange(0,2*l*lcm(n1,n2)/c,dt)]
    return sine

SageShellを起動して、ロードしておきます。

sage: load("main.sage")

アニメーション

A=l=1,c=0.1 とし、時間 t は 0.4 刻みで変化させることとします。

n=3 の場合
sage: animate(wave1(1,1,0.1,0.4,3))
Launched gif viewer for Animation with 17 frames

f:id:riverta1992:20201213203500g:plain

l の倍数の箇所は変化せず固定されていることがわかります。

n=1 と n=3 の和


u_{1,3}(x,t)=\frac{1}{2}u_1(x,t)+\frac{1}{2}u_3(x,t)

sage: animate(wave2(1,1,0.1,0.4,1,3))
Launched gif viewer for Animation with 150 frames

f:id:riverta1992:20201213203011g:plain