How to | 導関数を使って微分方程式を設定する方法
微分方程式を解くためのWolfram言語の関数は,常微分方程式,偏微分方程式,微分代数方程式,境界値問題を含むさまざまな種類の微分方程式に適用することができる.Wolfram言語では,導関数を使ってこれらの方程式を設定して解くことが大切である.
常微分方程式については,
の関数
の導関数を
についていくつかの方法で表現することができる.
最も一般的な方法は,Dを使う方法である:
D[f[t], t]D[f[t], {t, 1}]f'[t]「'」はDerivativeの簡略形である:
Derivative[1][f][t]FullFormを使うと,「'」とDerivativeが同等であることが分かる:
FullForm[f'[t]]Dを使って常微分方程式
を設定してから,その方程式をodeとして保存する:
ode = D[f[t], t] + f[t] == 1TraditionalFormを使って常微分方程式を数学の教科書や学術論文に表示されるような形で表示する:
ode//TraditionalForm一旦常微分方程式が設定されたら,DSolveを使ってそれを記号的に解く:
DSolve[ode, f[t], t]解f[t]はネストしたリストの規則として表される.この解をリストから取り出して使用する方法については,「規則の解を使う方法」を参照のこと.
ほとんどの場合,常微分方程式には境界と初期条件を伴う.したがって,変数の特定の値について関数の導関数は何度も評価される必要がある.これはいくつかの方法で行うことができる.例えば以下では,
が例として使われている.
ReplaceAll関数の簡略形である「/. 」を使って,
を
で置き換える.Wolfram言語ではまずDが評価されてから,置換が行われる:
D[f[t], t] /. t -> 0f'[0]Derivativeを使うこともできる:
Derivative[1][f][0]eqns = {x ^ 2D[f[t], {t, 2}] + x f[t] == t, (D[f[t], t] /. t -> 0) == 0, f[0] == 0}DSolveを使って記号解を得る:
DSolve[eqns, f[t], t]DSolve[{x ^ 2D[f[t], {t, 2}] + x f[t] == t, (D[f[t], t] /. t -> 0) == 0, f[0] == 0}, f[t], t]別の方法として,常微分方程式を偏微分方程式として表現し,それをf[t]ではなくf[x,t]について解くこともできる:
eqns2 = {x ^ 2D[f[x, t], {t, 2}] + x f[x, t] == t, (D[f[x, t], t] /. t -> 0) == 0, f[x, 0] == 0}DSolve[eqns2, f[x, t], t]ode2 = {(x ^ 3 - 2)D[f[t], t] + f[t] == t, f[1] == 2}DSolveを使って記号的解を得る:
DSolve[ode2, f[t], t]DSolveを使う代りにNDSolveを使って,常微分方程式の係数のいずれかに関係している
の特定の値に対応する数値解を求めることもできる.
以下の例では,
である場合の解を与える.NDSolveは,InterpolatingFunctionオブジェクトを使った形の結果を与える:
NDSolve[ode2 /. x -> 4, f[t], {t, 0, 5}]以下の関数Fを使うと,
の各値に対する数値解を求めることができる:
F[x_ ? NumericQ] := NDSolve[{(x ^ 3 - 2)D[f[t], t] + f[t] == t, f[1] == 2}, f[t], {t, 0, 2}][[1, 1, 2]]
および
について結果をプロットする.Evaluateを使ってF がPlotで正しく評価されるようにする:
Plot[Evaluate[{F[2], F[4]}], {t, 0, 5}]この詳細については,「NDSolveの結果をプロットする方法」を参照のこと.
Wolfram言語では,偏微分方程式を設定して解くこともできる.
以下では,関数
を使い,Wolfram言語においてさまざまな方法で偏微分方程式が表現できることを示している.
偏導関数を得る最も一般的な方法は,Dを使う方法である:
D[f[u, t], {t, 1}]D[f[u, t], {t, 2}]D[f[u, t], {t, 2}, {u, 1}]同じことをDの少し異なる構文を使って行うこともできる:
D[f[u, t], t]D[f[u, t], t, t]D[f[u, t], u, t, t]別の方法として,Derivativeを使う方法もある:
Derivative[0, 1][f][u, t]Derivative[0, 2][f][u, t]Derivative[1, 2][f][u, t]FullFormを使って,これらの方法が同等であることを示す:
FullForm[D[f[u, t], {t, 2}, {u, 1}]]pde = D[f[u, t], u] + D[f[u, t], t] == 0DSolveを使って上の偏微分方程式の記号解を求める.下の結果は,任意関数C[1]を使った形で与えられている:
DSolve[pde , f[u, t], {u, t}]解は,純関数として得ることもできる.Functionは,Wolfram言語における純関数を表す:
DSolve[pde , f, {u, t}]DSolveを使って偏微分方程式
,
の記号解を求める:
DSolve[{pde, f[u, 0] == u}, f, {u, t}]NDSolveを使って,偏微分方程式
,
,
の記号解を得る.解は,後で使えるようにsolとして保存される:
sol = NDSolve[{pde, f[u, 0] == u, f[1, t] == 1 - t}, f, {u, 0, 1}, {t, 0, 1}]Plot3D[f[u, t] /. sol[[1]], {u, 0, 1}, {t, 0, 1}]常微分方程式と偏微分方程式に加えて,Wolframシステムでは微分代数方程式を解くこともできる.
eqns = {a x'[t] - y[t] == Cos[t], x[t] + b y[t] == 0};DSolveを使って微分代数方程式の記号解を得る:
sol = DSolve[{eqns, x[0] == 0}, {x[t], y[t]}, t]
および
における解を見るために,「/.」を使ってこれらの値を解に代入する:
psol = sol /. {a -> 2, b -> 1}Plot[{x[t] /. psol, y[t] /. psol}, {t, 0, 20}]まず
および
をeqnsに代入してから,次にNDSolveを使うことによって,同じプロットを得ることもできる:
sol2 = NDSolve[{eqns /. {a -> 2, b -> 1}, x[0] == 0}, {x[t], y[t]}, {t, 0, 20}]上と同じようにPlotを使って解を可視化する:
Plot[{x[t] /. sol2, y[t] /. sol2}, {t, 0, 20}]