# HG changeset patch # User Rik # Date 1477285400 25200 # Node ID 04fc7e9c5f96270067f0292a82513a981e6f8a95 # Parent 56d7d423aff97220770d54af842b0fd2d40e490a Disable Refine option of ode solvers for certain input/output combinations (partial fix bug #49408). * ode23.m: Set Refine field of odeopts to [] when a single output argument is requested or when specific intermediate times are requested. * ode45.m: Set Refine field of odeopts to [] when a single output argument is requested or when specific intermediate times are requested. Update BIST tests to match new behavior. diff -r 56d7d423aff9 -r 04fc7e9c5f96 scripts/ode/ode23.m --- a/scripts/ode/ode23.m Sun Oct 23 21:33:38 2016 -0700 +++ b/scripts/ode/ode23.m Sun Oct 23 22:03:20 2016 -0700 @@ -224,10 +224,13 @@ endif endif - ## Single output requires auto-selected intermediate times, - ## which is obtained by NOT specifying specific solution times. - if (nargout == 1 && numel (trange > 2)) - trange = [trange(1) trange(end)]; + if (nargout == 1) + ## Single output requires auto-selected intermediate times, + ## which is obtained by NOT specifying specific solution times. + trange = [trange(1); trange(end)]; + odeopts.Refine = []; # disable Refine when single output requested + elseif (numel (trange) > 2) + odeopts.Refine = []; # disable Refine when specific times requested endif solution = integrate_adaptive (@runge_kutta_23, diff -r 56d7d423aff9 -r 04fc7e9c5f96 scripts/ode/ode45.m --- a/scripts/ode/ode45.m Sun Oct 23 21:33:38 2016 -0700 +++ b/scripts/ode/ode45.m Sun Oct 23 22:03:20 2016 -0700 @@ -215,10 +215,13 @@ endif endif - ## Single output requires auto-selected intermediate times, - ## which is obtained by NOT specifying specific solution times. - if (nargout == 1 && numel (trange > 2)) - trange = [trange(1) trange(end)]; + if (nargout == 1) + ## Single output requires auto-selected intermediate times, + ## which is obtained by NOT specifying specific solution times. + trange = [trange(1); trange(end)]; + odeopts.Refine = []; # disable Refine when single output requested + elseif (numel (trange) > 2) + odeopts.Refine = []; # disable Refine when specific times requested endif solution = integrate_adaptive (@runge_kutta_45_dorpri, @@ -392,10 +395,10 @@ %! opt = odeset ("MaxStep", 1e-3); %! sol = ode45 (@fpol, [0 0.2], [2 0], opt); %! assert ([sol.x(5)-sol.x(4)], [1e-3], 1e-3); -%!test # Solve with intermidiate step -%! sol = ode45 (@fpol, [0 1 2], [2 0]); -%! assert (any((sol.x-1) == 0)); -%! assert ([sol.x(end); sol.y(:,end)], [2; fref'], 1e-3); +%!test # Solve with intermediate step +%! [t, y] = ode45 (@fpol, [0 1 2], [2 0]); +%! assert (any((t-1) == 0)); +%! assert ([t(end), y(end,:)], [2, fref], 1e-3); %!test # Solve in backward direction starting at t=0 %! vref = [-1.205364552835178, 0.951542399860817]; %! sol = ode45 (@fpol, [0 -2], [2 0]); @@ -404,12 +407,12 @@ %! vref = [-1.205364552835178, 0.951542399860817]; %! sol = ode45 (@fpol, [2 -2], fref); %! assert ([sol.x(end); sol.y(:,end)], [-2; vref'], 1e-2); -%!test # Solve in backward direction starting at t=2, with intermidiate step +%!test # Solve in backward direction starting at t=2, with intermediate step %! vref = [-1.205364552835178, 0.951542399860817]; -%! sol = ode45 (@fpol, [2 0 -2], fref); -%! idx = find(sol.x < 0, 1, "first") - 1; -%! assert ([sol.x(idx); sol.y(:,idx)], [0;2;0], 1e-2); -%! assert ([sol.x(end); sol.y(:,end)], [-2; vref'], 1e-2); +%! [t, y] = ode45 (@fpol, [2 0 -2], fref); +%! idx = find(y < 0, 1, "first") - 1; +%! assert ([t(idx), y(idx,:)], [0,2,0], 1e-2); +%! assert ([t(end), y(end,:)], [-2, vref], 1e-2); %!test # Solve another anonymous function in backward direction %! vref = [-1, 0.367879437558975]; %! sol = ode45 (@(t,y) y, [0 -1], 1);