There are commands like NonlinearModelFit[]
or NDSolve[]
that have the option Method
it typically defaults to Automatic
. How can you check after the evaluation of the command which method Mathematica picked?
3 Answers
I think you can actually see (most of) what Mathematica is doing by using Trace[..., TraceInternal -> True]
.
For example,
Select[Flatten[
Trace[NDSolve[y'[x] == x && y[0] == 0, y, {x, 0, 6}],
TraceInternal -> True]], ! FreeQ[#, Method | NDSolve`MethodData] &]
shows the DE was evaluated using NDSolve`LSODA
and Newton's method. (I think)
And
Select[Flatten[
Trace[NDSolve[{Derivative[1][x][t]^2 + x[t]^2 == 1, x[0] == 1/2},
x, {t, 0, 10 Pi}, SolveDelayed -> True],
TraceInternal -> True]], ! FreeQ[#, Method | NDSolve`MethodData] &]
used NDSolve`IDA
.
As an aside, here's something I just learnt from Trott's Mathematica guidebook for numerics, to see all of the methods and suboptions for NDSolve
{#, First /@ #2} & @@@
Select[{#, Options[#]} & /@ (ToExpression /@
DeleteCases[Names["NDSolve`*"],(* PDE method only *) "NDSolve`MethodOfLines"]),
(Last[#] =!= {}) &]
-
$\begingroup$ I just saw ruebenko's answer. Using
TraceInternal
as above seems to give the same list of methods as hisdata
, but it requires a lot of digging... $\endgroup$– SimonJan 18, 2012 at 12:04 -
1$\begingroup$ You can also use the second argument of
Trace
; for example,Trace[NDSolve[..], _NDSolve`InitializeMethod | _[NDSolve`MethodData[___]], TraceInternal -> True]
$\endgroup$ Jan 24, 2017 at 0:04 -
$\begingroup$ @Simon, to check which method was chosen by
NSolve
instead ofNDSolve
, I changed! FreeQ[#, Method | NDSolve
MethodData] &` to! FreeQ[#, Method | NSolve
MethodData] &`, but it seems not to work, could you give some suggestions? Thank you! $\endgroup$– NobodyNov 30 at 10:07
For NDSolve
with one step methods you can use the MethodMonitor
.
data = Last[
Reap[sol =
NDSolve[{y'[x] == y[x] Cos[x + y[x]], y[0] == 1}, y, {x, 0, 30},
Method -> "StiffnessSwitching",
"MethodMonitor" :> (Sow[NDSolve`Self[[0]]];)];]];
See:
tutorial/NDSolveStiffnessTest
tutorial/NDSolveExtrapolation
Adams, BDF, IDA are multi-step methods and do not work with this approach.
-
$\begingroup$ Nice! But if I am not mistaken, this seems to be a
NDSolve[]
only solution? $\endgroup$– uliJan 18, 2012 at 12:07 -
$\begingroup$ @Uli , sorry only got this question now, yes, this is NDSolve specific. $\endgroup$– user21Mar 19, 2012 at 9:34
I asked this question once after a presentation by Jon McLoone. His answer was that that was not possible and that Mathematica can switch methods many times if the situation asks for it. So it wouldn't be useful either. I agree that this is not completely satisfactory.
Options
to check which ones were given. But there is no such thing likeMethod[%]
that informs me what Mathematics did. If I publish results I cannot write "The fitting was probably done with LevenbergMarquardt, but I can’t tell for sure, because there is no command to check." $\endgroup$