How to | 偏微分方程式を解く方法
Wolfram言語の微分方程式解法関数は,多くの種類の微分方程式に適用できる.これらの関数は,適切なアルゴリズムを自動的に選択するので,ユーザが予め処理をする必要はない.このような微分方程式の1つに偏微分方程式がある.
Dを使って導関数を取り込み,
の輸送方程式である
を設定し,それを変数pdeとして保存する:
pde = D[y[x, t], t] + 2D[y[x, t], x] == 0DSolveを使って方程式を解き,解をsolnとして保存する.DSolveの第1引数は方程式,第2引数は解くための関数,第3引数は独立変数のリストである.
soln = DSolve[pde, y[x, t], {x, t}]答は規則として与えられ,C[1]は任意の関数である.
この解を,例えばf[x,t]という関数として使用する場合は,「/.」(ReplaceAllの簡略形)および [[...]](Partの簡略形)を使う:
f[x_, t_] = y[x, t] /. soln[[1]]f[x, 0]DSolveの第1引数にリストを使って,
のような初期条件を追加することができる.解はsolとして保存される:
sol = DSolve[{pde, y[0, t] == Sin[t]}, y[x, t], {x, t}]Plot3Dを使って解をプロットする:
Plot3D[y[x, t] /. sol, {x, -4, 4}, {t, -4, 4}]初期条件が
である非同次の偏微分方程式
にDSolveを使用する:
sol1 = DSolve[{D[y[x, t], t] + 2D[y[x, t], x] == Sin[x], y[0, t] == Cos[t]}, y[x, t], {x, t}]sol2 = sol1[[1, 1, 2]]sol2 /. {t -> 1, x -> 2}今度はPlot3Dを使って解をプロットする:
Plot3D[sol2, {x, -10, 10}, {t, -5, 5}]DSolveを使って,初期条件が
である非同次の偏微分方程式
を解く.解はpdesolとして保存される:
pdesol = DSolve[{b D[y[x, t], t] + a D[y[x, t], x] == c Sin[x], y[0, t] == a Cos[t]}, y[x, t], {x, t}]Fsol[x_, t_] = (y[x, t] /. pdesol)[[1]]Fsol[2, 1]Fsol[2, 1] /. {a -> 2, b -> 5, c -> 10}Plot3D[Fsol[x, t] /. {a -> 2, b -> 5, c -> 10}, {x, -10, 10}, {t, -5, 5}]Manipulateを使って,パラメータa,b,cについて解Fsolがどのように変化するかを示す:
Manipulate[Plot3D[Fsol[x, t] /. {a -> aa, b -> bb, c -> cc}, {x, -4, 4}, {t, -2, 2}], {aa, -2, 2}, {bb, -2, 2}, {cc, -2, 2}, SaveDefinitions -> True]ここまでの例では,DSolveを使って偏微分方程式の記号解が求められている.任意の偏微分方程式にパラメータが含まれない場合には,NDSolveを使って数値解を得ることができる.NDSolveの結果はInterpolatingFunctionオブジェクトとして与えられる.
以下では,NDSolveによって出された解は,nsol1として保存される:
nsol1 = NDSolve[{D[y[x, t], t] + 2D[y[x, t], x] == 3 , y[x, 0] == x + 3 , y[5, t] == t + 8}, y[x, t], {x, 0, 5}, {t, 0, 4}]解をPlot3Dを使ってプロットする:
Plot3D[nsol1[[1, 1, 2]], {x, 0, 5}, {t, 0, 4}]InterpolatingFunctionオブジェクトは,他の操作で評価,プロット,使用することができる.
InterpolatingFunctionの解だけをnsol1から得て,それを新しい記号nsol2に割り当てる:
nsol2 = nsol1[[1, 1, 2]]nsol2 /. {x -> 1 / 2, t -> 1}Plot3Dを使って解nsol2をプロットする:
Plot3D[nsol2, {x, 0, 5}, {t, 0, 4}]偏微分方程式にパラメータが含まれる場合,NDSolveをパラメータの特定値それぞれに使うことができる.また,NDSolveを使いパラメータの値を取る関数を設定することもできる.
?NumericQを使って関数がパラメータの非数値について評価することを防ぐ:
fsol[k_ ? NumericQ] := NDSolve[{Derivative[2, 0][u][x, t] x ^ 4 == x ^ 3 t Cos[x Sin[t]] / (1 / 10 + Sin[t]) + k Derivative[0, 1][u][x, t], u[0, t] == 0, u[1, t] == 0, u[x, 0] == x(1 - x)}, u[x, t], {x, 0, 1}, {t, 0, 1}]fsol[5]Plot3Dを使って解をプロットする.評価を正しい順序で行うためには,Evaluateが必要である:
Plot3D[Evaluate[u[x, t] /. fsol[5][[1]]], {t, 0, 1}, {x, 0, 1}, PlotRange -> All]NDSolveは,Manipulateのような別のWolfram言語の関数でも使用できる.
パラメータkの任意値に対応する偏微分方程式を解いてから,結果の解をプロットする:
Manipulate[Plot3D[Evaluate[u[x, t] /. fsol[k][[1]]], {t, 0, 1}, {x, 0, 1}, PlotRange -> All], {k, 1 / 100, 5}, SaveDefinitions -> True]