diff scripts/ode/ode23s.m @ 31495:4cb81dcc5cc5 stable

Add BIST for OutputSel option in ode23, ode23s, ode45 (bug #63229) * ode23.m, ode23s.m, ode45.m: Add a BIST test function to be called within odeset to ensure the odeXX function call passes the correct elements to the output monitoring function. Add BISTs that call test function in scalar and vector forms.
author Ken Marek <marek_ka@mercer.edu>
date Wed, 16 Nov 2022 23:07:58 -0500
parents 7286327ec4b6
children e7b51b5b33f8
line wrap: on
line diff
--- a/scripts/ode/ode23s.m	Mon Nov 21 08:46:07 2022 +0100
+++ b/scripts/ode/ode23s.m	Wed Nov 16 23:07:58 2022 -0500
@@ -399,6 +399,35 @@
 %!    error ("fout: invalid flag <%s>", flag);
 %!  endif
 %!endfunction
+%!function stop_solve = OutputSel_test (t, y, flag, x)
+%!  ## x == 1: select y(1)
+%!  ## x == 2: select y(2)
+%!  ## x == 3: select y([1,2])
+%!  persistent y_last
+%!  if strcmp (flag, "init")
+%!    y_last = y;
+%!    if ((x == 1) || (x == 2))
+%!      assert (length (y) == 1);
+%!    elseif (x == 3)
+%!      assert (length (y) == 2);
+%!    endif
+%!  elseif strcmp (flag, "done")
+%!    y_exp = fref ().';
+%!    if (x < 3)
+%!      assert (y_last, y_exp(x), 1e-4);
+%!    else
+%!      assert (y_last, y_exp, 1e-4);
+%!    endif
+%!  else # flag == ""
+%!    y_last = y(:,end);
+%!    if ((x == 1) || (x == 2))
+%!      assert (length (t) == length (y));
+%!    else
+%!      assert (2 * length (t) == length (y(:)));
+%!    endif
+%!  endif
+%!  stop_solve = 0;
+%!endfunction
 %!
 %!test  # two output arguments
 %! [t, y] = ode23s (@fpol, [0 2], [2 0]);
@@ -442,8 +471,17 @@
 %! opt = odeset ("RelTol", 1e-8, "NormControl", "on");
 %! sol = ode23s (@fpol, [0 2], [2 0], opt);
 %! assert ([sol.x(end); sol.y(:,end)], [2; fref'], 1e-4);
-%!test  # Details of OutputSel can't be tested
-%! opt = odeset ("OutputFcn", @fout, "OutputSel", 1);
+%!test  # OutputSel 1 (see function OutputSel_test for asserts)
+%! opt = odeset ("OutputFcn", @(t, y, flag) OutputSel_test (t, y, flag, 1), ...
+%!               "OutputSel", 1);
+%! sol = ode23s (@fpol, [0 2], [2 0], opt);
+%!test  # OutputSel 2 (see function OutputSel_test for asserts)
+%! opt = odeset ("OutputFcn", @(t, y, flag) OutputSel_test (t, y, flag, 2), ...
+%!               "OutputSel", 2);
+%! sol = ode23s (@fpol, [0 2], [2 0], opt);
+%!test  # OutputSel [1,2] (see function OutputSel_test for asserts)
+%! opt = odeset ("OutputFcn", @(t, y, flag) OutputSel_test (t, y, flag, 3), ...
+%!               "OutputSel", [1, 2]);
 %! sol = ode23s (@fpol, [0 2], [2 0], opt);
 %!test  # Stats must add further elements in sol
 %! opt = odeset ("Stats", "on");