annotate scripts/ode/ode45.m @ 20646:01586012300e

compute number of fevals correctly in ode45 (bug #46189) * scripts/ode/ode45.m: account for FSAL when counting FEvals
author Carlo de Falco <carlo.defalco@polimi.it>
date Mon, 12 Oct 2015 22:50:59 +0200
parents a22d8a2eb0e5
children 05c77bc1d204
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
20585
45151de7423f maint: Clean up implementations of ode45.m, odeget.m, odeset.m.
Rik <rik@octave.org>
parents: 20581
diff changeset
1 ## Copyright (C) 2014, Jacopo Corno <jacopo.corno@gmail.com>
20568
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
2 ## Copyright (C) 2013, Roberto Porcu' <roberto.porcu@polimi.it>
20585
45151de7423f maint: Clean up implementations of ode45.m, odeget.m, odeset.m.
Rik <rik@octave.org>
parents: 20581
diff changeset
3 ## Copyright (C) 2006-2012, Thomas Treichl <treichl@users.sourceforge.net>
20568
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
4 ##
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
5 ## This file is part of Octave.
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
6 ##
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
7 ## Octave is free software; you can redistribute it and/or modify it
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
8 ## under the terms of the GNU General Public License as published by
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
9 ## the Free Software Foundation; either version 3 of the License, or (at
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
10 ## your option) any later version.
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
11 ##
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
12 ## Octave is distributed in the hope that it will be useful, but
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
13 ## WITHOUT ANY WARRANTY; without even the implied warranty of
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
14 ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
15 ## General Public License for more details.
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
16 ##
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
17 ## You should have received a copy of the GNU General Public License
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
18 ## along with Octave; see the file COPYING. If not, see
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
19 ## <http://www.gnu.org/licenses/>.
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
20
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
21 ## -*- texinfo -*-
20580
25623ef2ff4f doc: Rewrite docstrings for ode* family of functions.
Rik <rik@octave.org>
parents: 20575
diff changeset
22 ## @deftypefn {Function File} {[@var{t}, @var{y}] =} ode45 (@var{fun}, @var{trange}, @var{init})
25623ef2ff4f doc: Rewrite docstrings for ode* family of functions.
Rik <rik@octave.org>
parents: 20575
diff changeset
23 ## @deftypefnx {Function File} {[@var{t}, @var{y}] =} ode45 (@var{fun}, @var{trange}, @var{init}, @var{opt})
25623ef2ff4f doc: Rewrite docstrings for ode* family of functions.
Rik <rik@octave.org>
parents: 20575
diff changeset
24 ## @deftypefnx {Function File} {[@var{t}, @var{y}] =} ode45 (@dots{}, @var{par1}, @var{par2}, @dots{})
25623ef2ff4f doc: Rewrite docstrings for ode* family of functions.
Rik <rik@octave.org>
parents: 20575
diff changeset
25 ## @deftypefnx {Function File} {[@var{t}, @var{y}, @var{xe}, @var{ye}, @var{ie}] =} ode45 (@dots{})
25623ef2ff4f doc: Rewrite docstrings for ode* family of functions.
Rik <rik@octave.org>
parents: 20575
diff changeset
26 ## @deftypefnx {Function File} {@var{sol} =} ode45 (@var{fun}, @var{trange}, @var{init}, @dots{})
20568
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
27 ##
20580
25623ef2ff4f doc: Rewrite docstrings for ode* family of functions.
Rik <rik@octave.org>
parents: 20575
diff changeset
28 ## Solve a set of non-stiff Ordinary Differential Equations (non-stiff ODEs)
25623ef2ff4f doc: Rewrite docstrings for ode* family of functions.
Rik <rik@octave.org>
parents: 20575
diff changeset
29 ## with the well known explicit Dormand-Prince method of order 4.
20568
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
30 ##
20580
25623ef2ff4f doc: Rewrite docstrings for ode* family of functions.
Rik <rik@octave.org>
parents: 20575
diff changeset
31 ## The first input argument must be a function handle or inline function that
25623ef2ff4f doc: Rewrite docstrings for ode* family of functions.
Rik <rik@octave.org>
parents: 20575
diff changeset
32 ## defines the ODE: @code{y' = f(t,y)}. The function must accept two inputs
25623ef2ff4f doc: Rewrite docstrings for ode* family of functions.
Rik <rik@octave.org>
parents: 20575
diff changeset
33 ## where the first is time @var{t} and the second is a column vector of
25623ef2ff4f doc: Rewrite docstrings for ode* family of functions.
Rik <rik@octave.org>
parents: 20575
diff changeset
34 ## unknowns @var{y}.
20568
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
35 ##
20580
25623ef2ff4f doc: Rewrite docstrings for ode* family of functions.
Rik <rik@octave.org>
parents: 20575
diff changeset
36 ## @var{trange} specifies the time interval over which the ODE will be
25623ef2ff4f doc: Rewrite docstrings for ode* family of functions.
Rik <rik@octave.org>
parents: 20575
diff changeset
37 ## evaluated. Usually, it is a two-element vector specifying the initial and
25623ef2ff4f doc: Rewrite docstrings for ode* family of functions.
Rik <rik@octave.org>
parents: 20575
diff changeset
38 ## final times (@code{[tinit, tfinal]}). If there are more than two elements
25623ef2ff4f doc: Rewrite docstrings for ode* family of functions.
Rik <rik@octave.org>
parents: 20575
diff changeset
39 ## then the solution will also be evaluated at these intermediate time
25623ef2ff4f doc: Rewrite docstrings for ode* family of functions.
Rik <rik@octave.org>
parents: 20575
diff changeset
40 ## instances unless the integrate function called is
25623ef2ff4f doc: Rewrite docstrings for ode* family of functions.
Rik <rik@octave.org>
parents: 20575
diff changeset
41 ## @command{integrate_n_steps}. If there is only one time value, then
25623ef2ff4f doc: Rewrite docstrings for ode* family of functions.
Rik <rik@octave.org>
parents: 20575
diff changeset
42 ## @code{ode45} will raise an error unless the options structure has
25623ef2ff4f doc: Rewrite docstrings for ode* family of functions.
Rik <rik@octave.org>
parents: 20575
diff changeset
43 ## non-empty fields named @var{"TimeStepNumber"} and @var{"TimeStepSize"}.
25623ef2ff4f doc: Rewrite docstrings for ode* family of functions.
Rik <rik@octave.org>
parents: 20575
diff changeset
44 ## If the option @var{"TimeStepSize"} is not empty, then the stepper called
25623ef2ff4f doc: Rewrite docstrings for ode* family of functions.
Rik <rik@octave.org>
parents: 20575
diff changeset
45 ## will be @command{integrate_const}. If @var{"TimeStepNumber"} is also
25623ef2ff4f doc: Rewrite docstrings for ode* family of functions.
Rik <rik@octave.org>
parents: 20575
diff changeset
46 ## specified then the integrate function @command{integrate_n_steps} will be
25623ef2ff4f doc: Rewrite docstrings for ode* family of functions.
Rik <rik@octave.org>
parents: 20575
diff changeset
47 ## used; otherwise, @command{integrate_adaptive} is used. For this last
25623ef2ff4f doc: Rewrite docstrings for ode* family of functions.
Rik <rik@octave.org>
parents: 20575
diff changeset
48 ## possibility the user can set the tolerance for the timestep computation by
25623ef2ff4f doc: Rewrite docstrings for ode* family of functions.
Rik <rik@octave.org>
parents: 20575
diff changeset
49 ## changing the option @var{"Tau"}, that has a default value of @math{1e-6}.
20568
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
50 ##
20580
25623ef2ff4f doc: Rewrite docstrings for ode* family of functions.
Rik <rik@octave.org>
parents: 20575
diff changeset
51 ## The third input argument @var{init} contains the initial value for the
25623ef2ff4f doc: Rewrite docstrings for ode* family of functions.
Rik <rik@octave.org>
parents: 20575
diff changeset
52 ## unknowns. If this is a row vector then the solution @var{y} will be a matrix
25623ef2ff4f doc: Rewrite docstrings for ode* family of functions.
Rik <rik@octave.org>
parents: 20575
diff changeset
53 ## in which each column is the solution for the corresponding initial value
25623ef2ff4f doc: Rewrite docstrings for ode* family of functions.
Rik <rik@octave.org>
parents: 20575
diff changeset
54 ## in @var{init}.
20568
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
55 ##
20580
25623ef2ff4f doc: Rewrite docstrings for ode* family of functions.
Rik <rik@octave.org>
parents: 20575
diff changeset
56 ## If present, the fourth input argument specifies options to the ODE solver.
25623ef2ff4f doc: Rewrite docstrings for ode* family of functions.
Rik <rik@octave.org>
parents: 20575
diff changeset
57 ## It is a structure typically generated by @code{odeset}.
25623ef2ff4f doc: Rewrite docstrings for ode* family of functions.
Rik <rik@octave.org>
parents: 20575
diff changeset
58 ##
25623ef2ff4f doc: Rewrite docstrings for ode* family of functions.
Rik <rik@octave.org>
parents: 20575
diff changeset
59 ## The function usually produces just two outputs. Variable @var{t} is a
25623ef2ff4f doc: Rewrite docstrings for ode* family of functions.
Rik <rik@octave.org>
parents: 20575
diff changeset
60 ## column vector and contains the times where the solution was found. The
25623ef2ff4f doc: Rewrite docstrings for ode* family of functions.
Rik <rik@octave.org>
parents: 20575
diff changeset
61 ## output @var{y} is a matrix in which each column refers to a different
25623ef2ff4f doc: Rewrite docstrings for ode* family of functions.
Rik <rik@octave.org>
parents: 20575
diff changeset
62 ## unknown of the problem and each row corresponds to a time in @var{t}.
20568
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
63 ##
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
64 ## For example, solve an anonymous implementation of the Van der Pol equation
20580
25623ef2ff4f doc: Rewrite docstrings for ode* family of functions.
Rik <rik@octave.org>
parents: 20575
diff changeset
65 ##
20568
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
66 ## @example
20580
25623ef2ff4f doc: Rewrite docstrings for ode* family of functions.
Rik <rik@octave.org>
parents: 20575
diff changeset
67 ## @group
20568
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
68 ## fvdp = @@(t,y) [y(2); (1 - y(1)^2) * y(2) - y(1)];
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
69 ## [T,Y] = ode45 (fvdp, [0 20], [2 0]);
20580
25623ef2ff4f doc: Rewrite docstrings for ode* family of functions.
Rik <rik@octave.org>
parents: 20575
diff changeset
70 ## @end group
20568
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
71 ## @end example
20580
25623ef2ff4f doc: Rewrite docstrings for ode* family of functions.
Rik <rik@octave.org>
parents: 20575
diff changeset
72 ## @seealso{odeset, odeget}
20568
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
73 ## @end deftypefn
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
74
20585
45151de7423f maint: Clean up implementations of ode45.m, odeget.m, odeset.m.
Rik <rik@octave.org>
parents: 20581
diff changeset
75 function varargout = ode45 (vfun, vtrange, vinit, varargin)
20568
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
76
20585
45151de7423f maint: Clean up implementations of ode45.m, odeget.m, odeset.m.
Rik <rik@octave.org>
parents: 20581
diff changeset
77 vorder = 5; # runge_kutta_45_dorpri uses local extrapolation
20568
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
78 vsolver = "ode45";
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
79
20585
45151de7423f maint: Clean up implementations of ode45.m, odeget.m, odeset.m.
Rik <rik@octave.org>
parents: 20581
diff changeset
80 ## FIXME: Octave core function's usually do print_usage ()
45151de7423f maint: Clean up implementations of ode45.m, odeget.m, odeset.m.
Rik <rik@octave.org>
parents: 20581
diff changeset
81 ## rather than displaying full help string when improperly called.
45151de7423f maint: Clean up implementations of ode45.m, odeget.m, odeset.m.
Rik <rik@octave.org>
parents: 20581
diff changeset
82 if (nargin == 0) # Check number and types of all input arguments
20568
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
83 help (vsolver);
20585
45151de7423f maint: Clean up implementations of ode45.m, odeget.m, odeset.m.
Rik <rik@octave.org>
parents: 20581
diff changeset
84 error ("OdePkg:InvalidArgument",
20568
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
85 "number of input arguments must be greater than zero");
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
86 endif
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
87
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
88 if (nargin < 3)
20585
45151de7423f maint: Clean up implementations of ode45.m, odeget.m, odeset.m.
Rik <rik@octave.org>
parents: 20581
diff changeset
89 print_usage ();
20568
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
90 endif
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
91
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
92 if (nargin >= 4)
20581
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
93 if (! isstruct (varargin{1}))
20568
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
94 ## varargin{1:len} are parameters for vfun
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
95 vodeoptions = odeset;
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
96 vodeoptions.vfunarguments = varargin;
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
97 elseif (length (varargin) > 1)
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
98 ## varargin{1} is an OdePkg options structure vopt
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
99 vodeoptions = odepkg_structure_check (varargin{1}, "ode45");
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
100 vodeoptions.vfunarguments = {varargin{2:length(varargin)}};
20581
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
101 else # if (isstruct (varargin{1}))
20568
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
102 vodeoptions = odepkg_structure_check (varargin{1}, "ode45");
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
103 vodeoptions.vfunarguments = {};
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
104 endif
20581
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
105 else # nargin == 3
20568
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
106 vodeoptions = odeset;
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
107 vodeoptions.vfunarguments = {};
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
108 endif
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
109
20585
45151de7423f maint: Clean up implementations of ode45.m, odeget.m, odeset.m.
Rik <rik@octave.org>
parents: 20581
diff changeset
110 if (! isvector (vtrange) || ! isnumeric (vtrange))
45151de7423f maint: Clean up implementations of ode45.m, odeget.m, odeset.m.
Rik <rik@octave.org>
parents: 20581
diff changeset
111 error ("OdePkg:InvalidArgument",
20568
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
112 "second input argument must be a valid vector");
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
113 endif
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
114
20585
45151de7423f maint: Clean up implementations of ode45.m, odeget.m, odeset.m.
Rik <rik@octave.org>
parents: 20581
diff changeset
115 if (length (vtrange) < 2
45151de7423f maint: Clean up implementations of ode45.m, odeget.m, odeset.m.
Rik <rik@octave.org>
parents: 20581
diff changeset
116 && (isempty (vodeoptions.TimeStepSize)
45151de7423f maint: Clean up implementations of ode45.m, odeget.m, odeset.m.
Rik <rik@octave.org>
parents: 20581
diff changeset
117 || isempty (vodeoptions.TimeStepNumber)))
45151de7423f maint: Clean up implementations of ode45.m, odeget.m, odeset.m.
Rik <rik@octave.org>
parents: 20581
diff changeset
118 error ("OdePkg:InvalidArgument",
20568
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
119 "second input argument must be a valid vector");
20585
45151de7423f maint: Clean up implementations of ode45.m, odeget.m, odeset.m.
Rik <rik@octave.org>
parents: 20581
diff changeset
120 elseif (vtrange(2) == vtrange(1))
45151de7423f maint: Clean up implementations of ode45.m, odeget.m, odeset.m.
Rik <rik@octave.org>
parents: 20581
diff changeset
121 error ("OdePkg:InvalidArgument",
20568
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
122 "second input argument must be a valid vector");
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
123 else
20585
45151de7423f maint: Clean up implementations of ode45.m, odeget.m, odeset.m.
Rik <rik@octave.org>
parents: 20581
diff changeset
124 vodeoptions.vdirection = sign (vtrange(2) - vtrange(1));
20568
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
125 endif
20585
45151de7423f maint: Clean up implementations of ode45.m, odeget.m, odeset.m.
Rik <rik@octave.org>
parents: 20581
diff changeset
126 vtrange = vtrange(:);
20568
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
127
20581
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
128 if (! isvector (vinit) || ! isnumeric (vinit))
20585
45151de7423f maint: Clean up implementations of ode45.m, odeget.m, odeset.m.
Rik <rik@octave.org>
parents: 20581
diff changeset
129 error ("OdePkg:InvalidArgument",
20568
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
130 "third input argument must be a valid numerical value");
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
131 endif
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
132 vinit = vinit(:);
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
133
20585
45151de7423f maint: Clean up implementations of ode45.m, odeget.m, odeset.m.
Rik <rik@octave.org>
parents: 20581
diff changeset
134 if (! (isa (vfun, "function_handle")))
45151de7423f maint: Clean up implementations of ode45.m, odeget.m, odeset.m.
Rik <rik@octave.org>
parents: 20581
diff changeset
135 error ("OdePkg:InvalidArgument",
20568
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
136 "first input argument must be a valid function handle");
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
137 endif
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
138
20581
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
139 ## Start preprocessing, have a look which options are set in vodeoptions,
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
140 ## check if an invalid or unused option is set
20585
45151de7423f maint: Clean up implementations of ode45.m, odeget.m, odeset.m.
Rik <rik@octave.org>
parents: 20581
diff changeset
141 if (isempty (vodeoptions.TimeStepNumber)
20568
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
142 && isempty (vodeoptions.TimeStepSize))
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
143 integrate_func = "adaptive";
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
144 vodeoptions.vstepsizefixed = false;
20585
45151de7423f maint: Clean up implementations of ode45.m, odeget.m, odeset.m.
Rik <rik@octave.org>
parents: 20581
diff changeset
145 elseif (! isempty (vodeoptions.TimeStepNumber)
20581
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
146 && ! isempty (vodeoptions.TimeStepSize))
20568
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
147 integrate_func = "n_steps";
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
148 vodeoptions.vstepsizefixed = true;
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
149 if (sign (vodeoptions.TimeStepSize) != vodeoptions.vdirection)
20585
45151de7423f maint: Clean up implementations of ode45.m, odeget.m, odeset.m.
Rik <rik@octave.org>
parents: 20581
diff changeset
150 warning ("OdePkg:InvalidArgument",
45151de7423f maint: Clean up implementations of ode45.m, odeget.m, odeset.m.
Rik <rik@octave.org>
parents: 20581
diff changeset
151 "option 'TimeStepSize' has a wrong sign",
20568
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
152 "it will be corrected automatically");
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
153 vodeoptions.TimeStepSize = (-1)*vodeoptions.TimeStepSize;
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
154 endif
20585
45151de7423f maint: Clean up implementations of ode45.m, odeget.m, odeset.m.
Rik <rik@octave.org>
parents: 20581
diff changeset
155 elseif (isempty (vodeoptions.TimeStepNumber)
20581
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
156 && ! isempty (vodeoptions.TimeStepSize))
20568
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
157 integrate_func = "const";
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
158 vodeoptions.vstepsizefixed = true;
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
159 if (sign (vodeoptions.TimeStepSize) != vodeoptions.vdirection)
20585
45151de7423f maint: Clean up implementations of ode45.m, odeget.m, odeset.m.
Rik <rik@octave.org>
parents: 20581
diff changeset
160 warning ("OdePkg:InvalidArgument",
45151de7423f maint: Clean up implementations of ode45.m, odeget.m, odeset.m.
Rik <rik@octave.org>
parents: 20581
diff changeset
161 "option 'TimeStepSize' has a wrong sign",
20568
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
162 "it will be corrected automatically");
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
163 vodeoptions.TimeStepSize = (-1)*vodeoptions.TimeStepSize;
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
164 endif
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
165 else
20585
45151de7423f maint: Clean up implementations of ode45.m, odeget.m, odeset.m.
Rik <rik@octave.org>
parents: 20581
diff changeset
166 warning ("OdePkg:InvalidArgument",
20568
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
167 "assuming an adaptive integrate function");
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
168 integrate_func = "adaptive";
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
169 endif
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
170
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
171 ## Get the default options that can be set with "odeset" temporarily
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
172 vodetemp = odeset;
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
173
20581
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
174 ## Implementation of the option RelTol has been finished.
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
175 ## This option can be set by the user to another value than default value.
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
176 if (isempty (vodeoptions.RelTol) && ! vodeoptions.vstepsizefixed)
20568
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
177 vodeoptions.RelTol = 1e-3;
20585
45151de7423f maint: Clean up implementations of ode45.m, odeget.m, odeset.m.
Rik <rik@octave.org>
parents: 20581
diff changeset
178 warning ("OdePkg:InvalidArgument",
45151de7423f maint: Clean up implementations of ode45.m, odeget.m, odeset.m.
Rik <rik@octave.org>
parents: 20581
diff changeset
179 "Option 'RelTol' not set, new value %f is used",
20568
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
180 vodeoptions.RelTol);
20581
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
181 elseif (! isempty (vodeoptions.RelTol) && vodeoptions.vstepsizefixed)
20585
45151de7423f maint: Clean up implementations of ode45.m, odeget.m, odeset.m.
Rik <rik@octave.org>
parents: 20581
diff changeset
182 warning ("OdePkg:InvalidArgument",
20581
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
183 "Option 'RelTol' will be ignored if fixed time stamps are given");
20568
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
184 endif
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
185
20581
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
186 ## Implementation of the option AbsTol has been finished.
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
187 ## This option can be set by the user to another value than default value.
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
188 if (isempty (vodeoptions.AbsTol) && ! vodeoptions.vstepsizefixed)
20568
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
189 vodeoptions.AbsTol = 1e-6;
20585
45151de7423f maint: Clean up implementations of ode45.m, odeget.m, odeset.m.
Rik <rik@octave.org>
parents: 20581
diff changeset
190 warning ("OdePkg:InvalidArgument",
45151de7423f maint: Clean up implementations of ode45.m, odeget.m, odeset.m.
Rik <rik@octave.org>
parents: 20581
diff changeset
191 "Option 'AbsTol' not set, new value %f is used",
20568
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
192 vodeoptions.AbsTol);
20581
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
193 elseif (! isempty (vodeoptions.AbsTol) && vodeoptions.vstepsizefixed)
20585
45151de7423f maint: Clean up implementations of ode45.m, odeget.m, odeset.m.
Rik <rik@octave.org>
parents: 20581
diff changeset
194 warning ("OdePkg:InvalidArgument",
20581
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
195 "Option 'AbsTol' will be ignored if fixed time stamps are given");
20568
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
196 else
20581
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
197 vodeoptions.AbsTol = vodeoptions.AbsTol(:); # Create column vector
20568
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
198 endif
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
199
20581
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
200 ## Implementation of the option NormControl has been finished.
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
201 ## This option can be set by the user to another value than default value.
20568
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
202 if (strcmp (vodeoptions.NormControl, "on"))
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
203 vodeoptions.vnormcontrol = true;
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
204 else
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
205 vodeoptions.vnormcontrol = false;
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
206 endif
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
207
20581
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
208 ## Implementation of the option NonNegative has been finished.
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
209 ## This option can be set by the user to another value than default value.
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
210 if (! isempty (vodeoptions.NonNegative))
20568
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
211 if (isempty (vodeoptions.Mass))
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
212 vodeoptions.vhavenonnegative = true;
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
213 else
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
214 vodeoptions.vhavenonnegative = false;
20585
45151de7423f maint: Clean up implementations of ode45.m, odeget.m, odeset.m.
Rik <rik@octave.org>
parents: 20581
diff changeset
215 warning ("OdePkg:InvalidArgument",
20568
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
216 "Option 'NonNegative' will be ignored if mass matrix is set");
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
217 endif
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
218 else
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
219 vodeoptions.vhavenonnegative = false;
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
220 endif
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
221
20581
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
222 ## Implementation of the option OutputFcn has been finished.
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
223 ## This option can be set by the user to another value than default value.
20568
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
224 if (isempty (vodeoptions.OutputFcn) && nargout == 0)
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
225 vodeoptions.OutputFcn = @odeplot;
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
226 vodeoptions.vhaveoutputfunction = true;
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
227 elseif (isempty (vodeoptions.OutputFcn))
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
228 vodeoptions.vhaveoutputfunction = false;
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
229 else
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
230 vodeoptions.vhaveoutputfunction = true;
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
231 endif
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
232
20581
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
233 ## Implementation of the option OutputSel has been finished.
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
234 ## This option can be set by the user to another value than default value.
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
235 if (! isempty (vodeoptions.OutputSel))
20568
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
236 vodeoptions.vhaveoutputselection = true;
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
237 else
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
238 vodeoptions.vhaveoutputselection = false;
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
239 endif
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
240
20635
a22d8a2eb0e5 fix adaptive strategy in ode solvers.
Carlo de Falco <carlo.defalco@polimi.it>
parents: 20585
diff changeset
241 ## "OutputSave" option will be ignored.
a22d8a2eb0e5 fix adaptive strategy in ode solvers.
Carlo de Falco <carlo.defalco@polimi.it>
parents: 20585
diff changeset
242 if (! isempty (vodeoptions.OutputSave))
a22d8a2eb0e5 fix adaptive strategy in ode solvers.
Carlo de Falco <carlo.defalco@polimi.it>
parents: 20585
diff changeset
243 warning ("OdePkg:InvalidArgument",
a22d8a2eb0e5 fix adaptive strategy in ode solvers.
Carlo de Falco <carlo.defalco@polimi.it>
parents: 20585
diff changeset
244 "Option 'OutputSave' will be ignored.");
20568
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
245 endif
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
246
20581
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
247 ## Implementation of the option Refine has been finished.
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
248 ## This option can be set by the user to another value than default value.
20568
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
249 if (vodeoptions.Refine > 0)
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
250 vodeoptions.vhaverefine = true;
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
251 else
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
252 vodeoptions.vhaverefine = false;
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
253 endif
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
254
20581
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
255 ## Implementation of the option Stats has been finished.
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
256 ## This option can be set by the user to another value than default value.
20568
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
257
20581
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
258 ## Implementation of the option InitialStep has been finished.
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
259 ## This option can be set by the user to another value than default value.
20568
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
260 if (isempty (vodeoptions.InitialStep) && strcmp (integrate_func, "adaptive"))
20581
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
261 vodeoptions.InitialStep = ...
20585
45151de7423f maint: Clean up implementations of ode45.m, odeget.m, odeset.m.
Rik <rik@octave.org>
parents: 20581
diff changeset
262 vodeoptions.vdirection * starting_stepsize (vorder, vfun, vtrange(1),
45151de7423f maint: Clean up implementations of ode45.m, odeget.m, odeset.m.
Rik <rik@octave.org>
parents: 20581
diff changeset
263 vinit,
20581
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
264 vodeoptions.AbsTol,
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
265 vodeoptions.RelTol,
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
266 vodeoptions.vnormcontrol);
20585
45151de7423f maint: Clean up implementations of ode45.m, odeget.m, odeset.m.
Rik <rik@octave.org>
parents: 20581
diff changeset
267 warning ("OdePkg:InvalidArgument",
45151de7423f maint: Clean up implementations of ode45.m, odeget.m, odeset.m.
Rik <rik@octave.org>
parents: 20581
diff changeset
268 "option 'InitialStep' not set, estimated value %f is used",
20568
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
269 vodeoptions.InitialStep);
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
270 elseif(isempty (vodeoptions.InitialStep))
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
271 vodeoptions.InitialStep = odeget (vodeoptions, "TimeStepSize");
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
272 endif
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
273
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
274 ## Implementation of the option MaxStep has been finished. This option
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
275 ## can be set by the user to another value than default value.
20581
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
276 if (isempty (vodeoptions.MaxStep) && ! vodeoptions.vstepsizefixed)
20585
45151de7423f maint: Clean up implementations of ode45.m, odeget.m, odeset.m.
Rik <rik@octave.org>
parents: 20581
diff changeset
277 vodeoptions.MaxStep = abs (vtrange(end) - vtrange(1)) / 10;
45151de7423f maint: Clean up implementations of ode45.m, odeget.m, odeset.m.
Rik <rik@octave.org>
parents: 20581
diff changeset
278 warning ("OdePkg:InvalidArgument",
45151de7423f maint: Clean up implementations of ode45.m, odeget.m, odeset.m.
Rik <rik@octave.org>
parents: 20581
diff changeset
279 "Option 'MaxStep' not set, new value %f is used",
20568
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
280 vodeoptions.MaxStep);
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
281 endif
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
282
20581
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
283 ## Implementation of the option Events has been finished.
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
284 ## This option can be set by the user to another value than default value.
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
285 if (! isempty (vodeoptions.Events))
20568
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
286 vodeoptions.vhaveeventfunction = true;
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
287 else
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
288 vodeoptions.vhaveeventfunction = false;
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
289 endif
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
290
20581
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
291 ## The options "Jacobian", "JPattern" and "Vectorized" will be ignored
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
292 ## by this solver because this solver uses an explicit Runge-Kutta method
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
293 ## and therefore no Jacobian calculation is necessary.
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
294 if (! isequal (vodeoptions.Jacobian, vodetemp.Jacobian))
20585
45151de7423f maint: Clean up implementations of ode45.m, odeget.m, odeset.m.
Rik <rik@octave.org>
parents: 20581
diff changeset
295 warning ("OdePkg:InvalidArgument",
20581
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
296 "option 'Jacobian' will be ignored by this solver");
20568
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
297 endif
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
298
20581
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
299 if (! isequal (vodeoptions.JPattern, vodetemp.JPattern))
20585
45151de7423f maint: Clean up implementations of ode45.m, odeget.m, odeset.m.
Rik <rik@octave.org>
parents: 20581
diff changeset
300 warning ("OdePkg:InvalidArgument",
20581
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
301 "option 'JPattern' will be ignored by this solver");
20568
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
302 endif
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
303
20581
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
304 if (! isequal (vodeoptions.Vectorized, vodetemp.Vectorized))
20585
45151de7423f maint: Clean up implementations of ode45.m, odeget.m, odeset.m.
Rik <rik@octave.org>
parents: 20581
diff changeset
305 warning ("OdePkg:InvalidArgument",
20581
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
306 "option 'Vectorized' will be ignored by this solver");
20568
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
307 endif
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
308
20581
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
309 if (! isequal (vodeoptions.NewtonTol, vodetemp.NewtonTol))
20585
45151de7423f maint: Clean up implementations of ode45.m, odeget.m, odeset.m.
Rik <rik@octave.org>
parents: 20581
diff changeset
310 warning ("OdePkg:InvalidArgument",
20581
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
311 "option 'NewtonTol' will be ignored by this solver");
20568
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
312 endif
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
313
20581
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
314 if (! isequal (vodeoptions.MaxNewtonIterations,vodetemp.MaxNewtonIterations))
20585
45151de7423f maint: Clean up implementations of ode45.m, odeget.m, odeset.m.
Rik <rik@octave.org>
parents: 20581
diff changeset
315 warning ("OdePkg:InvalidArgument",
20581
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
316 "option 'MaxNewtonIterations' will be ignored by this solver");
20568
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
317 endif
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
318
20581
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
319 ## Implementation of the option Mass has been finished.
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
320 ## This option can be set by the user to another value than default value.
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
321 if (! isempty (vodeoptions.Mass) && isnumeric (vodeoptions.Mass))
20568
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
322 vhavemasshandle = false;
20581
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
323 vmass = vodeoptions.Mass; # constant mass
20568
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
324 elseif (isa (vodeoptions.Mass, "function_handle"))
20581
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
325 vhavemasshandle = true; # mass defined by a function handle
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
326 else # no mass matrix - creating a diag-matrix of ones for mass
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
327 vhavemasshandle = false; # vmass = diag (ones (length (vinit), 1), 0);
20568
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
328 endif
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
329
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
330 ## Implementation of the option MStateDependence has been finished.
20581
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
331 ## This option can be set by the user to another value than default value.
20568
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
332 if (strcmp (vodeoptions.MStateDependence, "none"))
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
333 vmassdependence = false;
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
334 else
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
335 vmassdependence = true;
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
336 endif
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
337
20581
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
338 ## Other options that are not used by this solver.
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
339 ## Print a warning message to tell the user that the option is ignored.
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
340 if (! isequal (vodeoptions.MvPattern, vodetemp.MvPattern))
20585
45151de7423f maint: Clean up implementations of ode45.m, odeget.m, odeset.m.
Rik <rik@octave.org>
parents: 20581
diff changeset
341 warning ("OdePkg:InvalidArgument",
20581
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
342 "option 'MvPattern' will be ignored by this solver");
20568
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
343 endif
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
344
20581
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
345 if (! isequal (vodeoptions.MassSingular, vodetemp.MassSingular))
20585
45151de7423f maint: Clean up implementations of ode45.m, odeget.m, odeset.m.
Rik <rik@octave.org>
parents: 20581
diff changeset
346 warning ("OdePkg:InvalidArgument",
20581
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
347 "option 'MassSingular' will be ignored by this solver");
20568
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
348 endif
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
349
20581
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
350 if (! isequal (vodeoptions.InitialSlope, vodetemp.InitialSlope))
20585
45151de7423f maint: Clean up implementations of ode45.m, odeget.m, odeset.m.
Rik <rik@octave.org>
parents: 20581
diff changeset
351 warning ("OdePkg:InvalidArgument",
20581
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
352 "option 'InitialSlope' will be ignored by this solver");
20568
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
353 endif
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
354
20581
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
355 if (! isequal (vodeoptions.MaxOrder, vodetemp.MaxOrder))
20585
45151de7423f maint: Clean up implementations of ode45.m, odeget.m, odeset.m.
Rik <rik@octave.org>
parents: 20581
diff changeset
356 warning ("OdePkg:InvalidArgument",
20581
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
357 "option 'MaxOrder' will be ignored by this solver");
20568
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
358 endif
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
359
20581
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
360 if (! isequal (vodeoptions.BDF, vodetemp.BDF))
20585
45151de7423f maint: Clean up implementations of ode45.m, odeget.m, odeset.m.
Rik <rik@octave.org>
parents: 20581
diff changeset
361 warning ("OdePkg:InvalidArgument",
20581
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
362 "option 'BDF' will be ignored by this solver");
20568
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
363 endif
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
364
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
365 ## Starting the initialisation of the core solver ode45
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
366 SubOpts = vodeoptions;
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
367
20581
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
368 if (vhavemasshandle) # Handle only the dynamic mass matrix,
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
369 if (vmassdependence) # constant mass matrices have already
20568
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
370 vmass = @(t,x) vodeoptions.Mass (t, x, vodeoptions.vfunarguments{:});
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
371 vfun = @(t,x) vmass (t, x, vodeoptions.vfunarguments{:}) ...
20575
3339c9bdfe6a Activate FSAL property in dorpri timestepper
Carlo de Falco <carlo.defalco@polimi.it>
parents: 20568
diff changeset
372 \ vfun (t, x, vodeoptions.vfunarguments{:});
20581
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
373 else # if (vmassdependence == false)
20568
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
374 vmass = @(t) vodeoptions.Mass (t, vodeoptions.vfunarguments{:});
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
375 vfun = @(t,x) vmass (t, vodeoptions.vfunarguments{:}) ...
20575
3339c9bdfe6a Activate FSAL property in dorpri timestepper
Carlo de Falco <carlo.defalco@polimi.it>
parents: 20568
diff changeset
376 \ vfun (t, x, vodeoptions.vfunarguments{:});
20568
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
377 endif
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
378 endif
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
379
20585
45151de7423f maint: Clean up implementations of ode45.m, odeget.m, odeset.m.
Rik <rik@octave.org>
parents: 20581
diff changeset
380 switch (integrate_func)
20568
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
381 case "adaptive"
20585
45151de7423f maint: Clean up implementations of ode45.m, odeget.m, odeset.m.
Rik <rik@octave.org>
parents: 20581
diff changeset
382 solution = integrate_adaptive (@runge_kutta_45_dorpri,
45151de7423f maint: Clean up implementations of ode45.m, odeget.m, odeset.m.
Rik <rik@octave.org>
parents: 20581
diff changeset
383 vorder, vfun, vtrange, vinit, SubOpts);
20568
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
384 case "n_steps"
20585
45151de7423f maint: Clean up implementations of ode45.m, odeget.m, odeset.m.
Rik <rik@octave.org>
parents: 20581
diff changeset
385 solution = integrate_n_steps (@runge_kutta_45_dorpri,
45151de7423f maint: Clean up implementations of ode45.m, odeget.m, odeset.m.
Rik <rik@octave.org>
parents: 20581
diff changeset
386 vfun, vtrange(1), vinit,
45151de7423f maint: Clean up implementations of ode45.m, odeget.m, odeset.m.
Rik <rik@octave.org>
parents: 20581
diff changeset
387 vodeoptions.TimeStepSize,
20568
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
388 vodeoptions.TimeStepNumber, SubOpts);
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
389 case "const"
20585
45151de7423f maint: Clean up implementations of ode45.m, odeget.m, odeset.m.
Rik <rik@octave.org>
parents: 20581
diff changeset
390 solution = integrate_const (@runge_kutta_45_dorpri,
45151de7423f maint: Clean up implementations of ode45.m, odeget.m, odeset.m.
Rik <rik@octave.org>
parents: 20581
diff changeset
391 vfun, vtrange, vinit,
20568
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
392 vodeoptions.TimeStepSize, SubOpts);
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
393 endswitch
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
394
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
395 ## Postprocessing, do whatever when terminating integration algorithm
20581
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
396 if (vodeoptions.vhaveoutputfunction) # Cleanup plotter
20585
45151de7423f maint: Clean up implementations of ode45.m, odeget.m, odeset.m.
Rik <rik@octave.org>
parents: 20581
diff changeset
397 feval (vodeoptions.OutputFcn, solution.t(end),
20575
3339c9bdfe6a Activate FSAL property in dorpri timestepper
Carlo de Falco <carlo.defalco@polimi.it>
parents: 20568
diff changeset
398 solution.x(end,:)', "done", vodeoptions.vfunarguments{:});
20568
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
399 endif
20581
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
400 if (vodeoptions.vhaveeventfunction) # Cleanup event function handling
20585
45151de7423f maint: Clean up implementations of ode45.m, odeget.m, odeset.m.
Rik <rik@octave.org>
parents: 20581
diff changeset
401 odepkg_event_handle (vodeoptions.Events, solution.t(end),
20581
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
402 solution.x(end,:)', "done",
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
403 vodeoptions.vfunarguments{:});
20568
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
404 endif
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
405
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
406 ## Print additional information if option Stats is set
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
407 if (strcmp (vodeoptions.Stats, "on"))
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
408 vhavestats = true;
20635
a22d8a2eb0e5 fix adaptive strategy in ode solvers.
Carlo de Falco <carlo.defalco@polimi.it>
parents: 20585
diff changeset
409 vnsteps = solution.vcntloop-2; # vcntloop from 2..end
20585
45151de7423f maint: Clean up implementations of ode45.m, odeget.m, odeset.m.
Rik <rik@octave.org>
parents: 20581
diff changeset
410 vnfailed = (solution.vcntcycles-1)-(vnsteps)+1; # vcntcycl from 1..end
20646
01586012300e compute number of fevals correctly in ode45 (bug #46189)
Carlo de Falco <carlo.defalco@polimi.it>
parents: 20635
diff changeset
411 vnfevals = 7 * (solution.vcntcycles-1) + 1; # number of ode evaluations
20635
a22d8a2eb0e5 fix adaptive strategy in ode solvers.
Carlo de Falco <carlo.defalco@polimi.it>
parents: 20585
diff changeset
412 vndecomps = 0; # number of LU decompositions
a22d8a2eb0e5 fix adaptive strategy in ode solvers.
Carlo de Falco <carlo.defalco@polimi.it>
parents: 20585
diff changeset
413 vnpds = 0; # number of partial derivatives
a22d8a2eb0e5 fix adaptive strategy in ode solvers.
Carlo de Falco <carlo.defalco@polimi.it>
parents: 20585
diff changeset
414 vnlinsols = 0; # no. of linear systems solutions
20568
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
415 ## Print cost statistics if no output argument is given
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
416 if (nargout == 0)
20585
45151de7423f maint: Clean up implementations of ode45.m, odeget.m, odeset.m.
Rik <rik@octave.org>
parents: 20581
diff changeset
417 printf ("Number of successful steps: %d\n", vnsteps);
45151de7423f maint: Clean up implementations of ode45.m, odeget.m, odeset.m.
Rik <rik@octave.org>
parents: 20581
diff changeset
418 printf ("Number of failed attempts: %d\n", vnfailed);
45151de7423f maint: Clean up implementations of ode45.m, odeget.m, odeset.m.
Rik <rik@octave.org>
parents: 20581
diff changeset
419 printf ("Number of function calls: %d\n", vnfevals);
20568
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
420 endif
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
421 else
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
422 vhavestats = false;
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
423 endif
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
424
20585
45151de7423f maint: Clean up implementations of ode45.m, odeget.m, odeset.m.
Rik <rik@octave.org>
parents: 20581
diff changeset
425 if (nargout == 2)
45151de7423f maint: Clean up implementations of ode45.m, odeget.m, odeset.m.
Rik <rik@octave.org>
parents: 20581
diff changeset
426 varargout{1} = solution.t; # Time stamps are first output argument
45151de7423f maint: Clean up implementations of ode45.m, odeget.m, odeset.m.
Rik <rik@octave.org>
parents: 20581
diff changeset
427 varargout{2} = solution.x; # Results are second output argument
45151de7423f maint: Clean up implementations of ode45.m, odeget.m, odeset.m.
Rik <rik@octave.org>
parents: 20581
diff changeset
428 elseif (nargout == 1)
20581
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
429 varargout{1}.x = solution.t; # Time stamps are saved in field x
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
430 varargout{1}.y = solution.x; # Results are saved in field y
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
431 varargout{1}.solver = vsolver; # Solver name is saved in field solver
20568
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
432 if (vodeoptions.vhaveeventfunction)
20581
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
433 varargout{1}.ie = solution.vevent{2}; # Index info which event occurred
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
434 varargout{1}.xe = solution.vevent{3}; # Time info when an event occurred
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
435 varargout{1}.ye = solution.vevent{4}; # Results when an event occurred
20568
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
436 endif
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
437 if (vhavestats)
20585
45151de7423f maint: Clean up implementations of ode45.m, odeget.m, odeset.m.
Rik <rik@octave.org>
parents: 20581
diff changeset
438 varargout{1}.stats = struct ();
20568
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
439 varargout{1}.stats.nsteps = vnsteps;
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
440 varargout{1}.stats.nfailed = vnfailed;
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
441 varargout{1}.stats.nfevals = vnfevals;
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
442 varargout{1}.stats.npds = vnpds;
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
443 varargout{1}.stats.ndecomps = vndecomps;
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
444 varargout{1}.stats.nlinsols = vnlinsols;
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
445 endif
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
446 elseif (nargout == 5)
20585
45151de7423f maint: Clean up implementations of ode45.m, odeget.m, odeset.m.
Rik <rik@octave.org>
parents: 20581
diff changeset
447 varargout = cell (1,5);
45151de7423f maint: Clean up implementations of ode45.m, odeget.m, odeset.m.
Rik <rik@octave.org>
parents: 20581
diff changeset
448 varargout{1} = solution.t;
45151de7423f maint: Clean up implementations of ode45.m, odeget.m, odeset.m.
Rik <rik@octave.org>
parents: 20581
diff changeset
449 varargout{2} = solution.x;
20568
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
450 if (vodeoptions.vhaveeventfunction)
20581
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
451 varargout{3} = solution.vevent{3}; # Time info when an event occurred
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
452 varargout{4} = solution.vevent{4}; # Results when an event occurred
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
453 varargout{5} = solution.vevent{2}; # Index info which event occurred
20568
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
454 endif
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
455 endif
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
456
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
457 endfunction
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
458
20581
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
459
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
460 ## We are using the "Van der Pol" implementation for all tests that are done
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
461 ## for this function.
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
462 ## For further tests we also define a reference solution (computed at high
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
463 ## accuracy)
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
464 %!function [ydot] = fpol (vt, vy) # The Van der Pol
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
465 %! ydot = [vy(2); (1 - vy(1)^2) * vy(2) - vy(1)];
20568
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
466 %!endfunction
20581
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
467 %!function [vref] = fref () # The computed reference solution
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
468 %! vref = [0.32331666704577, -1.83297456798624];
20568
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
469 %!endfunction
20581
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
470 %!function [vjac] = fjac (vt, vy, varargin) # its Jacobian
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
471 %! vjac = [0, 1; -1 - 2 * vy(1) * vy(2), 1 - vy(1)^2];
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
472 %!endfunction
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
473 %!function [vjac] = fjcc (vt, vy, varargin) # sparse type
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
474 %! vjac = sparse ([0, 1; -1 - 2 * vy(1) * vy(2), 1 - vy(1)^2])
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
475 %!endfunction
20568
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
476 %!function [vval, vtrm, vdir] = feve (vt, vy, varargin)
20581
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
477 %! vval = fpol (vt, vy, varargin); # We use the derivatives
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
478 %! vtrm = zeros (2,1); # that's why component 2
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
479 %! vdir = ones (2,1); # seems to not be exact
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
480 %!endfunction
20568
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
481 %!function [vval, vtrm, vdir] = fevn (vt, vy, varargin)
20581
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
482 %! vval = fpol (vt, vy, varargin); # We use the derivatives
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
483 %! vtrm = ones (2,1); # that's why component 2
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
484 %! vdir = ones (2,1); # seems to not be exact
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
485 %!endfunction
20568
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
486 %!function [vmas] = fmas (vt, vy, varargin)
20581
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
487 %! vmas = [1, 0; 0, 1]; # Dummy mass matrix for tests
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
488 %!endfunction
20568
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
489 %!function [vmas] = fmsa (vt, vy, varargin)
20581
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
490 %! vmas = sparse ([1, 0; 0, 1]); # A sparse dummy matrix
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
491 %!endfunction
20568
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
492 %!function [vout] = fout (vt, vy, vflag, varargin)
20581
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
493 %! if (regexp (char (vflag), 'init') == 1)
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
494 %! if (any (size (vt) != [2, 1])) error ('"fout" step "init"'); endif
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
495 %! elseif (isempty (vflag))
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
496 %! if (any (size (vt) != [1, 1])) error ('"fout" step "calc"'); endif
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
497 %! vout = false;
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
498 %! elseif (regexp (char (vflag), 'done') == 1)
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
499 %! if (any (size (vt) != [1, 1])) error ('"fout" step "done"'); endif
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
500 %! else
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
501 %! error ('"fout" invalid vflag');
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
502 %! endif
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
503 %!endfunction
20568
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
504 %!
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
505 %! ## Turn off output of warning messages for all tests, turn them on
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
506 %! ## again if the last test is called
20581
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
507 %!error # ouput argument
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
508 %! warning ("off", "OdePkg:InvalidArgument");
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
509 %! B = ode45 (1, [0 25], [3 15 1]);
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
510 %!error # input argument number one
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
511 %! [vt, vy] = ode45 (1, [0 25], [3 15 1]);
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
512 %!error # input argument number two
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
513 %! [vt, vy] = ode45 (@fpol, 1, [3 15 1]);
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
514 %!test # two output arguments
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
515 %! [vt, vy] = ode45 (@fpol, [0 2], [2 0]);
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
516 %! assert ([vt(end), vy(end,:)], [2, fref], 1e-2);
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
517 %!test # not too many steps
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
518 %! [vt, vy] = ode45 (@fpol, [0 2], [2 0]);
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
519 %! assert (size (vt) < 20);
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
520 %!test # anonymous function instead of real function
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
521 %! fvdb = @(vt,vy) [vy(2); (1 - vy(1)^2) * vy(2) - vy(1)];
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
522 %! [vt, vy] = ode45 (fvdb, [0 2], [2 0]);
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
523 %! assert ([vt(end), vy(end,:)], [2, fref], 1e-2);
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
524 %!test # extra input arguments passed through
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
525 %! [vt, vy] = ode45 (@fpol, [0 2], [2 0], 12, 13, "KL");
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
526 %! assert ([vt(end), vy(end,:)], [2, fref], 1e-2);
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
527 %!test # empty OdePkg structure *but* extra input arguments
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
528 %! vopt = odeset;
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
529 %! [vt, vy] = ode45 (@fpol, [0 2], [2 0], vopt, 12, 13, "KL");
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
530 %! assert ([vt(end), vy(end,:)], [2, fref], 1e-2);
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
531 %!error # strange OdePkg structure
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
532 %! vopt = struct ("foo", 1);
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
533 %! [vt, vy] = ode45 (@fpol, [0 2], [2 0], vopt);
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
534 %!test # Solve vdp in fixed step sizes
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
535 %! vopt = odeset("TimeStepSize", 0.1);
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
536 %! [vt, vy] = ode45 (@fpol, [0,2], [2 0], vopt);
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
537 %! assert (vt(:), [0:0.1:2]', 1e-2);
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
538 %!test # Solve another anonymous function below zero
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
539 %! vref = [0, 14.77810590694212];
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
540 %! [vt, vy] = ode45 (@(t,y) y, [-2 0], 2);
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
541 %! assert ([vt(end), vy(end,:)], vref, 1e-1);
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
542 %!test # InitialStep option
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
543 %! vopt = odeset ("InitialStep", 1e-8);
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
544 %! [vt, vy] = ode45 (@fpol, [0 0.2], [2 0], vopt);
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
545 %! assert ([vt(2)-vt(1)], [1e-8], 1e-9);
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
546 %!test # MaxStep option
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
547 %! vopt = odeset ("MaxStep", 1e-3);
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
548 %! vsol = ode45 (@fpol, [0 0.2], [2 0], vopt);
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
549 %! assert ([vsol.x(5)-vsol.x(4)], [1e-3], 1e-3);
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
550 %!test # Solve with intermidiate step
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
551 %! vsol = ode45 (@fpol, [0 1 2], [2 0]);
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
552 %! assert (any((vsol.x-1) == 0));
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
553 %! assert ([vsol.x(end), vsol.y(end,:)], [2, fref], 1e-3);
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
554 %!test # Solve in backward direction starting at t=0
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
555 %! vref = [-1.205364552835178, 0.951542399860817];
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
556 %! vsol = ode45 (@fpol, [0 -2], [2 0]);
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
557 %! assert ([vsol.x(end), vsol.y(end,:)], [-2, vref], 1e-2);
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
558 %!test # Solve in backward direction starting at t=2
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
559 %! vref = [-1.205364552835178, 0.951542399860817];
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
560 %! vsol = ode45 (@fpol, [2 -2], fref);
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
561 %! assert ([vsol.x(end), vsol.y(end,:)], [-2, vref], 1e-2);
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
562 %!test # Solve in backward direction starting at t=2, with intermidiate step
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
563 %! vref = [-1.205364552835178, 0.951542399860817];
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
564 %! vsol = ode45 (@fpol, [2 0 -2], fref);
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
565 %! idx = find(vsol.x < 0, 1, "first") - 1;
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
566 %! assert ([vsol.x(idx), vsol.y(idx,:)], [0 2 0], 1e-2);
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
567 %! assert ([vsol.x(end), vsol.y(end,:)], [-2, vref], 1e-2);
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
568 %!test # Solve another anonymous function in backward direction
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
569 %! vref = [-1, 0.367879437558975];
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
570 %! vsol = ode45 (@(t,y) y, [0 -1], 1);
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
571 %! assert ([vsol.x(end), vsol.y(end,:)], vref, 1e-3);
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
572 %!test # Solve another anonymous function below zero
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
573 %! vref = [0, 14.77810590694212];
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
574 %! vsol = ode45 (@(t,y) y, [-2 0], 2);
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
575 %! assert ([vsol.x(end), vsol.y(end,:)], vref, 1e-3);
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
576 %!test # Solve in backward direction starting at t=0 with MaxStep option
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
577 %! vref = [-1.205364552835178, 0.951542399860817];
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
578 %! vopt = odeset ("MaxStep", 1e-3);
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
579 %! vsol = ode45 (@fpol, [0 -2], [2 0], vopt);
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
580 %! assert ([abs(vsol.x(8)-vsol.x(7))], [1e-3], 1e-3);
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
581 %! assert ([vsol.x(end), vsol.y(end,:)], [-2, vref], 1e-3);
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
582 %!test # AbsTol option
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
583 %! vopt = odeset ("AbsTol", 1e-5);
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
584 %! vsol = ode45 (@fpol, [0 2], [2 0], vopt);
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
585 %! assert ([vsol.x(end), vsol.y(end,:)], [2, fref], 1e-3);
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
586 %!test # AbsTol and RelTol option
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
587 %! vopt = odeset ("AbsTol", 1e-8, "RelTol", 1e-8);
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
588 %! vsol = ode45 (@fpol, [0 2], [2 0], vopt);
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
589 %! assert ([vsol.x(end), vsol.y(end,:)], [2, fref], 1e-3);
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
590 %!test # RelTol and NormControl option -- higher accuracy
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
591 %! vopt = odeset ("RelTol", 1e-8, "NormControl", "on");
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
592 %! vsol = ode45 (@fpol, [0 2], [2 0], vopt);
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
593 %! assert ([vsol.x(end), vsol.y(end,:)], [2, fref], 1e-5);
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
594 %!test # Keeps initial values while integrating
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
595 %! vopt = odeset ("NonNegative", 2);
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
596 %! vsol = ode45 (@fpol, [0 2], [2 0], vopt);
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
597 %! assert ([vsol.x(end), vsol.y(end,:)], [2, 2, 0], 0.5);
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
598 %!test # Details of OutputSel and Refine can't be tested
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
599 %! vopt = odeset ("OutputFcn", @fout, "OutputSel", 1, "Refine", 5);
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
600 %! vsol = ode45 (@fpol, [0 2], [2 0], vopt);
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
601 %!test # Stats must add further elements in vsol
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
602 %! vopt = odeset ("Stats", "on");
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
603 %! vsol = ode45 (@fpol, [0 2], [2 0], vopt);
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
604 %! assert (isfield (vsol, "stats"));
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
605 %! assert (isfield (vsol.stats, "nsteps"));
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
606 %!test # Events option add further elements in vsol
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
607 %! vopt = odeset ("Events", @feve);
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
608 %! vsol = ode45 (@fpol, [0 10], [2 0], vopt);
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
609 %! assert (isfield (vsol, "ie"));
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
610 %! assert (vsol.ie(1), 2);
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
611 %! assert (isfield (vsol, "xe"));
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
612 %! assert (isfield (vsol, "ye"));
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
613 %!test # Events option, now stop integration
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
614 %! vopt = odeset ("Events", @fevn, "NormControl", "on");
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
615 %! vsol = ode45 (@fpol, [0 10], [2 0], vopt);
20585
45151de7423f maint: Clean up implementations of ode45.m, odeget.m, odeset.m.
Rik <rik@octave.org>
parents: 20581
diff changeset
616 %! assert ([vsol.ie, vsol.xe, vsol.ye],
45151de7423f maint: Clean up implementations of ode45.m, odeget.m, odeset.m.
Rik <rik@octave.org>
parents: 20581
diff changeset
617 %! [2.0, 2.496110, -0.830550, -2.677589], 6e-1);
20581
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
618 %!test # Events option, five output arguments
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
619 %! vopt = odeset ("Events", @fevn, "NormControl", "on");
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
620 %! [vt, vy, vxe, vye, vie] = ode45 (@fpol, [0 10], [2 0], vopt);
20585
45151de7423f maint: Clean up implementations of ode45.m, odeget.m, odeset.m.
Rik <rik@octave.org>
parents: 20581
diff changeset
621 %! assert ([vie, vxe, vye],
45151de7423f maint: Clean up implementations of ode45.m, odeget.m, odeset.m.
Rik <rik@octave.org>
parents: 20581
diff changeset
622 %! [2.0, 2.496110, -0.830550, -2.677589], 6e-1);
20581
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
623 %!test # Jacobian option
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
624 %! vopt = odeset ("Jacobian", @fjac);
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
625 %! vsol = ode45 (@fpol, [0 2], [2 0], vopt);
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
626 %! assert ([vsol.x(end), vsol.y(end,:)], [2, fref], 1e-3);
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
627 %!test # Jacobian option and sparse return value
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
628 %! vopt = odeset ("Jacobian", @fjcc);
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
629 %! vsol = ode45 (@fpol, [0 2], [2 0], vopt);
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
630 %! assert ([vsol.x(end), vsol.y(end,:)], [2, fref], 1e-3);
20568
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
631 %!
20581
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
632 %!## test for JPattern option is missing
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
633 %!## test for Vectorized option is missing
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
634 %!## test for NewtonTol option is missing
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
635 %!## test for MaxNewtonIterations option is missing
20568
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
636 %!
20581
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
637 %!test # Mass option as function
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
638 %! vopt = odeset ("Mass", @fmas);
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
639 %! vsol = ode45 (@fpol, [0 2], [2 0], vopt);
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
640 %! assert ([vsol.x(end), vsol.y(end,:)], [2, fref], 1e-3);
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
641 %!test # Mass option as matrix
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
642 %! vopt = odeset ("Mass", eye (2,2));
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
643 %! vsol = ode45 (@fpol, [0 2], [2 0], vopt);
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
644 %! assert ([vsol.x(end), vsol.y(end,:)], [2, fref], 1e-3);
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
645 %!test # Mass option as sparse matrix
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
646 %! vopt = odeset ("Mass", sparse (eye (2,2)));
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
647 %! vsol = ode45 (@fpol, [0 2], [2 0], vopt);
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
648 %! assert ([vsol.x(end), vsol.y(end,:)], [2, fref], 1e-3);
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
649 %!test # Mass option as function and sparse matrix
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
650 %! vopt = odeset ("Mass", @fmsa);
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
651 %! vsol = ode45 (@fpol, [0 2], [2 0], vopt);
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
652 %! assert ([vsol.x(end), vsol.y(end,:)], [2, fref], 1e-3);
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
653 %!test # Mass option as function and MStateDependence
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
654 %! vopt = odeset ("Mass", @fmas, "MStateDependence", "strong");
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
655 %! vsol = ode45 (@fpol, [0 2], [2 0], vopt);
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
656 %! assert ([vsol.x(end), vsol.y(end,:)], [2, fref], 1e-3);
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
657 %!test # Set BDF option to something else than default
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
658 %! vopt = odeset ("BDF", "on");
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
659 %! [vt, vy] = ode45 (@fpol, [0 2], [2 0], vopt);
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
660 %! assert ([vt(end), vy(end,:)], [2, fref], 1e-3);
20568
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
661 %!
20581
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
662 %!## test for MvPattern option is missing
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
663 %!## test for InitialSlope option is missing
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
664 %!## test for MaxOrder option is missing
20568
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
665 %!
20581
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20580
diff changeset
666 %! warning ("on", "OdePkg:InvalidArgument");
20568
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
667