NDSolveの"FixedStep"法
NDSolveの"FixedStep"法
はじめに
固定刻み幅を使って数値積分を実行すると便利なことがよくある.
例えば,"DoubleStep"や"Extrapolation"等のメソッドはさらに正確なメソッドを得るために,適応刻み幅を容認する誤差推定値と解とを組み合せる前に,一連の固定刻み幅による積分を実行する.
"FixedStep"法を使うと,固定刻み幅を使って1ステップの積分法が実行できる.
以下のようにして,例題のパッケージと効用関数のパッケージをロードする.
Needs["DifferentialEquations`NDSolveProblems`"];
Needs["DifferentialEquations`NDSolveUtilities`"];例題
system = GetNDSolveProblem["BrusselatorODE"]NDSolve[{y''[t] == -y[t], y[0] == 1, y'[0] == 0}, y, {t, 0, 1}, StartingStepSize -> 1 / 10, Method -> {"FixedStep", Method -> "ExplicitEuler"}]sol = NDSolve[system, StartingStepSize -> 1 / 10, Method -> "ExplicitEuler"];
StepDataPlot[sol, PlotRange -> {0, 0.2}]sol = NDSolve[system, StartingStepSize -> 1 / 10, Method -> "ExplicitRungeKutta"];
StepDataPlot[sol]sol = NDSolve[system, StartingStepSize -> 1 / 10, Method -> {"FixedStep", Method -> "ExplicitRungeKutta"}];
StepDataPlot[sol, PlotRange -> {0, 0.2}]積分区間に依存する刻み幅の絶対区間は,MaxStepFractionオプションが提供する.
MaxStepFractionのデフォルト値は1/10なので,この例題の刻み幅は積分区間の10分の1が境界となる.これで1/20という一定の刻み幅を使うようになる:
time = {T, 0, 1 / 2};
sol = NDSolve[system, time, StartingStepSize -> 1 / 10, Method -> {"FixedStep", Method -> "ExplicitRungeKutta"}];
StepDataPlot[sol, PlotRange -> {0, 0.2}]MaxStepFractionの値を別の値に設定すると,積分区間への刻み幅の依存性が緩和されたり,完全になくなったりすることがある:
sol = NDSolve[system, time, StartingStepSize -> 1 / 10, MaxStepFraction -> Infinity, Method -> {"FixedStep", Method -> "ExplicitRungeKutta"}];
StepDataPlot[sol, PlotRange -> {0, 0.2}]