前回は,乱数を用いることで拡散方程式を解いた.今回は,同じく偏微分方程式である波動方程式を数値的に解く
x方向1次元の波動方程式は次式で与えられる.ここでu(x,t)は弦の変位や水面の高さに相当する.なお,cは波が伝わる速度である.
![]() |
(1) |
波動方程式をどうやって解くか? まず,波が存在する空間を設定する.ここでは,長さLの空間を想定し,その空間上に等間隔 Δx で並んだ点を考える.その各点における u(x,t) を算出することを目標とする.各点に番号をつけ,i=0~N で表す.一方で時間も等間隔 Δt で進ませることにする.時間については1(t-Δt), 2(t), 3(t+Δt) で表すことにする.このように記号を決めてやると,u(i,3) を求めることが目標となる.
まず,u(x,t)のxに関する1階微分を考える.微分の定義通りに考えると
![]() |
(2) |
となるが,Δx が有限であるためにΔx のオーダーの誤差がつく.2階微分を同様に求めると
![]() |
(3) |
となる.先ほどの1階微分で生じていたΔxのオーダーの誤差はちょうど打ち消しあってΔxの2乗のオーダーに改善する.時間についての2階微分も同様なので結局波動方程式は
![]() |
(4) |
と近似できることがわかる.この変形を「方程式の差分化」と呼ぶ.この式を変形してやると
![]() |
(5) |
となる.ここで左辺の u(x, t+Δt)が未知数である.これがN個存在する.一方で右辺の量はすべて時刻t もしくは t-Δtにおける量であり,これはすべて既知である.注意:u(x, t+Δt)を求めるためには,u(x, t)だけでなくu(x, t-Δt)も必要である.これは時間に関して二階微分であるため.u(x, t+Δt)を書き換えると u(i, 3)となり,式を書き換えると以下のようになる.
![]() |
(6) |
式()において両端を考えてみる.i=0の場合,右辺に u(i-1,2)が存在しているため u(-1,2)となってしまいiの範囲から外れてしまう.したがってi=0, N では式(6)は適用できない.残りのN-2本の方程式しか存在しないことになってしまう.残りの2つの方程式はどこから持って来ればよいのだろうか?この式のことを「境界条件」と呼ぶ.境界条件には主に2種類あり,一つは境界における値を指定する場合(ディリクレ条件),もう一つは境界における傾きを指定する場合(ノイマン条件)である.たとえば計算領域の両端でu=0と固定したとするとディリクレ条件は
![]() |
|||
![]() |
(7) |
となる.一方で,両端でdu/dx=0とするとノイマン条件となり
![]() |
|||
![]() |
(8) |
となる.それぞれ式が2セットあるのは,時刻がt+Δtの値を求めるためには, 時刻 t と t-Δtとの場合で二通りの数値が必要なためである.
一方で,時刻t=0において u(i,1)を指定してやらないと計算をはじめることができない.これを「初期条件」とよぶ.式(5)でわかる通り,時刻Δt後のuを求めるためには時刻tとt-Δtの二つの時間におけるuが必要である.ここから,まず始めのu(i,3)を求めるためにとu(i,1)とu(i,2)が必要ということになる.u(i,1)を与えたときに,u(i,2)をどう求めるか? u(x, t+Δt)をテーラー展開すると
![]() |
![]() |
![]() |
|
![]() |
![]() |
(9) |
となるので,u(i,2)は次式で求めることができることがわかる.
![]() |
(10) |
ここで求めたu(i,2)と,初期条件 u(i,1)から,u(i,3)を求めることになる.
漸化式(式6)を条件(式7)もしくは(式8)で解くプログラムを作成せよ.L=1.D0, c=1.D0, N=100, Δx=0.01, Δt=0.01 とせよ.初期条件として
![]() |
(11) |
を与えること.初速度はゼロとする.この初期条件は上図で表されている.境界条件は固定端(式7)とすること.計算を実行する前に上図をよく見て,結果がどうなるか予想してノートに描いてみること.
結果は..... write(1,*) i*dx, u(x,2) enddo <= 空間に関するループの終わり write(1,*) write(1,*) enddo <= 時間に関するループの終わり
という形で出力すること.以下のテキストを anim.txt というファイル名で保存し,gnuplotで今までと同様に n=0 と load 'anim.txt' を実行すること.
set xrange [0:1] set yrange [-1:1] if (n>3000) exit plot "fort.1" index n w l pause 0.05 n=n+1 reread
練習問題1を,固定端でなく自由端(式8)で実行せよ.アニメを観察する前に,結果がどうなるかノートに図を描いて予想すること.
以下の初期条件を用い,固定端と自由端それぞれで計算を行え.初速度はゼロとする.固定端,自由端それぞれの場合について,結果がどうなるか予想してノートに描くこと.
![]() |
(12) |
以下の初期条件で,固定端を用いて計算を行う.初速度はゼロとする.始めに,左から右に向かって波が進行する.波の頂点のx座標を算出し,横軸を時間,縦軸を頂点の座標でグラフを描く.頂点の座標が,c = 1 の速度で右に移動していることを確認せよ.
![]() |
(13) |
練習問題1のプログラム,および時刻ー頂点の座標のデータファイルを送付すること.