TeX Alchemist Online

TeX を使って化学のお仕事をしています。

TikZによる連成振動アニメーション (1) ~ アニメーションGIF篇

連成振動のアニメーションを,TikZ + ImageMagick で作ってみました。

以下,この作り方を解説します。

背景説明 ~連成振動~

まずは,簡単な連成振動の系を,高校物理でも分かるように解説しましょう。

バネ定数$k$のバネ3つと質量$ m $のおもり2つが次のように接続されているとし,この状態で3つのバネは自然長にあるとします。
f:id:doraTeX:20140417132059p:plain

次に,各おもりが$x_1$,$x_2$だけつりあいの位置から変位した状態を考えます。
f:id:doraTeX:20140417122750p:plain

この状態で各おもりの運動方程式を立てると,それぞれ次のようになります。
\[\left\{\begin{array}{l} m\frac{d^2x_1}{dt^2} = -kx_1 + k(x_2-x_1)\\[3pt]
m\frac{d^2x_2}{dt^2} = -kx_2 - k(x_2-x_1)
\end{array}\right.
\]この2式を辺々足し引きすると,次の形になります。*1
\[\left\{\begin{array}{l} m\frac{d^2}{dt^2}(x_1+x_2) = -k(x_1 + x_2)\\[3pt]
m\frac{d^2}{dt^2}(x_1-x_2) = -3k(x_1-x_2)
\end{array}\right.
\]これは,$x_1+x_2$,$x_1-x_2$のそれぞれが単振動の微分方程式を満たすことを示しています。よって,$\omega_1=\sqrt{\frac km}$,$\omega_2=\sqrt{\frac {3k}m}$とおくと,解は,任意定数$A_1,\,A_2,\,\theta_1,\,\theta_2$を用いて
\[\left\{\begin{array}{l}
x_1+x_2 = A_1\sin(\omega_1t+\theta_1)\\[3pt]
x_1-x_2 = A_2\sin(\omega_2t+\theta_2)
\end{array}\right.
\]と表されます。この2式を再び足し引きすることにより,一般解
\[\left\{\begin{array}{l}
x_1(t) = A\sin(\omega_1t+\theta_1) + B\sin(\omega_2t+\theta_2)\\[3pt]
x_2(t) = A\sin(\omega_1t+\theta_1) - B\sin(\omega_2t+\theta_2)
\end{array}\right.
\]が得られます($A,\,B,\,\theta_1,\,\theta_2$:任意定数)。

TikZでパラパラ漫画PDFを作る

この解の様子をアニメーションにするため,まずは,200ページのパラパラ漫画状のPDFを LaTeX + TikZ で作成します。

TeXソース

パラメータとして$A=1$,$B=0.8$,$\omega_1=0.2$,$\theta_1=\frac\pi2$,$\theta_2=0$ととり,$t=0,\,1,\,\ldots,\,199$ の様子をTikZで描画するTeXソースです。

コンパイル

上記ソース oscillation.tex を

$ pdflatex oscillation

でコンパイルします。
pLaTeX + dvipdfmx を使う場合は,上記のソース中の

\usepackage[papersize={10.8cm,2.6cm},margin=1mm,noheadfoot]{geometry}

の行を

\usepackage[dvipdfm,papersize={10.8cm,2.6cm},margin=1mm,noheadfoot]{geometry}
\usepackage[dvipdfmx]{graphicx,xcolor}

に変更し,*2

$ platex oscillation && dvipdfmx oscillation

あるいは TeX Live の場合はまとめて

$ ptex2pdf -l oscillation

でコンパイルします。

コンパイルに成功すると,200ページのPDFが生成されます。

この状態でも,oscillation.pdf を「単一ページ表示」で表示させ,スペースキーを押しっぱなしにすることで連続的にページをめくると,アニメーションに見えます。

ImageMagickでアニメーションGIFに変換する

PDF → アニメーションGIF

次に,このパラパラ漫画PDFを,ImageMagick によって本物のアニメーションGIFに変換しましょう。ImageMagick の convert コマンドを使います。

$ convert -debug all -delay 1 -loop 0 -density 300 -alpha remove oscillation.pdf oscillation.gif

すると,oscillation.gif というアニメーションGIFが生成されます。

convert コマンド

convert は,ImageMagick のコマンドです。MacTeX または [改訂第6版]LaTeX2ε 美文書作成入門 からTeX環境をインストールした場合にはデフォルトで convert がインストールされています。MacPortsHomebrew などでインストールする手もあります。

[改訂第6版] LaTeX2ε美文書作成入門

[改訂第6版] LaTeX2ε美文書作成入門

各オプションの意味

convert の各オプションの数字の意味は,次の通りです。

-delay 1
フレームの各コマの間に1/100秒のウエイトを入れます。
-loop 0
アニメーションを無限ループさせます。
-density 300
解像度を300dpiにします。
-alpha remove
アルファチャンネルを削除します。

(2) ~ 動くPDF篇(3) ~ 動画投稿篇 に続く]

*1:この手の連立線型微分方程式は,一般には行列を使って解きますが,最近始まった新学習指導要領では行列が高校数学の範囲外となり,現在の高校数学では行列が教えられません。そこでここでは,初等的に解いています。

*2:geometoryパッケージの [dvipdfm] オプションは,dvipdfmx に用紙サイズを伝えるという意味です。また,pdfLaTeX の場合は \usepackage{tikz} によって graphicx, xcolor パッケージは自動的にロードされるので \usepackage を明示的に行う必要はありませんが,dvipdfmx を使用する場合は,そのままでは graphicx, xcolor パッケージがドライバ指定オプションなしで呼ばれてしまい dvipdfmx 用の設定になりませんので,事前に [dvipdfmx] オプションを付けて \usepackage し,明示的にドライバを指定してロードしておく必要があります。(あるいは,ドキュメントクラスオプションに [dvipdfmx] を付けて,ロードされるあらゆるパッケージで dvipdfmx オプションがデフォルトで有効になるように指定しておくという手もあります。)