annotate scripts/ode/ode45.m @ 20553:45151de7423f

maint: Clean up implementations of ode45.m, odeget.m, odeset.m. * ode45.m: Match variable names in function to docstring. Don't use '...' line continuation unless strictly necessary. Remove incorrect isa check for inline function. Use '( )' around switch statement test variable. Use printf, rather than fprintf, where possible. * odeget.m: Match variable names in function to docstring. Rephrase error messages to begin with 'odeget:'. Use try/catch blocks to speed up "fast" and "fast_not_empty" code. Use rows() rather than "size (xxx, 1)". Use isempty rather than "size (xxx, 1) == 0". Use printf, rather than fprintf, where possible. Use unwind_protect block in BIST tests to restore warning state. * odeset.m: Match variable names in function to docstring. Use rows() rather than "size (xxx, 1)". Use isempty rather than "size (xxx, 1) == 0". Use printf, rather than fprintf, where possible. Eliminate for loop with cell2struct for odestruct initialization. Introduce temporary vars oldstruct, newstruct to clarify code. Restate some error messages to begin with 'odeset:'. Use cellfun to quickl check that all field inputs are strings. Use unwind_protect block in BIST tests to restore warning state.
author Rik <rik@octave.org>
date Mon, 05 Oct 2015 11:59:18 -0700
parents e368ce72a844
children a22d8a2eb0e5
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
20553
45151de7423f maint: Clean up implementations of ode45.m, odeget.m, odeset.m.
Rik <rik@octave.org>
parents: 20549
diff changeset
1 ## Copyright (C) 2014, Jacopo Corno <jacopo.corno@gmail.com>
20533
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>
20553
45151de7423f maint: Clean up implementations of ode45.m, odeget.m, odeset.m.
Rik <rik@octave.org>
parents: 20549
diff changeset
3 ## Copyright (C) 2006-2012, Thomas Treichl <treichl@users.sourceforge.net>
20533
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 -*-
20548
25623ef2ff4f doc: Rewrite docstrings for ode* family of functions.
Rik <rik@octave.org>
parents: 20543
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: 20543
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: 20543
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: 20543
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: 20543
diff changeset
26 ## @deftypefnx {Function File} {@var{sol} =} ode45 (@var{fun}, @var{trange}, @var{init}, @dots{})
20533
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
27 ##
20548
25623ef2ff4f doc: Rewrite docstrings for ode* family of functions.
Rik <rik@octave.org>
parents: 20543
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: 20543
diff changeset
29 ## with the well known explicit Dormand-Prince method of order 4.
20533
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
30 ##
20548
25623ef2ff4f doc: Rewrite docstrings for ode* family of functions.
Rik <rik@octave.org>
parents: 20543
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: 20543
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: 20543
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: 20543
diff changeset
34 ## unknowns @var{y}.
20533
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
35 ##
20548
25623ef2ff4f doc: Rewrite docstrings for ode* family of functions.
Rik <rik@octave.org>
parents: 20543
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: 20543
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: 20543
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: 20543
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: 20543
diff changeset
40 ## instances unless the integrate function called is
25623ef2ff4f doc: Rewrite docstrings for ode* family of functions.
Rik <rik@octave.org>
parents: 20543
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: 20543
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: 20543
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: 20543
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: 20543
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: 20543
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: 20543
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: 20543
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: 20543
diff changeset
49 ## changing the option @var{"Tau"}, that has a default value of @math{1e-6}.
20533
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
50 ##
20548
25623ef2ff4f doc: Rewrite docstrings for ode* family of functions.
Rik <rik@octave.org>
parents: 20543
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: 20543
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: 20543
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: 20543
diff changeset
54 ## in @var{init}.
20533
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
55 ##
20548
25623ef2ff4f doc: Rewrite docstrings for ode* family of functions.
Rik <rik@octave.org>
parents: 20543
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: 20543
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: 20543
diff changeset
58 ##
25623ef2ff4f doc: Rewrite docstrings for ode* family of functions.
Rik <rik@octave.org>
parents: 20543
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: 20543
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: 20543
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: 20543
diff changeset
62 ## unknown of the problem and each row corresponds to a time in @var{t}.
20533
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
20548
25623ef2ff4f doc: Rewrite docstrings for ode* family of functions.
Rik <rik@octave.org>
parents: 20543
diff changeset
65 ##
20533
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
66 ## @example
20548
25623ef2ff4f doc: Rewrite docstrings for ode* family of functions.
Rik <rik@octave.org>
parents: 20543
diff changeset
67 ## @group
20533
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]);
20548
25623ef2ff4f doc: Rewrite docstrings for ode* family of functions.
Rik <rik@octave.org>
parents: 20543
diff changeset
70 ## @end group
20533
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
71 ## @end example
20548
25623ef2ff4f doc: Rewrite docstrings for ode* family of functions.
Rik <rik@octave.org>
parents: 20543
diff changeset
72 ## @seealso{odeset, odeget}
20533
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
20553
45151de7423f maint: Clean up implementations of ode45.m, odeget.m, odeset.m.
Rik <rik@octave.org>
parents: 20549
diff changeset
75 function varargout = ode45 (vfun, vtrange, vinit, varargin)
20533
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
76
20553
45151de7423f maint: Clean up implementations of ode45.m, odeget.m, odeset.m.
Rik <rik@octave.org>
parents: 20549
diff changeset
77 vorder = 5; # runge_kutta_45_dorpri uses local extrapolation
20533
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
20553
45151de7423f maint: Clean up implementations of ode45.m, odeget.m, odeset.m.
Rik <rik@octave.org>
parents: 20549
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: 20549
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: 20549
diff changeset
82 if (nargin == 0) # Check number and types of all input arguments
20533
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
83 help (vsolver);
20553
45151de7423f maint: Clean up implementations of ode45.m, odeget.m, odeset.m.
Rik <rik@octave.org>
parents: 20549
diff changeset
84 error ("OdePkg:InvalidArgument",
20533
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)
20553
45151de7423f maint: Clean up implementations of ode45.m, odeget.m, odeset.m.
Rik <rik@octave.org>
parents: 20549
diff changeset
89 print_usage ();
20533
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)
20549
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20548
diff changeset
93 if (! isstruct (varargin{1}))
20533
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)}};
20549
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20548
diff changeset
101 else # if (isstruct (varargin{1}))
20533
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
20549
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20548
diff changeset
105 else # nargin == 3
20533
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
20553
45151de7423f maint: Clean up implementations of ode45.m, odeget.m, odeset.m.
Rik <rik@octave.org>
parents: 20549
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: 20549
diff changeset
111 error ("OdePkg:InvalidArgument",
20533
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
20553
45151de7423f maint: Clean up implementations of ode45.m, odeget.m, odeset.m.
Rik <rik@octave.org>
parents: 20549
diff changeset
115 if (length (vtrange) < 2
45151de7423f maint: Clean up implementations of ode45.m, odeget.m, odeset.m.
Rik <rik@octave.org>
parents: 20549
diff changeset
116 && (isempty (vodeoptions.TimeStepSize)
45151de7423f maint: Clean up implementations of ode45.m, odeget.m, odeset.m.
Rik <rik@octave.org>
parents: 20549
diff changeset
117 || isempty (vodeoptions.TimeStepNumber)))
45151de7423f maint: Clean up implementations of ode45.m, odeget.m, odeset.m.
Rik <rik@octave.org>
parents: 20549
diff changeset
118 error ("OdePkg:InvalidArgument",
20533
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");
20553
45151de7423f maint: Clean up implementations of ode45.m, odeget.m, odeset.m.
Rik <rik@octave.org>
parents: 20549
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: 20549
diff changeset
121 error ("OdePkg:InvalidArgument",
20533
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
20553
45151de7423f maint: Clean up implementations of ode45.m, odeget.m, odeset.m.
Rik <rik@octave.org>
parents: 20549
diff changeset
124 vodeoptions.vdirection = sign (vtrange(2) - vtrange(1));
20533
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
125 endif
20553
45151de7423f maint: Clean up implementations of ode45.m, odeget.m, odeset.m.
Rik <rik@octave.org>
parents: 20549
diff changeset
126 vtrange = vtrange(:);
20533
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
127
20549
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20548
diff changeset
128 if (! isvector (vinit) || ! isnumeric (vinit))
20553
45151de7423f maint: Clean up implementations of ode45.m, odeget.m, odeset.m.
Rik <rik@octave.org>
parents: 20549
diff changeset
129 error ("OdePkg:InvalidArgument",
20533
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
20553
45151de7423f maint: Clean up implementations of ode45.m, odeget.m, odeset.m.
Rik <rik@octave.org>
parents: 20549
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: 20549
diff changeset
135 error ("OdePkg:InvalidArgument",
20533
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
20549
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20548
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: 20548
diff changeset
140 ## check if an invalid or unused option is set
20553
45151de7423f maint: Clean up implementations of ode45.m, odeget.m, odeset.m.
Rik <rik@octave.org>
parents: 20549
diff changeset
141 if (isempty (vodeoptions.TimeStepNumber)
20533
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;
20553
45151de7423f maint: Clean up implementations of ode45.m, odeget.m, odeset.m.
Rik <rik@octave.org>
parents: 20549
diff changeset
145 elseif (! isempty (vodeoptions.TimeStepNumber)
20549
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20548
diff changeset
146 && ! isempty (vodeoptions.TimeStepSize))
20533
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)
20553
45151de7423f maint: Clean up implementations of ode45.m, odeget.m, odeset.m.
Rik <rik@octave.org>
parents: 20549
diff changeset
150 warning ("OdePkg:InvalidArgument",
45151de7423f maint: Clean up implementations of ode45.m, odeget.m, odeset.m.
Rik <rik@octave.org>
parents: 20549
diff changeset
151 "option 'TimeStepSize' has a wrong sign",
20533
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
20553
45151de7423f maint: Clean up implementations of ode45.m, odeget.m, odeset.m.
Rik <rik@octave.org>
parents: 20549
diff changeset
155 elseif (isempty (vodeoptions.TimeStepNumber)
20549
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20548
diff changeset
156 && ! isempty (vodeoptions.TimeStepSize))
20533
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)
20553
45151de7423f maint: Clean up implementations of ode45.m, odeget.m, odeset.m.
Rik <rik@octave.org>
parents: 20549
diff changeset
160 warning ("OdePkg:InvalidArgument",
45151de7423f maint: Clean up implementations of ode45.m, odeget.m, odeset.m.
Rik <rik@octave.org>
parents: 20549
diff changeset
161 "option 'TimeStepSize' has a wrong sign",
20533
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
20553
45151de7423f maint: Clean up implementations of ode45.m, odeget.m, odeset.m.
Rik <rik@octave.org>
parents: 20549
diff changeset
166 warning ("OdePkg:InvalidArgument",
20533
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
20549
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20548
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: 20548
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: 20548
diff changeset
176 if (isempty (vodeoptions.RelTol) && ! vodeoptions.vstepsizefixed)
20533
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
177 vodeoptions.RelTol = 1e-3;
20553
45151de7423f maint: Clean up implementations of ode45.m, odeget.m, odeset.m.
Rik <rik@octave.org>
parents: 20549
diff changeset
178 warning ("OdePkg:InvalidArgument",
45151de7423f maint: Clean up implementations of ode45.m, odeget.m, odeset.m.
Rik <rik@octave.org>
parents: 20549
diff changeset
179 "Option 'RelTol' not set, new value %f is used",
20533
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
180 vodeoptions.RelTol);
20549
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20548
diff changeset
181 elseif (! isempty (vodeoptions.RelTol) && vodeoptions.vstepsizefixed)
20553
45151de7423f maint: Clean up implementations of ode45.m, odeget.m, odeset.m.
Rik <rik@octave.org>
parents: 20549
diff changeset
182 warning ("OdePkg:InvalidArgument",
20549
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20548
diff changeset
183 "Option 'RelTol' will be ignored if fixed time stamps are given");
20533
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
20549
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20548
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: 20548
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: 20548
diff changeset
188 if (isempty (vodeoptions.AbsTol) && ! vodeoptions.vstepsizefixed)
20533
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
189 vodeoptions.AbsTol = 1e-6;
20553
45151de7423f maint: Clean up implementations of ode45.m, odeget.m, odeset.m.
Rik <rik@octave.org>
parents: 20549
diff changeset
190 warning ("OdePkg:InvalidArgument",
45151de7423f maint: Clean up implementations of ode45.m, odeget.m, odeset.m.
Rik <rik@octave.org>
parents: 20549
diff changeset
191 "Option 'AbsTol' not set, new value %f is used",
20533
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
192 vodeoptions.AbsTol);
20549
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20548
diff changeset
193 elseif (! isempty (vodeoptions.AbsTol) && vodeoptions.vstepsizefixed)
20553
45151de7423f maint: Clean up implementations of ode45.m, odeget.m, odeset.m.
Rik <rik@octave.org>
parents: 20549
diff changeset
194 warning ("OdePkg:InvalidArgument",
20549
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20548
diff changeset
195 "Option 'AbsTol' will be ignored if fixed time stamps are given");
20533
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
196 else
20549
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20548
diff changeset
197 vodeoptions.AbsTol = vodeoptions.AbsTol(:); # Create column vector
20533
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
20549
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20548
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: 20548
diff changeset
201 ## This option can be set by the user to another value than default value.
20533
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
20549
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20548
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: 20548
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: 20548
diff changeset
210 if (! isempty (vodeoptions.NonNegative))
20533
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;
20553
45151de7423f maint: Clean up implementations of ode45.m, odeget.m, odeset.m.
Rik <rik@octave.org>
parents: 20549
diff changeset
215 warning ("OdePkg:InvalidArgument",
20533
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
20549
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20548
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: 20548
diff changeset
223 ## This option can be set by the user to another value than default value.
20533
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
20549
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20548
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: 20548
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: 20548
diff changeset
235 if (! isempty (vodeoptions.OutputSel))
20533
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
20549
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20548
diff changeset
241 ## Implementation of the option OutputSave has been finished.
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20548
diff changeset
242 ## This option can be set by the user to another value than default value.
20533
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
243 if (isempty (vodeoptions.OutputSave))
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
244 vodeoptions.OutputSave = 1;
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
20549
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20548
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: 20548
diff changeset
248 ## This option can be set by the user to another value than default value.
20533
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
20549
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20548
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: 20548
diff changeset
256 ## This option can be set by the user to another value than default value.
20533
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
257
20549
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20548
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: 20548
diff changeset
259 ## This option can be set by the user to another value than default value.
20533
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"))
20549
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20548
diff changeset
261 vodeoptions.InitialStep = ...
20553
45151de7423f maint: Clean up implementations of ode45.m, odeget.m, odeset.m.
Rik <rik@octave.org>
parents: 20549
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: 20549
diff changeset
263 vinit,
20549
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20548
diff changeset
264 vodeoptions.AbsTol,
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20548
diff changeset
265 vodeoptions.RelTol,
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20548
diff changeset
266 vodeoptions.vnormcontrol);
20553
45151de7423f maint: Clean up implementations of ode45.m, odeget.m, odeset.m.
Rik <rik@octave.org>
parents: 20549
diff changeset
267 warning ("OdePkg:InvalidArgument",
45151de7423f maint: Clean up implementations of ode45.m, odeget.m, odeset.m.
Rik <rik@octave.org>
parents: 20549
diff changeset
268 "option 'InitialStep' not set, estimated value %f is used",
20533
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.
20549
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20548
diff changeset
276 if (isempty (vodeoptions.MaxStep) && ! vodeoptions.vstepsizefixed)
20553
45151de7423f maint: Clean up implementations of ode45.m, odeget.m, odeset.m.
Rik <rik@octave.org>
parents: 20549
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: 20549
diff changeset
278 warning ("OdePkg:InvalidArgument",
45151de7423f maint: Clean up implementations of ode45.m, odeget.m, odeset.m.
Rik <rik@octave.org>
parents: 20549
diff changeset
279 "Option 'MaxStep' not set, new value %f is used",
20533
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
20549
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20548
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: 20548
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: 20548
diff changeset
285 if (! isempty (vodeoptions.Events))
20533
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
20549
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20548
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: 20548
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: 20548
diff changeset
293 ## and therefore no Jacobian calculation is necessary.
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20548
diff changeset
294 if (! isequal (vodeoptions.Jacobian, vodetemp.Jacobian))
20553
45151de7423f maint: Clean up implementations of ode45.m, odeget.m, odeset.m.
Rik <rik@octave.org>
parents: 20549
diff changeset
295 warning ("OdePkg:InvalidArgument",
20549
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20548
diff changeset
296 "option 'Jacobian' will be ignored by this solver");
20533
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
20549
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20548
diff changeset
299 if (! isequal (vodeoptions.JPattern, vodetemp.JPattern))
20553
45151de7423f maint: Clean up implementations of ode45.m, odeget.m, odeset.m.
Rik <rik@octave.org>
parents: 20549
diff changeset
300 warning ("OdePkg:InvalidArgument",
20549
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20548
diff changeset
301 "option 'JPattern' will be ignored by this solver");
20533
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
20549
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20548
diff changeset
304 if (! isequal (vodeoptions.Vectorized, vodetemp.Vectorized))
20553
45151de7423f maint: Clean up implementations of ode45.m, odeget.m, odeset.m.
Rik <rik@octave.org>
parents: 20549
diff changeset
305 warning ("OdePkg:InvalidArgument",
20549
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20548
diff changeset
306 "option 'Vectorized' will be ignored by this solver");
20533
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
20549
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20548
diff changeset
309 if (! isequal (vodeoptions.NewtonTol, vodetemp.NewtonTol))
20553
45151de7423f maint: Clean up implementations of ode45.m, odeget.m, odeset.m.
Rik <rik@octave.org>
parents: 20549
diff changeset
310 warning ("OdePkg:InvalidArgument",
20549
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20548
diff changeset
311 "option 'NewtonTol' will be ignored by this solver");
20533
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
20549
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20548
diff changeset
314 if (! isequal (vodeoptions.MaxNewtonIterations,vodetemp.MaxNewtonIterations))
20553
45151de7423f maint: Clean up implementations of ode45.m, odeget.m, odeset.m.
Rik <rik@octave.org>
parents: 20549
diff changeset
315 warning ("OdePkg:InvalidArgument",
20549
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20548
diff changeset
316 "option 'MaxNewtonIterations' will be ignored by this solver");
20533
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
20549
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20548
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: 20548
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: 20548
diff changeset
321 if (! isempty (vodeoptions.Mass) && isnumeric (vodeoptions.Mass))
20533
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
322 vhavemasshandle = false;
20549
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20548
diff changeset
323 vmass = vodeoptions.Mass; # constant mass
20533
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"))
20549
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20548
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: 20548
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: 20548
diff changeset
327 vhavemasshandle = false; # vmass = diag (ones (length (vinit), 1), 0);
20533
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.
20549
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20548
diff changeset
331 ## This option can be set by the user to another value than default value.
20533
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
20549
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20548
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: 20548
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: 20548
diff changeset
340 if (! isequal (vodeoptions.MvPattern, vodetemp.MvPattern))
20553
45151de7423f maint: Clean up implementations of ode45.m, odeget.m, odeset.m.
Rik <rik@octave.org>
parents: 20549
diff changeset
341 warning ("OdePkg:InvalidArgument",
20549
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20548
diff changeset
342 "option 'MvPattern' will be ignored by this solver");
20533
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
20549
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20548
diff changeset
345 if (! isequal (vodeoptions.MassSingular, vodetemp.MassSingular))
20553
45151de7423f maint: Clean up implementations of ode45.m, odeget.m, odeset.m.
Rik <rik@octave.org>
parents: 20549
diff changeset
346 warning ("OdePkg:InvalidArgument",
20549
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20548
diff changeset
347 "option 'MassSingular' will be ignored by this solver");
20533
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
20549
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20548
diff changeset
350 if (! isequal (vodeoptions.InitialSlope, vodetemp.InitialSlope))
20553
45151de7423f maint: Clean up implementations of ode45.m, odeget.m, odeset.m.
Rik <rik@octave.org>
parents: 20549
diff changeset
351 warning ("OdePkg:InvalidArgument",
20549
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20548
diff changeset
352 "option 'InitialSlope' will be ignored by this solver");
20533
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
20549
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20548
diff changeset
355 if (! isequal (vodeoptions.MaxOrder, vodetemp.MaxOrder))
20553
45151de7423f maint: Clean up implementations of ode45.m, odeget.m, odeset.m.
Rik <rik@octave.org>
parents: 20549
diff changeset
356 warning ("OdePkg:InvalidArgument",
20549
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20548
diff changeset
357 "option 'MaxOrder' will be ignored by this solver");
20533
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
20549
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20548
diff changeset
360 if (! isequal (vodeoptions.BDF, vodetemp.BDF))
20553
45151de7423f maint: Clean up implementations of ode45.m, odeget.m, odeset.m.
Rik <rik@octave.org>
parents: 20549
diff changeset
361 warning ("OdePkg:InvalidArgument",
20549
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20548
diff changeset
362 "option 'BDF' will be ignored by this solver");
20533
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
20549
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20548
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: 20548
diff changeset
369 if (vmassdependence) # constant mass matrices have already
20533
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{:}) ...
20543
3339c9bdfe6a Activate FSAL property in dorpri timestepper
Carlo de Falco <carlo.defalco@polimi.it>
parents: 20533
diff changeset
372 \ vfun (t, x, vodeoptions.vfunarguments{:});
20549
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20548
diff changeset
373 else # if (vmassdependence == false)
20533
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{:}) ...
20543
3339c9bdfe6a Activate FSAL property in dorpri timestepper
Carlo de Falco <carlo.defalco@polimi.it>
parents: 20533
diff changeset
376 \ vfun (t, x, vodeoptions.vfunarguments{:});
20533
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
20553
45151de7423f maint: Clean up implementations of ode45.m, odeget.m, odeset.m.
Rik <rik@octave.org>
parents: 20549
diff changeset
380 switch (integrate_func)
20533
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
381 case "adaptive"
20553
45151de7423f maint: Clean up implementations of ode45.m, odeget.m, odeset.m.
Rik <rik@octave.org>
parents: 20549
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: 20549
diff changeset
383 vorder, vfun, vtrange, vinit, SubOpts);
20533
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
384 case "n_steps"
20553
45151de7423f maint: Clean up implementations of ode45.m, odeget.m, odeset.m.
Rik <rik@octave.org>
parents: 20549
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: 20549
diff changeset
386 vfun, vtrange(1), vinit,
45151de7423f maint: Clean up implementations of ode45.m, odeget.m, odeset.m.
Rik <rik@octave.org>
parents: 20549
diff changeset
387 vodeoptions.TimeStepSize,
20533
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"
20553
45151de7423f maint: Clean up implementations of ode45.m, odeget.m, odeset.m.
Rik <rik@octave.org>
parents: 20549
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: 20549
diff changeset
391 vfun, vtrange, vinit,
20533
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
20549
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20548
diff changeset
396 if (vodeoptions.vhaveoutputfunction) # Cleanup plotter
20553
45151de7423f maint: Clean up implementations of ode45.m, odeget.m, odeset.m.
Rik <rik@octave.org>
parents: 20549
diff changeset
397 feval (vodeoptions.OutputFcn, solution.t(end),
20543
3339c9bdfe6a Activate FSAL property in dorpri timestepper
Carlo de Falco <carlo.defalco@polimi.it>
parents: 20533
diff changeset
398 solution.x(end,:)', "done", vodeoptions.vfunarguments{:});
20533
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
399 endif
20549
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20548
diff changeset
400 if (vodeoptions.vhaveeventfunction) # Cleanup event function handling
20553
45151de7423f maint: Clean up implementations of ode45.m, odeget.m, odeset.m.
Rik <rik@octave.org>
parents: 20549
diff changeset
401 odepkg_event_handle (vodeoptions.Events, solution.t(end),
20549
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20548
diff changeset
402 solution.x(end,:)', "done",
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20548
diff changeset
403 vodeoptions.vfunarguments{:});
20533
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;
20549
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20548
diff changeset
409 vnsteps = solution.vcntloop-2; # vcntloop from 2..end
20553
45151de7423f maint: Clean up implementations of ode45.m, odeget.m, odeset.m.
Rik <rik@octave.org>
parents: 20549
diff changeset
410 vnfailed = (solution.vcntcycles-1)-(vnsteps)+1; # vcntcycl from 1..end
20549
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20548
diff changeset
411 vnfevals = 7*(solution.vcntcycles-1); # number of ode evaluations
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20548
diff changeset
412 vndecomps = 0; # number of LU decompositions
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20548
diff changeset
413 vnpds = 0; # number of partial derivatives
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20548
diff changeset
414 vnlinsols = 0; # no. of linear systems solutions
20533
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)
20553
45151de7423f maint: Clean up implementations of ode45.m, odeget.m, odeset.m.
Rik <rik@octave.org>
parents: 20549
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: 20549
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: 20549
diff changeset
419 printf ("Number of function calls: %d\n", vnfevals);
20533
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
20553
45151de7423f maint: Clean up implementations of ode45.m, odeget.m, odeset.m.
Rik <rik@octave.org>
parents: 20549
diff changeset
425 if (nargout == 2)
45151de7423f maint: Clean up implementations of ode45.m, odeget.m, odeset.m.
Rik <rik@octave.org>
parents: 20549
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: 20549
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: 20549
diff changeset
428 elseif (nargout == 1)
20549
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20548
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: 20548
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: 20548
diff changeset
431 varargout{1}.solver = vsolver; # Solver name is saved in field solver
20533
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
432 if (vodeoptions.vhaveeventfunction)
20549
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20548
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: 20548
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: 20548
diff changeset
435 varargout{1}.ye = solution.vevent{4}; # Results when an event occurred
20533
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)
20553
45151de7423f maint: Clean up implementations of ode45.m, odeget.m, odeset.m.
Rik <rik@octave.org>
parents: 20549
diff changeset
438 varargout{1}.stats = struct ();
20533
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)
20553
45151de7423f maint: Clean up implementations of ode45.m, odeget.m, odeset.m.
Rik <rik@octave.org>
parents: 20549
diff changeset
447 varargout = cell (1,5);
45151de7423f maint: Clean up implementations of ode45.m, odeget.m, odeset.m.
Rik <rik@octave.org>
parents: 20549
diff changeset
448 varargout{1} = solution.t;
45151de7423f maint: Clean up implementations of ode45.m, odeget.m, odeset.m.
Rik <rik@octave.org>
parents: 20549
diff changeset
449 varargout{2} = solution.x;
20533
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
450 if (vodeoptions.vhaveeventfunction)
20549
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20548
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: 20548
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: 20548
diff changeset
453 varargout{5} = solution.vevent{2}; # Index info which event occurred
20533
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
20549
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20548
diff changeset
459
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20548
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: 20548
diff changeset
461 ## for this function.
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20548
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: 20548
diff changeset
463 ## accuracy)
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20548
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: 20548
diff changeset
465 %! ydot = [vy(2); (1 - vy(1)^2) * vy(2) - vy(1)];
20533
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
466 %!endfunction
20549
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20548
diff changeset
467 %!function [vref] = fref () # The computed reference solution
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20548
diff changeset
468 %! vref = [0.32331666704577, -1.83297456798624];
20533
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
469 %!endfunction
20549
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20548
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: 20548
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: 20548
diff changeset
472 %!endfunction
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20548
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: 20548
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: 20548
diff changeset
475 %!endfunction
20533
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)
20549
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20548
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: 20548
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: 20548
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: 20548
diff changeset
480 %!endfunction
20533
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)
20549
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20548
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: 20548
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: 20548
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: 20548
diff changeset
485 %!endfunction
20533
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)
20549
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20548
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: 20548
diff changeset
488 %!endfunction
20533
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)
20549
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20548
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: 20548
diff changeset
491 %!endfunction
20533
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)
20549
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20548
diff changeset
493 %! if (regexp (char (vflag), 'init') == 1)
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20548
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: 20548
diff changeset
495 %! elseif (isempty (vflag))
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20548
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: 20548
diff changeset
497 %! vout = false;
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20548
diff changeset
498 %! elseif (regexp (char (vflag), 'done') == 1)
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20548
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: 20548
diff changeset
500 %! else
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20548
diff changeset
501 %! error ('"fout" invalid vflag');
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20548
diff changeset
502 %! endif
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20548
diff changeset
503 %!endfunction
20533
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
20549
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20548
diff changeset
507 %!error # ouput argument
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20548
diff changeset
508 %! warning ("off", "OdePkg:InvalidArgument");
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20548
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: 20548
diff changeset
510 %!error # input argument number one
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20548
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: 20548
diff changeset
512 %!error # input argument number two
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20548
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: 20548
diff changeset
514 %!test # two output arguments
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20548
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: 20548
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: 20548
diff changeset
517 %!test # not too many steps
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20548
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: 20548
diff changeset
519 %! assert (size (vt) < 20);
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20548
diff changeset
520 %!test # anonymous function instead of real function
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20548
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: 20548
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: 20548
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: 20548
diff changeset
524 %!test # extra input arguments passed through
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20548
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: 20548
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: 20548
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: 20548
diff changeset
528 %! vopt = odeset;
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20548
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: 20548
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: 20548
diff changeset
531 %!error # strange OdePkg structure
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20548
diff changeset
532 %! vopt = struct ("foo", 1);
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20548
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: 20548
diff changeset
534 %!test # Solve vdp in fixed step sizes
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20548
diff changeset
535 %! vopt = odeset("TimeStepSize", 0.1);
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20548
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: 20548
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: 20548
diff changeset
538 %!test # Solve another anonymous function below zero
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20548
diff changeset
539 %! vref = [0, 14.77810590694212];
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20548
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: 20548
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: 20548
diff changeset
542 %!test # InitialStep option
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20548
diff changeset
543 %! vopt = odeset ("InitialStep", 1e-8);
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20548
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: 20548
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: 20548
diff changeset
546 %!test # MaxStep option
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20548
diff changeset
547 %! vopt = odeset ("MaxStep", 1e-3);
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20548
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: 20548
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: 20548
diff changeset
550 %!test # Solve with intermidiate step
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20548
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: 20548
diff changeset
552 %! assert (any((vsol.x-1) == 0));
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20548
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: 20548
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: 20548
diff changeset
555 %! vref = [-1.205364552835178, 0.951542399860817];
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20548
diff changeset
556 %! vsol = ode45 (@fpol, [0 -2], [2 0]);
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20548
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: 20548
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: 20548
diff changeset
559 %! vref = [-1.205364552835178, 0.951542399860817];
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20548
diff changeset
560 %! vsol = ode45 (@fpol, [2 -2], fref);
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20548
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: 20548
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: 20548
diff changeset
563 %! vref = [-1.205364552835178, 0.951542399860817];
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20548
diff changeset
564 %! vsol = ode45 (@fpol, [2 0 -2], fref);
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20548
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: 20548
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: 20548
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: 20548
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: 20548
diff changeset
569 %! vref = [-1, 0.367879437558975];
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20548
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: 20548
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: 20548
diff changeset
572 %!test # Solve another anonymous function below zero
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20548
diff changeset
573 %! vref = [0, 14.77810590694212];
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20548
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: 20548
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: 20548
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: 20548
diff changeset
577 %! vref = [-1.205364552835178, 0.951542399860817];
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20548
diff changeset
578 %! vopt = odeset ("MaxStep", 1e-3);
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20548
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: 20548
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: 20548
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: 20548
diff changeset
582 %!test # AbsTol option
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20548
diff changeset
583 %! vopt = odeset ("AbsTol", 1e-5);
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20548
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: 20548
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: 20548
diff changeset
586 %!test # AbsTol and RelTol option
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20548
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: 20548
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: 20548
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: 20548
diff changeset
590 %!test # RelTol and NormControl option -- higher accuracy
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20548
diff changeset
591 %! vopt = odeset ("RelTol", 1e-8, "NormControl", "on");
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20548
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: 20548
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: 20548
diff changeset
594 %!test # Keeps initial values while integrating
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20548
diff changeset
595 %! vopt = odeset ("NonNegative", 2);
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20548
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: 20548
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: 20548
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: 20548
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: 20548
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: 20548
diff changeset
601 %!test # Details of OutputSave can't be tested
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20548
diff changeset
602 %! vopt = odeset ("OutputSave", 1, "OutputSel", 1);
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20548
diff changeset
603 %! vsla = ode45 (@fpol, [0 2], [2 0], vopt);
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20548
diff changeset
604 %! vopt = odeset ("OutputSave", 2);
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20548
diff changeset
605 %! vslb = ode45 (@fpol, [0 2], [2 0], vopt);
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20548
diff changeset
606 %! assert (length (vsla.x) + 1 >= 2 * length (vslb.x))
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20548
diff changeset
607 %!test # Stats must add further elements in vsol
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20548
diff changeset
608 %! vopt = odeset ("Stats", "on");
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20548
diff changeset
609 %! vsol = ode45 (@fpol, [0 2], [2 0], vopt);
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20548
diff changeset
610 %! assert (isfield (vsol, "stats"));
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20548
diff changeset
611 %! assert (isfield (vsol.stats, "nsteps"));
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20548
diff changeset
612 %!test # Events option add further elements in vsol
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20548
diff changeset
613 %! vopt = odeset ("Events", @feve);
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20548
diff changeset
614 %! vsol = ode45 (@fpol, [0 10], [2 0], vopt);
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20548
diff changeset
615 %! assert (isfield (vsol, "ie"));
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20548
diff changeset
616 %! assert (vsol.ie(1), 2);
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20548
diff changeset
617 %! assert (isfield (vsol, "xe"));
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20548
diff changeset
618 %! assert (isfield (vsol, "ye"));
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20548
diff changeset
619 %!test # Events option, now stop integration
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20548
diff changeset
620 %! vopt = odeset ("Events", @fevn, "NormControl", "on");
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20548
diff changeset
621 %! vsol = ode45 (@fpol, [0 10], [2 0], vopt);
20553
45151de7423f maint: Clean up implementations of ode45.m, odeget.m, odeset.m.
Rik <rik@octave.org>
parents: 20549
diff changeset
622 %! assert ([vsol.ie, vsol.xe, vsol.ye],
45151de7423f maint: Clean up implementations of ode45.m, odeget.m, odeset.m.
Rik <rik@octave.org>
parents: 20549
diff changeset
623 %! [2.0, 2.496110, -0.830550, -2.677589], 6e-1);
20549
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20548
diff changeset
624 %!test # Events option, five output arguments
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20548
diff changeset
625 %! vopt = odeset ("Events", @fevn, "NormControl", "on");
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20548
diff changeset
626 %! [vt, vy, vxe, vye, vie] = ode45 (@fpol, [0 10], [2 0], vopt);
20553
45151de7423f maint: Clean up implementations of ode45.m, odeget.m, odeset.m.
Rik <rik@octave.org>
parents: 20549
diff changeset
627 %! assert ([vie, vxe, vye],
45151de7423f maint: Clean up implementations of ode45.m, odeget.m, odeset.m.
Rik <rik@octave.org>
parents: 20549
diff changeset
628 %! [2.0, 2.496110, -0.830550, -2.677589], 6e-1);
20549
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20548
diff changeset
629 %!test # Jacobian option
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20548
diff changeset
630 %! vopt = odeset ("Jacobian", @fjac);
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20548
diff changeset
631 %! vsol = ode45 (@fpol, [0 2], [2 0], vopt);
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20548
diff changeset
632 %! 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: 20548
diff changeset
633 %!test # Jacobian option and sparse return value
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20548
diff changeset
634 %! vopt = odeset ("Jacobian", @fjcc);
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20548
diff changeset
635 %! vsol = ode45 (@fpol, [0 2], [2 0], vopt);
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20548
diff changeset
636 %! assert ([vsol.x(end), vsol.y(end,:)], [2, fref], 1e-3);
20533
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
637 %!
20549
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20548
diff changeset
638 %!## test for JPattern option is missing
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20548
diff changeset
639 %!## test for Vectorized option is missing
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20548
diff changeset
640 %!## test for NewtonTol option is missing
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20548
diff changeset
641 %!## test for MaxNewtonIterations option is missing
20533
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
642 %!
20549
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20548
diff changeset
643 %!test # Mass option as function
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20548
diff changeset
644 %! vopt = odeset ("Mass", @fmas);
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20548
diff changeset
645 %! vsol = ode45 (@fpol, [0 2], [2 0], vopt);
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20548
diff changeset
646 %! 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: 20548
diff changeset
647 %!test # Mass option as matrix
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20548
diff changeset
648 %! vopt = odeset ("Mass", eye (2,2));
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20548
diff changeset
649 %! vsol = ode45 (@fpol, [0 2], [2 0], vopt);
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20548
diff changeset
650 %! 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: 20548
diff changeset
651 %!test # Mass option as sparse matrix
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20548
diff changeset
652 %! vopt = odeset ("Mass", sparse (eye (2,2)));
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20548
diff changeset
653 %! vsol = ode45 (@fpol, [0 2], [2 0], vopt);
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20548
diff changeset
654 %! 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: 20548
diff changeset
655 %!test # Mass option as function and sparse matrix
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20548
diff changeset
656 %! vopt = odeset ("Mass", @fmsa);
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20548
diff changeset
657 %! vsol = ode45 (@fpol, [0 2], [2 0], vopt);
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20548
diff changeset
658 %! 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: 20548
diff changeset
659 %!test # Mass option as function and MStateDependence
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20548
diff changeset
660 %! vopt = odeset ("Mass", @fmas, "MStateDependence", "strong");
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20548
diff changeset
661 %! vsol = ode45 (@fpol, [0 2], [2 0], vopt);
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20548
diff changeset
662 %! 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: 20548
diff changeset
663 %!test # Set BDF option to something else than default
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20548
diff changeset
664 %! vopt = odeset ("BDF", "on");
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20548
diff changeset
665 %! [vt, vy] = ode45 (@fpol, [0 2], [2 0], vopt);
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20548
diff changeset
666 %! assert ([vt(end), vy(end,:)], [2, fref], 1e-3);
20533
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
667 %!
20549
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20548
diff changeset
668 %!## test for MvPattern option is missing
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20548
diff changeset
669 %!## test for InitialSlope option is missing
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20548
diff changeset
670 %!## test for MaxOrder option is missing
20533
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
671 %!
20549
e368ce72a844 maint: Use Octave coding conventions for ode* functions.
Rik <rik@octave.org>
parents: 20548
diff changeset
672 %! warning ("on", "OdePkg:InvalidArgument");
20533
fcb792acab9b Moving ode45, odeset, odeget, and levenshtein from odepkg to core.
jcorno <jacopo.corno@gmail.com>
parents:
diff changeset
673