You are on page 1of 8

環境建設学演習III:数値計算入門

(Mathematica によるシミュレーション)
吉野 隆

空間を推定する(偏微分方程式の数値解法)
偏微分方程式とは
二つ以上の独立変数で記述される微分方程式を偏微分方程式という.独立変数として位置や時間が用いられ
るのは,常微分方程式と同じである.つまり,環境建設学で偏微分方程式が用いられるのは,多くの場
合,空間が二次元だったり時間と空間の両方を扱わなければならなかったりするときである.以下では比較
的簡単な二種類の偏微分方程式を考える.

Ÿ

拡散方程式と Laplace 方程式
拡散方程式は地中における水の循環や汚染物質の移動を表現する,環境建設学の中では重要な方程式であ
る.例えば,変数 u を地中における汚染物質の濃度と考えてみる.空間は一次元だとしておこう.この濃度
は時間 t や位置 x によって変化する.そのため,u は t と x の関数であり, uHx, tL と表すことができる.
uHx, tL の移動量(フラックスという)が濃度勾配によって決まるとき, u の変化は質量保存則から以下の式
で表すことができる.この式を拡散方程式という.
¶u
¶t

=D

¶2 u
¶ x2

(1)

D は定数で,拡散定数と呼ばれている.簡単に言えば,物質の移動しやすさを表すものである.
拡散方程式の左辺が常にゼロのとき, u は時間とともに変化しない関数,すなわち uHxL となる.この uHxL を
求める方程式を Laplace 方程式という.
¶2 u
¶ x2

=0

(2)

この方程式は定常的な物質移動を求めるために用いられる.

Ÿ

波動方程式
上で見た拡散方程式と同じように,一次元空間を考える.波動方程式は言葉のとおり波の伝播を説明する方
程式である.環境建設学的には地震や津波の伝播に関係する.このとき,変位(静止した状態からのずれ)
u は x と t の関数 uHx, tL であり,以下の方程式を満たす.
¶2 u
¶ t2

= c2

¶2 u
¶ x2

(3)

この方程式にはダランベールの解という解が知られている.

uHx, tL = f Hx - c tL + gHx + c tL

この解が正しいことは以下のように確かめられる.

(4)

c tD + g@x + c tD. u. 8t.nb D@f@x . xD. tD Š c ^ 2 D@f@x . tD Š D@u@t. xD == Exp@-x ^ 2  0. 0. u@t. xD. 6<D. -6. u@0. 6D Š 0<. xD  Simplify True 初期・境界条件の大切さ 2変数の(今回挙げた例で言えば独立変数が x と t の)偏微分方程式解を求めるためには条件に適した初期 ・境界条件を設定しなければならない.ここで,初期条件とは時間(例えば変数 t )のように,計算領域に おいて片方の端の値を指定する条件を言う.それに対して,境界条件とは位置(例えば変数 x)のよう に,計算領域の両方の端の値を指定する条件をいう.境界条件にはノイマン型(境界の値を指定するも の)とディリクレ型(境界から入るフラックスの量を指定するもの)がある.実際の数値計算のときにその 違いを確認することにする. Mathematica で偏微分方程式を解くには 常微分方程式と同様に,解析解を求めるには DSolve を,数値解を求めるには NDSolove を用いる.恐らく解 析解を求める試みはことごとく失敗するだろう.この授業では NDSolve によって解を求めることに焦点を絞 る.NDSolve の説明は以下の通り. 拡散方程式の数値解法 一次元の場合 Ÿ 中心付近に濃度が高い場所があり,境界では常に濃度がゼロの場合. In[75]:= ans = NDSolve@8D@u@t. . 8x. 50<. t.2 2008week02. xD.8D. -6D Š u@t. x.c tD + g@x + c tD. x.

6<. 2<D  Partition@ð. 3D &  Grid 1.6 0.8 0.2 0. 8x.8 0.0 0 0 1 2 3 -5 4 In[10]:= 3 Animate@Plot@Evaluate@u@t.4 0. First@ansDD. 20.5 0. 1<<. PlotPoints -> 50.8 0. 80. 8x.0 Out[81]= 5 0.0 1.0 1.8 0. 1<<. PlotRange ® 8Automatic.2 0. ImageSize ® 200.0 0. -6.0 1. 1<<.8 0.0 1. 6<. First@ansDD. xD .nb In[8]:= Table@Plot@Evaluate@u@t.2 0.2 0.0 -6 1.4 0.0 -6 In[81]:= -4 -2 0 2 4 6 0.6 0.2008week02. -6. 8t. 8t. 8t. PlotPoints -> 50. Frame ® TrueD.2 0.0 -6 1.6 0.2 0. ImageSize ® 200. 6<.6 0. 4<. First@ansDD.4 0. 6<.6 0. PlotPoints ® 100D 1.4 0. 0.0 1.8 0.0 0. 0.4 0. 80. -6. 6<.0 -6 -4 0 -2 2 4 6 0.2 0.4 0.0 -6 -4 0 -2 2 4 6 0.6 0.0 -6 -4 0 -2 2 4 6 0.6 0.0 -6 Plot3D@Evaluate@u@t.8 0.2 0. xD . PlotRange ® 88-6.4 0.0 0. Automatic. 8x. Frame ® TrueD. xD .0 -6 -4 -2 0 2 4 6 0.4 0. 25<D 同じ条件のもとで拡散係数のみを変えて,結果を比較する. -4 -2 0 -4 -2 0 -4 -2 0 .4 0.0 -6 Out[8]= -4 -2 0 2 4 6 0.8 0.2 0. 80.6 0.6 0.0 1.8 0. PlotRange ® 88-6. 0.

6<D. -6D Š u@t. 30<. xD Š If@x Š -6. PlotRange ® 88-6. Derivative@0. PlotPoints -> 50. x. u@0. -6. ImageSize ® 200. xD. x. PlotPoints -> 50. 0. 6<. PlotRange ® 88-6. xD. 6<D. 0. xD. tD Š 0. 3D &  Grid 領域によって異なる拡散係数を用いる(一方は他方の10倍). In[17]:= In[18]:= In[27]:= In[28]:= ans = NDSolve@8D@u@t. 1D@uD@t. 8t. -6. u. PlotPoints -> 50. 0. xD. u@t. -6. xD. Table@Plot@Evaluate@u@t. 8x. u@t. 10. 80. Table@Plot@Evaluate@u@t. 6<. First@ansD. Frame ® TrueD. 0. xD == Exp@-x ^ 2  0. xD . Table@Plot@Evaluate@u@t. 30. xD. PlotRange ® 88-6.8D. 2<D  Partition@ð. 3D &  Grid 一方から入ってくるが,他方から出ていかない. In[38]:= In[39]:= Ÿ ans = NDSolve@8D@u@t. 80. xD . u@0. -6D Š 1. 8t.4 2008week02. xD. 80. 0D. xD . 6<. xD . First@ansDD. ImageSize ® 200. 1<<. u@t. x. ImageSize ® 200. 6D Š 0<. u@t. ImageSize ® 200. 20. 12. 0. xD. -6. 1. 3<D  Partition@ð. -6.5 D@u@t. u. 12<. 8x. 30<. 2<D  Partition@ð. tD Š D@u@t. First@ansDD.nb 同じ条件のもとで拡散係数のみを変えて,結果を比較する. In[13]:= In[14]:= ans2 = NDSolve@8D@u@t. 80. 0. -6. tD Š If@x > 0. 8x. 0. 6<. PlotPoints -> 50. 1D D@u@t. 8x. xD. 30. u. 6<. 6<D. 0. xD. 8t. Frame ® TrueD. 3D &  Grid ans = NDSolve@8D@u@t. 6D Š 0<. 8x. 6D Š 0<. Frame ® TrueD. 8t. u@0. 8x. -6. 3D &  Grid 二次元の場合 二次元の場合,拡散方程式は以下のように表される. ¶u ¶t =D ¶2 u ¶ x2 + ¶2 u ¶ y2 中心付近に濃度が高い場所があり,境界では常に濃度がゼロの場合. (5) . Frame ® TrueD. 1<<. -6D Š u@t. u. u@0. 6<. 6<D. tD Š D@u@t. u@t. 8t. 1. 8t. 6D Š 0<. First@ans2D<D. 3<D  Partition@ð. -6. First@ansDD. 1<<. xD == Exp@-x ^ 2D. PlotRange ® 88-6. 6<. 50<. 1<<. x. xD . -6D Š 1. Table@Plot@Evaluate@8u@t. xD. 8x. 6<. u@t. 8t. xD. 8t. 8x. xD Š If@x Š -6. 0D.

x. -6. -6. 8y. u@0. yD. PlotRange ® 88-6. 0. x. x. xD + D@u@t. 8x. yD. 1D@uD@t. yD. -6. 8y. -6. t. Derivative@0. yD Š 1. 1  2<D  Partition@ð. 6<D. 8x. -6D. x. -6. -6. x.2008week02. 8t. yD. 3D &  Grid ans = NDSolve@8D@u@t. 6<. 8t. 0. First@ansDD. x. 50<. 6<. 1  2<D  Partition@ð. 6<. NDSolve::mxsst : MaxPointsまたはMinStepSizeオプションで独立変数xに対して許容される最大グリッド点数100 が使用されます. ‡ NDSolve::mxsst : MaxPointsまたはMinStepSizeオプションで独立変数yに対して許容される最大グリッド点数100 が使用されます. ‡ NDSolve::mxsst : MaxPointsまたはMinStepSizeオプションで独立変数xに対して許容される最大グリッド点数100 が使用されます. ‡ General::stop : 計算中,NDSolve::mxsstのこれ以上の出力は表示されません. ‡ In[56]:= In[70]:= Table@ Plot3D@Evaluate@u@t. -6. yD Š 0. yD . yD. xD == Exp@-Hx . 0D@uD@0. 3D &  Grid 波動方程式の数値解法 一次元の場合 Ÿ ¶2 u ¶ t2 In[112]:= = c2 ¶2 u ¶ x2 (6) ans = NDSolve@8D@u@t. 30<. 8x. u@t. u. 3. 6<. x. x. 8t. Derivative@1. u@0. -6. u@t. yD Š 0. 6<. 50<. -6D Š 0. 6<. 8t. 80. 8y. x.5D. 0. 8y. -6. 0. 1D@uD@t. x. 8-6. 6<.1L ^ 2D. 6D Š 0<. 5 . xD + D@u@t. PlotPoints -> 50. 3. u@0. x. x. 1<<. -6D Š u@t. x. yD. 8x. tD Š D@u@t. u@t. u@t. yD Š u@t. yD . PlotRange ® 88-6. 8-6. 0D. 6<D. 6D Š 1<. 6<. x. 8t. -6. u@t. tD Š D @u@t. x. tD Š D @u@t. First@ansDD. y. xD. ImageSize ® 200D. 6D Š -Derivative@0.2<<. 1. 6<. xD == 0. 6<D. 1D@uD@t. Derivative@0. u. -6. 80. 8x. 6. u@t. NDSolve::ibcinc : 警告:境界および初期条件が矛盾しています. ‡ In[71]:= Table@ Plot3D@Evaluate@u@t. ImageSize ® 200D. 6. y. yD == Exp@-Hx ^ 2 + y ^ 2L  0. 1D@uD@t. -6D Š -Derivative@0.nb In[51]:= ans = NDSolve@8D@u@t. xD. 6<. yD. yD Š If@Hx Š -6L ÈÈ Hy Š 6L. 6D<. yD. x. 1  2. x. u. PlotPoints -> 50. 1  2. xD.

1<<. 0. 6D Š -Derivative@0.25 D@u@t. ImageSize ® 200. -6D Š -Derivative@0.8 0. 30<.6 0. xD.6 0. t. xD. 8x.6 0. 24<D 同じ条件のもとで係数のみを変えて,結果を比較する. In[94]:= ans2 = NDSolve@8D@u@t. First@ansDD. 80. 0D@uD@0.0 1.0 -6 -4 -2 0 2 4 6 0.1L ^ 2D. Frame ® TrueD. 0. 8x.8 0. Frame ® TrueD. PlotPoints -> 50.0 -6 1. 0.6 2008week02. -6D.2 0. 6D<. 6<.8 0.4 0. Derivative@1. 0.4 0. -6. 20<.0 0.4 0. -6.4 0.2 0.4 0.0 -6 -4 -2 0 2 4 6 0.0 -6 Out[113]= -4 -2 0 2 4 6 0. u@0. 1D@uD@t. 8x. 1D@uD@t.0 -6 Plot3D@Evaluate@u@t. 6<.2 0. PlotPoints ® 100D In[87]:= Animate@Plot@Evaluate@u@t.6 0.0 0. 6<D. 10.6 0.nb In[113]:= Table@Plot@Evaluate@u@t. -6. ImageSize ® 200. -6. tD Š 0.2 0. xD . 8x.6 0. xD . x. 80. 8t. 8t. PlotRange ® 88-6. 6<. xD . Derivative@0.0 1. 3D &  Grid 1.0 1.0 1. 1<<.4 0.8 0. Derivative@0.8 0. PlotPoints -> 50. 6<. 8t. 1D@uD@t. First@ansDD. xD == 0. xD == Exp@-Hx . PlotRange ® 88-6. 8t. 1D@uD@t.8 0. xD. First@ansDD.2 0. u.0 -6 -4 -2 0 2 4 6 0. -4 -2 0 -4 -2 0 . 6<. 2<D  Partition@ð.2 0.

PlotRange ® 88-6.4 0. 0D@uD@0.2 0. Evaluate@u@t. 1D@uD@t.6 0.0 -6 In[96]:= 7 -4 -2 0 2 4 6 0. xD . xD == 0.8 0. x.2 0. xD.4 0.`において独立変数xの方向のスケールされた128.8 0. 8x. 6<. -6.5<<. ImageSize ® 200.6 0. 1<<. 6<D.0 0.8 0. u@t. xD Š 0.`において独立変数xの方向のスケールされた118.2 0. Frame ® TrueD. -6.4 0. 6<.4 0. 8x. 30<D ans = NDSolve@8D@u@t. First@ans2DD<. 8t. xD . 8x.6 0. First@ans2DD<. Sin@tD. 0D. 8t. -6. 6D Š 0<. xD Š 0. -6D Š If@t < 2 Pi. Frame ® TrueD. Sin@tD. 10. 0. u@0. First@ansDD.0 -6 Out[95]= In[100]:= -4 -2 0 2 4 6 0. ImageSize ® 200. t. 30<.0 0. Derivative@1. Derivative@1. 6<. 0D@uD@0. -6D Š If@t < 2 Pi. 60<. 6<. -6.8 0.2 0. tD Š D@u@t. PlotRange ® 88-6.6 0. 6<.nb In[95]:= Table@Plot@8Evaluate@u@t. PlotPoints -> 50. ImageSize ® 200.0 1.6 0. tD Š D@u@t. 1D@uD@t. 1. 8t. u@t.4 0. 0D. 24<D ans = NDSolve@8D@u@t. 1<<. 6D Š -Derivative@0.8 0. xD == 0. NDSolve::ibcinc : 警告:境界および初期条件が矛盾しています. ‡ NDSolve::eerr : 警告:t = 60.0 1. 0. Frame ® TrueD. 6<. 0. x. xD. 8-1. PlotPoints -> 50. -6.4 0.8 0. xD . PlotRange ® 88-6.0 1. 8t.0 -6 -4 -2 0 2 4 6 0. NDSolve::ibcinc : 警告:境界および初期条件が矛盾しています. ‡ NDSolve::eerr : 警告:t = 30.0 -6 -4 -2 0 2 4 6 0. xD . 8x. xD.2008week02.0 -6 1.5. u.564579135866` の空間誤差推定が指定の許容誤差範囲を大きく超えています.25ポイントのグリッド間隔は,希望の精„ 度または確度を達成するには大きすぎる可能性があります.特異性が形成されたかもしれません.もし„ くはMaxStepSizeまたはMinPointsメソッドオプションを用いてより小さなグリッド間隔を指定した方„ がよいかもしれません. ‡ . xD. First@ansDD.6 0. 6D<. u@0. t. xD.0 -6 -4 -2 0 -4 -2 0 Animate@ Plot@8Evaluate@u@t. 2<D  Partition@ð. First@ansDD. u@t.0 1. 0. xD. 8x.99249835452198` の空間誤差推定が指定の許容誤差範囲を大きく超えています.25ポイントのグリッド間隔は,希望の精„ 度または確度を達成するには大きすぎる可能性があります.特異性が形成されたかもしれません.もし„ くはMaxStepSizeまたはMinPointsメソッドオプションを用いてより小さなグリッド間隔を指定した方„ がよいかもしれません. ‡ In[103]:= In[109]:= Animate@Plot@Evaluate@u@t. 0.2 0. 3D &  Grid 1.2 0. 8t. xD . 80. Derivative@0. 6<D. PlotPoints -> 50. Evaluate@u@t. u. 80.

u@0. -6. 6<. 8y. -6. 0. 6D Š 0<. PlotPoints -> 50. x. -6. 8-1. yD. xD . yD == Exp@-HHx . 6<. 10. 8-6. yD Š 0. 8-2. 0. 6<. 8x. 8-6. 8y. x. ImageSize ® 200D. xD + D@u@t. 2<<. PlotRange ® 88-6. yD. First@ansDD. 6<. NDSolve::mxsst : MaxPointsまたはMinStepSizeオプションで独立変数yに対して許容される最大グリッド点数100 が使用されます. ‡ NDSolve::mxsst : MaxPointsまたはMinStepSizeオプションで独立変数xに対して許容される最大グリッド点数100 が使用されます. ‡ In[123]:= In[125]:= (7) Table@ Plot3D@Evaluate@u@t. x. 0. 6<. x. -6. 6<. PlotPoints -> 50. First@ansDD. x.1L ^ 2 + Hy + 1L ^ 2LD.8 2008week02. -6. yD . 10<. u@t. 6<. 8t. Frame ® TrueD. 6<. First@ansDD. 6<. PlotRange ® 88-6. u@t. 8x. 8t. tD Š D@u@t. yD == 0. u@t. 8-1. ImageSize ® 200. yD. 8t. 8x. -6. 8x. PlotPoints -> 50. yD Š 0.5<D  Partition@ð. x. 3D &  Grid Animate@ Plot3D@Evaluate@u@t. 0. yD. u. x. -6D Š 0. 8y. u@t. 0. 8t. -6. 1<<. ImageSize ® 200D. x. t. yD . 6<.5. 0D@uD@0. 6<D. -6. 1<<. Derivative@1. y. 10<D . 6<. 0.nb In[111]:= Animate@Plot@Evaluate@u@t. PlotRange ® 88-6.5. 60<D 二次元の場合 Ÿ ¶2 u ¶ t2 In[122]:= = cx 2 ¶2 u ¶ x2 + cy 2 ¶2 u ¶ y2 ans = NDSolve@8D@u@t. x. 6. x.