How to | DSolveの結果をチェックする方法
DSolveは通常与えられた微分方程式に対して正しい解を返すが,どの微分方程式ソルバを使う場合でも,一般常識として,返された解を検証したほうがよい.DSolveが与える解は,さまざまな方法を使って検証することができる.もっとも簡単な方法は,解を方程式に代入する方法である.結果がTrueであれば,解は有効である.
後ほど作業する際に便利なように,DSolveの第1引数をeqnに割り当てる:
eqn = y'[x] == x;DSolveの第2引数が
ではなく
として指定される場合,解は純関数として返される.この形は,解を検証し,後でさらに作業を行う際に便利である:
sol = DSolve[eqn, y, x]「/.」(ReplaceAllの簡略形)を使って,解を方程式に代入し直す:
eqn /. sol以下では同じ方法を使って,解が方程式と初期条件を満足することを検証する:
eqn = {y'[x] == x, y[0] == 1};sol = DSolve[eqn, y, x]eqn /. sol代入の結果が複雑すぎて,TrueあるいはFalseがすぐに得られないという場合がある.そのような例については,Simplifyを使って代入の結果を簡略化することによって検証することができる.簡略化された結果がTrueであれば,解は有効である.
eqn = y''[x] + 5 * y'[x] + 6y[x] == 1;sol = DSolve[eqn, y, x]eqn /. solSimplifyを使って解を検証する:
Simplify[eqn /. sol]PDE = D[u[x, y], x] + Sin[x] * D[u[x, y], y] == x ^ 2;sol = DSolve[PDE, u, {x, y}]Simplify[PDE /. sol]方程式に特殊関数が含まれる場合には,FullSimplifyを使って解を検証する必要がある場合もある.
eqn = x * y''[x] + y'[x] - y[x] == 1;sol = DSolve[eqn, y, x]Simplifyでは解を検証することはできない:
Simplify[eqn /. sol]FullSimplifyを使うと検証できる:
FullSimplify[eqn /. sol]もう一つの重要な検証方法として,問題の変数とパラメータのすべてについて数値的なチェックを行うということがある.そのような場合には,ランダムな値の集合を複数使って,チェックを繰り返した方がよい.
eqn = y''[x] - (a * x ^ 6 + x ^ 2) * y[x];sol = DSolve[eqn == 0, y, x]Table[Chop[eqn /. sol /. {x -> RandomReal[], a -> RandomReal[], C[1] -> RandomReal[], C[2] -> RandomReal[]}], {i, 1, 10}]数値的なチェックでは解を確証持って検証することはできないが,より高い精度を使ったり,変数が複素数を取れるようにしたりすることによって,より厳密なチェックを行うことができる.
Chop[eqn /. sol /. {x -> RandomReal[ {1, 2}, WorkingPrecision -> 20], a -> RandomReal[ {1, 2}, WorkingPrecision -> 20], C[1] -> RandomReal[ {1, 2}, WorkingPrecision -> 20], C[2] -> RandomReal[ {1, 2}, WorkingPrecision -> 20]}]r := RandomComplex[]Chop[N[eqn /. sol /. {x -> r, a -> r, C[1] -> r, C[2] -> r}]]