Mercurial > octave
annotate scripts/ode/private/runge_kutta_23s.m @ 29359:7854d5752dd2
maint: merge stable to default.
author | John W. Eaton <jwe@octave.org> |
---|---|
date | Wed, 10 Feb 2021 10:10:40 -0500 |
parents | 967cfcde2e35 0a5b15007766 |
children | 796f54d4ddbf |
rev | line source |
---|---|
28308
8085ae13cc4a
ode23s.m: new function from former odepkg (bug #57309)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
diff
changeset
|
1 ######################################################################## |
8085ae13cc4a
ode23s.m: new function from former odepkg (bug #57309)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
diff
changeset
|
2 ## |
29358
0a5b15007766
update Octave Project Developers copyright for the new year
John W. Eaton <jwe@octave.org>
parents:
28308
diff
changeset
|
3 ## Copyright (C) 2013-2021 The Octave Project Developers |
28308
8085ae13cc4a
ode23s.m: new function from former odepkg (bug #57309)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
diff
changeset
|
4 ## |
8085ae13cc4a
ode23s.m: new function from former odepkg (bug #57309)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
diff
changeset
|
5 ## See the file COPYRIGHT.md in the top-level directory of this |
8085ae13cc4a
ode23s.m: new function from former odepkg (bug #57309)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
diff
changeset
|
6 ## distribution or <https://octave.org/copyright/>. |
8085ae13cc4a
ode23s.m: new function from former odepkg (bug #57309)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
diff
changeset
|
7 ## |
8085ae13cc4a
ode23s.m: new function from former odepkg (bug #57309)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
diff
changeset
|
8 ## This file is part of Octave. |
8085ae13cc4a
ode23s.m: new function from former odepkg (bug #57309)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
diff
changeset
|
9 ## |
8085ae13cc4a
ode23s.m: new function from former odepkg (bug #57309)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
diff
changeset
|
10 ## Octave is free software: you can redistribute it and/or modify it |
8085ae13cc4a
ode23s.m: new function from former odepkg (bug #57309)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
diff
changeset
|
11 ## under the terms of the GNU General Public License as published by |
8085ae13cc4a
ode23s.m: new function from former odepkg (bug #57309)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
diff
changeset
|
12 ## the Free Software Foundation, either version 3 of the License, or |
8085ae13cc4a
ode23s.m: new function from former odepkg (bug #57309)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
diff
changeset
|
13 ## (at your option) any later version. |
8085ae13cc4a
ode23s.m: new function from former odepkg (bug #57309)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
diff
changeset
|
14 ## |
8085ae13cc4a
ode23s.m: new function from former odepkg (bug #57309)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
diff
changeset
|
15 ## Octave is distributed in the hope that it will be useful, but |
8085ae13cc4a
ode23s.m: new function from former odepkg (bug #57309)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
diff
changeset
|
16 ## WITHOUT ANY WARRANTY; without even the implied warranty of |
8085ae13cc4a
ode23s.m: new function from former odepkg (bug #57309)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
diff
changeset
|
17 ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
8085ae13cc4a
ode23s.m: new function from former odepkg (bug #57309)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
diff
changeset
|
18 ## GNU General Public License for more details. |
8085ae13cc4a
ode23s.m: new function from former odepkg (bug #57309)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
diff
changeset
|
19 ## |
8085ae13cc4a
ode23s.m: new function from former odepkg (bug #57309)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
diff
changeset
|
20 ## You should have received a copy of the GNU General Public License |
8085ae13cc4a
ode23s.m: new function from former odepkg (bug #57309)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
diff
changeset
|
21 ## along with Octave; see the file COPYING. If not, see |
8085ae13cc4a
ode23s.m: new function from former odepkg (bug #57309)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
diff
changeset
|
22 ## <https://www.gnu.org/licenses/>. |
8085ae13cc4a
ode23s.m: new function from former odepkg (bug #57309)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
diff
changeset
|
23 ## |
8085ae13cc4a
ode23s.m: new function from former odepkg (bug #57309)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
diff
changeset
|
24 ######################################################################## |
8085ae13cc4a
ode23s.m: new function from former odepkg (bug #57309)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
diff
changeset
|
25 |
8085ae13cc4a
ode23s.m: new function from former odepkg (bug #57309)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
diff
changeset
|
26 ## -*- texinfo -*- |
8085ae13cc4a
ode23s.m: new function from former odepkg (bug #57309)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
diff
changeset
|
27 ## @deftypefn {} {[@var{t_next}, @var{x_next}] =} runge_kutta_23s (@var{fun}, @var{t}, @var{x}, @var{dt}) |
8085ae13cc4a
ode23s.m: new function from former odepkg (bug #57309)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
diff
changeset
|
28 ## @deftypefnx {} {[@var{t_next}, @var{x_next}] =} runge_kutta_23s (@var{fun}, @var{t}, @var{x}, @var{dt}, @var{options}) |
8085ae13cc4a
ode23s.m: new function from former odepkg (bug #57309)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
diff
changeset
|
29 ## @deftypefnx {} {[@var{t_next}, @var{x_next}] =} runge_kutta_23s (@var{fun}, @var{t}, @var{x}, @var{dt}, @var{options}, @var{k_vals}) |
8085ae13cc4a
ode23s.m: new function from former odepkg (bug #57309)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
diff
changeset
|
30 ## @deftypefnx {} {[@var{t_next}, @var{x_next}] =} runge_kutta_23s (@var{fun}, @var{t}, @var{x}, @var{dt}, @var{options}, @var{k_vals}, @var{t_next}) |
8085ae13cc4a
ode23s.m: new function from former odepkg (bug #57309)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
diff
changeset
|
31 ## @deftypefnx {} {[@var{t_next}, @var{x_next}, @var{x_est}] =} runge_kutta_23s (@dots{}) |
8085ae13cc4a
ode23s.m: new function from former odepkg (bug #57309)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
diff
changeset
|
32 ## @deftypefnx {} {[@var{t_next}, @var{x_next}, @var{x_est}, @var{k_vals_out}] =} runge_kutta_23s (@dots{}) |
8085ae13cc4a
ode23s.m: new function from former odepkg (bug #57309)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
diff
changeset
|
33 ## |
8085ae13cc4a
ode23s.m: new function from former odepkg (bug #57309)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
diff
changeset
|
34 ## This function can be used to integrate a system of ODEs with a given initial |
8085ae13cc4a
ode23s.m: new function from former odepkg (bug #57309)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
diff
changeset
|
35 ## condition @var{x} from @var{t} to @var{t+dt}, with a Rosenbrock method of |
8085ae13cc4a
ode23s.m: new function from former odepkg (bug #57309)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
diff
changeset
|
36 ## order (2,3). All the mathematical formulas are from Shampine, L. F. and |
8085ae13cc4a
ode23s.m: new function from former odepkg (bug #57309)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
diff
changeset
|
37 ## M. W. Reichelt, "The MATLAB ODE Suite", SIAM Journal on Scientific |
8085ae13cc4a
ode23s.m: new function from former odepkg (bug #57309)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
diff
changeset
|
38 ## Computing, Vol. 18, 1997, pp. 1–22. |
8085ae13cc4a
ode23s.m: new function from former odepkg (bug #57309)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
diff
changeset
|
39 ## |
8085ae13cc4a
ode23s.m: new function from former odepkg (bug #57309)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
diff
changeset
|
40 ## @var{f} is a function handle that defines the ODE: @code{y' = f(tau,y)}. |
8085ae13cc4a
ode23s.m: new function from former odepkg (bug #57309)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
diff
changeset
|
41 ## The function must accept two inputs where the first is time @var{tau} and |
8085ae13cc4a
ode23s.m: new function from former odepkg (bug #57309)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
diff
changeset
|
42 ## the second is a column vector of unknowns @var{y}. |
8085ae13cc4a
ode23s.m: new function from former odepkg (bug #57309)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
diff
changeset
|
43 ## |
8085ae13cc4a
ode23s.m: new function from former odepkg (bug #57309)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
diff
changeset
|
44 ## @var{t} is the first extreme of integration interval. |
8085ae13cc4a
ode23s.m: new function from former odepkg (bug #57309)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
diff
changeset
|
45 ## |
8085ae13cc4a
ode23s.m: new function from former odepkg (bug #57309)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
diff
changeset
|
46 ## @var{x} is the initial condition of the system.. |
8085ae13cc4a
ode23s.m: new function from former odepkg (bug #57309)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
diff
changeset
|
47 ## |
8085ae13cc4a
ode23s.m: new function from former odepkg (bug #57309)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
diff
changeset
|
48 ## @var{dt} is the timestep, that is the length of the integration interval. |
8085ae13cc4a
ode23s.m: new function from former odepkg (bug #57309)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
diff
changeset
|
49 ## |
8085ae13cc4a
ode23s.m: new function from former odepkg (bug #57309)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
diff
changeset
|
50 ## The optional fourth argument @var{options} specifies options for the ODE |
8085ae13cc4a
ode23s.m: new function from former odepkg (bug #57309)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
diff
changeset
|
51 ## solver. It is a structure generated by @code{odeset}. In particular it |
8085ae13cc4a
ode23s.m: new function from former odepkg (bug #57309)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
diff
changeset
|
52 ## contains the field @var{funarguments} with the optional arguments to be used |
8085ae13cc4a
ode23s.m: new function from former odepkg (bug #57309)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
diff
changeset
|
53 ## in the evaluation of @var{fun}. |
8085ae13cc4a
ode23s.m: new function from former odepkg (bug #57309)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
diff
changeset
|
54 ## |
8085ae13cc4a
ode23s.m: new function from former odepkg (bug #57309)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
diff
changeset
|
55 ## The optional fifth argument @var{k_vals_in} contains the Runge-Kutta |
8085ae13cc4a
ode23s.m: new function from former odepkg (bug #57309)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
diff
changeset
|
56 ## evaluations of the previous step to use in a FSAL scheme. |
8085ae13cc4a
ode23s.m: new function from former odepkg (bug #57309)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
diff
changeset
|
57 ## |
8085ae13cc4a
ode23s.m: new function from former odepkg (bug #57309)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
diff
changeset
|
58 ## The optional sixth argument @var{t_next} (@code{t_next = t + dt}) specifies |
8085ae13cc4a
ode23s.m: new function from former odepkg (bug #57309)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
diff
changeset
|
59 ## the end of the integration interval. The output @var{x_next} s the higher |
8085ae13cc4a
ode23s.m: new function from former odepkg (bug #57309)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
diff
changeset
|
60 ## order computed solution at time @var{t_next} (local extrapolation is |
8085ae13cc4a
ode23s.m: new function from former odepkg (bug #57309)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
diff
changeset
|
61 ## performed). |
8085ae13cc4a
ode23s.m: new function from former odepkg (bug #57309)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
diff
changeset
|
62 ## |
8085ae13cc4a
ode23s.m: new function from former odepkg (bug #57309)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
diff
changeset
|
63 ## Optionally the functions can also return @var{x_est}, a lower order solution |
8085ae13cc4a
ode23s.m: new function from former odepkg (bug #57309)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
diff
changeset
|
64 ## for the estimation of the error, and @var{k_vals_out}, a matrix containing |
8085ae13cc4a
ode23s.m: new function from former odepkg (bug #57309)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
diff
changeset
|
65 ## the Runge-Kutta evaluations to use in a FSAL scheme or for dense output. |
8085ae13cc4a
ode23s.m: new function from former odepkg (bug #57309)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
diff
changeset
|
66 ## |
8085ae13cc4a
ode23s.m: new function from former odepkg (bug #57309)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
diff
changeset
|
67 ## @seealso{runge_kutta_23} |
8085ae13cc4a
ode23s.m: new function from former odepkg (bug #57309)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
diff
changeset
|
68 ## @end deftypefn |
8085ae13cc4a
ode23s.m: new function from former odepkg (bug #57309)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
diff
changeset
|
69 |
8085ae13cc4a
ode23s.m: new function from former odepkg (bug #57309)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
diff
changeset
|
70 function [t_next, x_next, x_est, k] = runge_kutta_23s (fun, t, x, dt, |
8085ae13cc4a
ode23s.m: new function from former odepkg (bug #57309)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
diff
changeset
|
71 options = [], |
8085ae13cc4a
ode23s.m: new function from former odepkg (bug #57309)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
diff
changeset
|
72 k_vals = [], |
8085ae13cc4a
ode23s.m: new function from former odepkg (bug #57309)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
diff
changeset
|
73 t_next = t + dt) |
8085ae13cc4a
ode23s.m: new function from former odepkg (bug #57309)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
diff
changeset
|
74 |
8085ae13cc4a
ode23s.m: new function from former odepkg (bug #57309)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
diff
changeset
|
75 persistent d = 1 / (2 + sqrt (2)); |
8085ae13cc4a
ode23s.m: new function from former odepkg (bug #57309)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
diff
changeset
|
76 persistent a = 1 / 2; |
8085ae13cc4a
ode23s.m: new function from former odepkg (bug #57309)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
diff
changeset
|
77 persistent e32 = 6 + sqrt (2); |
8085ae13cc4a
ode23s.m: new function from former odepkg (bug #57309)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
diff
changeset
|
78 |
8085ae13cc4a
ode23s.m: new function from former odepkg (bug #57309)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
diff
changeset
|
79 ## extra arguments for function evaluator |
8085ae13cc4a
ode23s.m: new function from former odepkg (bug #57309)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
diff
changeset
|
80 if (! isempty (options)) |
8085ae13cc4a
ode23s.m: new function from former odepkg (bug #57309)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
diff
changeset
|
81 args = options.funarguments; |
8085ae13cc4a
ode23s.m: new function from former odepkg (bug #57309)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
diff
changeset
|
82 else |
8085ae13cc4a
ode23s.m: new function from former odepkg (bug #57309)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
diff
changeset
|
83 args = {}; |
8085ae13cc4a
ode23s.m: new function from former odepkg (bug #57309)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
diff
changeset
|
84 endif |
8085ae13cc4a
ode23s.m: new function from former odepkg (bug #57309)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
diff
changeset
|
85 |
8085ae13cc4a
ode23s.m: new function from former odepkg (bug #57309)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
diff
changeset
|
86 jacfun = false; |
8085ae13cc4a
ode23s.m: new function from former odepkg (bug #57309)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
diff
changeset
|
87 jacmat = false; |
8085ae13cc4a
ode23s.m: new function from former odepkg (bug #57309)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
diff
changeset
|
88 if (! isempty (options.Jacobian)) |
8085ae13cc4a
ode23s.m: new function from former odepkg (bug #57309)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
diff
changeset
|
89 if (ischar (options.Jacobian)) |
8085ae13cc4a
ode23s.m: new function from former odepkg (bug #57309)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
diff
changeset
|
90 jacfun = true; |
8085ae13cc4a
ode23s.m: new function from former odepkg (bug #57309)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
diff
changeset
|
91 jac = str2fun (options.Jacobian); |
8085ae13cc4a
ode23s.m: new function from former odepkg (bug #57309)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
diff
changeset
|
92 elseif (is_function_handle (options.Jacobian)) |
8085ae13cc4a
ode23s.m: new function from former odepkg (bug #57309)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
diff
changeset
|
93 jacfun = true; |
8085ae13cc4a
ode23s.m: new function from former odepkg (bug #57309)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
diff
changeset
|
94 jac = options.Jacobian; |
8085ae13cc4a
ode23s.m: new function from former odepkg (bug #57309)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
diff
changeset
|
95 elseif (ismatrix (options.Jacobian)) |
8085ae13cc4a
ode23s.m: new function from former odepkg (bug #57309)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
diff
changeset
|
96 jacmat = true; |
8085ae13cc4a
ode23s.m: new function from former odepkg (bug #57309)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
diff
changeset
|
97 jac = options.Jacobian; |
8085ae13cc4a
ode23s.m: new function from former odepkg (bug #57309)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
diff
changeset
|
98 else |
8085ae13cc4a
ode23s.m: new function from former odepkg (bug #57309)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
diff
changeset
|
99 error (["ode23s: the jacobian should be passed as a matrix, ", ... |
8085ae13cc4a
ode23s.m: new function from former odepkg (bug #57309)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
diff
changeset
|
100 "a string or a function handle"]) |
8085ae13cc4a
ode23s.m: new function from former odepkg (bug #57309)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
diff
changeset
|
101 endif |
8085ae13cc4a
ode23s.m: new function from former odepkg (bug #57309)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
diff
changeset
|
102 endif |
8085ae13cc4a
ode23s.m: new function from former odepkg (bug #57309)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
diff
changeset
|
103 |
8085ae13cc4a
ode23s.m: new function from former odepkg (bug #57309)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
diff
changeset
|
104 jacpat = false; |
8085ae13cc4a
ode23s.m: new function from former odepkg (bug #57309)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
diff
changeset
|
105 if (! isempty (options.JPattern)) |
8085ae13cc4a
ode23s.m: new function from former odepkg (bug #57309)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
diff
changeset
|
106 jacpat = true; |
8085ae13cc4a
ode23s.m: new function from former odepkg (bug #57309)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
diff
changeset
|
107 pattern = logical (options.JPattern); |
8085ae13cc4a
ode23s.m: new function from former odepkg (bug #57309)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
diff
changeset
|
108 endif |
8085ae13cc4a
ode23s.m: new function from former odepkg (bug #57309)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
diff
changeset
|
109 |
8085ae13cc4a
ode23s.m: new function from former odepkg (bug #57309)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
diff
changeset
|
110 ## Jacobian matrix, dfxpdp |
8085ae13cc4a
ode23s.m: new function from former odepkg (bug #57309)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
diff
changeset
|
111 if (jacmat) |
8085ae13cc4a
ode23s.m: new function from former odepkg (bug #57309)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
diff
changeset
|
112 J = jac; |
8085ae13cc4a
ode23s.m: new function from former odepkg (bug #57309)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
diff
changeset
|
113 elseif (jacfun) |
8085ae13cc4a
ode23s.m: new function from former odepkg (bug #57309)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
diff
changeset
|
114 J = jac (t, x); |
8085ae13cc4a
ode23s.m: new function from former odepkg (bug #57309)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
diff
changeset
|
115 elseif (! jacpat) |
8085ae13cc4a
ode23s.m: new function from former odepkg (bug #57309)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
diff
changeset
|
116 J = __dfxpdp__ (x, @(a) feval (fun, t, a, args{:}), options.RelTol); |
8085ae13cc4a
ode23s.m: new function from former odepkg (bug #57309)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
diff
changeset
|
117 elseif (jacpat) |
8085ae13cc4a
ode23s.m: new function from former odepkg (bug #57309)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
diff
changeset
|
118 J = __dfxpdp__ (x, @(a) feval (fun, t, a, args{:}), options.RelTol, pattern); |
8085ae13cc4a
ode23s.m: new function from former odepkg (bug #57309)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
diff
changeset
|
119 endif |
8085ae13cc4a
ode23s.m: new function from former odepkg (bug #57309)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
diff
changeset
|
120 |
8085ae13cc4a
ode23s.m: new function from former odepkg (bug #57309)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
diff
changeset
|
121 T = (feval (fun, t + .1 * dt, x) - feval (fun, t, x, args{:})) / (.1 * dt); |
8085ae13cc4a
ode23s.m: new function from former odepkg (bug #57309)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
diff
changeset
|
122 |
8085ae13cc4a
ode23s.m: new function from former odepkg (bug #57309)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
diff
changeset
|
123 ## Wolfbrandt coefficient |
8085ae13cc4a
ode23s.m: new function from former odepkg (bug #57309)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
diff
changeset
|
124 if (isempty (options.Mass)) |
8085ae13cc4a
ode23s.m: new function from former odepkg (bug #57309)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
diff
changeset
|
125 M = speye (length (x)); |
8085ae13cc4a
ode23s.m: new function from former odepkg (bug #57309)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
diff
changeset
|
126 else |
8085ae13cc4a
ode23s.m: new function from former odepkg (bug #57309)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
diff
changeset
|
127 M = options.Mass; |
8085ae13cc4a
ode23s.m: new function from former odepkg (bug #57309)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
diff
changeset
|
128 endif |
8085ae13cc4a
ode23s.m: new function from former odepkg (bug #57309)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
diff
changeset
|
129 W = M - dt*d*J; |
8085ae13cc4a
ode23s.m: new function from former odepkg (bug #57309)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
diff
changeset
|
130 |
28921
967cfcde2e35
maint: Use parentheses around conditional expressions.
Rik <rik@octave.org>
parents:
28308
diff
changeset
|
131 if (issparse (W)) |
28308
8085ae13cc4a
ode23s.m: new function from former odepkg (bug #57309)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
diff
changeset
|
132 [Lw, Uw, Pw, Qw, Rw] = lu (W); |
8085ae13cc4a
ode23s.m: new function from former odepkg (bug #57309)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
diff
changeset
|
133 else |
8085ae13cc4a
ode23s.m: new function from former odepkg (bug #57309)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
diff
changeset
|
134 [Lw, Uw, Pw] = lu (W); |
8085ae13cc4a
ode23s.m: new function from former odepkg (bug #57309)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
diff
changeset
|
135 endif |
8085ae13cc4a
ode23s.m: new function from former odepkg (bug #57309)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
diff
changeset
|
136 |
8085ae13cc4a
ode23s.m: new function from former odepkg (bug #57309)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
diff
changeset
|
137 ## compute the slopes |
8085ae13cc4a
ode23s.m: new function from former odepkg (bug #57309)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
diff
changeset
|
138 F(:,1) = feval (fun, t, x, args{:}); |
28921
967cfcde2e35
maint: Use parentheses around conditional expressions.
Rik <rik@octave.org>
parents:
28308
diff
changeset
|
139 if (issparse (W)) |
28308
8085ae13cc4a
ode23s.m: new function from former odepkg (bug #57309)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
diff
changeset
|
140 k(:,1) = Qw * (Uw \ (Lw \ (Pw * (Rw \ (F(:,1) + dt*d*T))))); |
8085ae13cc4a
ode23s.m: new function from former odepkg (bug #57309)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
diff
changeset
|
141 else |
8085ae13cc4a
ode23s.m: new function from former odepkg (bug #57309)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
diff
changeset
|
142 k(:,1) = Uw \ (Lw \ (Pw * (F(:,1) + dt*d*T))); |
8085ae13cc4a
ode23s.m: new function from former odepkg (bug #57309)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
diff
changeset
|
143 endif |
8085ae13cc4a
ode23s.m: new function from former odepkg (bug #57309)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
diff
changeset
|
144 F(:,2) = feval (fun, t+a*dt, x+a*dt*k(:,1), args{:}); |
28921
967cfcde2e35
maint: Use parentheses around conditional expressions.
Rik <rik@octave.org>
parents:
28308
diff
changeset
|
145 if (issparse (W)) |
28308
8085ae13cc4a
ode23s.m: new function from former odepkg (bug #57309)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
diff
changeset
|
146 k(:,2) = Uw * (Uw \ (Lw \ (Pw * (Rw \ (F(:,2) - M*k(:,1)))))) + k(:,1); |
8085ae13cc4a
ode23s.m: new function from former odepkg (bug #57309)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
diff
changeset
|
147 else |
8085ae13cc4a
ode23s.m: new function from former odepkg (bug #57309)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
diff
changeset
|
148 k(:,2) = Uw \ (Lw \ (Pw * (F(:,2) - M*k(:,1)))) + k(:,1); |
8085ae13cc4a
ode23s.m: new function from former odepkg (bug #57309)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
diff
changeset
|
149 endif |
8085ae13cc4a
ode23s.m: new function from former odepkg (bug #57309)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
diff
changeset
|
150 |
8085ae13cc4a
ode23s.m: new function from former odepkg (bug #57309)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
diff
changeset
|
151 ## compute the 2nd order estimate |
8085ae13cc4a
ode23s.m: new function from former odepkg (bug #57309)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
diff
changeset
|
152 x_next = x + dt*k(:,2); |
8085ae13cc4a
ode23s.m: new function from former odepkg (bug #57309)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
diff
changeset
|
153 |
8085ae13cc4a
ode23s.m: new function from former odepkg (bug #57309)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
diff
changeset
|
154 if (nargout >= 3) |
8085ae13cc4a
ode23s.m: new function from former odepkg (bug #57309)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
diff
changeset
|
155 ## 3rd order, needed in error formula |
8085ae13cc4a
ode23s.m: new function from former odepkg (bug #57309)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
diff
changeset
|
156 F(:,3) = feval (fun, t+dt, x_next, args{:}); |
28921
967cfcde2e35
maint: Use parentheses around conditional expressions.
Rik <rik@octave.org>
parents:
28308
diff
changeset
|
157 if (issparse (W)) |
28308
8085ae13cc4a
ode23s.m: new function from former odepkg (bug #57309)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
diff
changeset
|
158 k(:,3) = Qw * (Uw \ (Lw \ (Pw * (Rw \ (F(:,3) - e32 * (M*k(:,2) - F(:,2)) - 2 * (M*k(:,1) - F(:,1)) + dt*d*T))))); |
8085ae13cc4a
ode23s.m: new function from former odepkg (bug #57309)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
diff
changeset
|
159 else |
8085ae13cc4a
ode23s.m: new function from former odepkg (bug #57309)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
diff
changeset
|
160 k(:,3) = Uw \ (Lw \ (Pw * (F(:,3) - e32 * (M*k(:,2) - F(:,2)) - 2 * (M*k(:,1) - F(:,1)) + dt*d*T))); |
8085ae13cc4a
ode23s.m: new function from former odepkg (bug #57309)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
diff
changeset
|
161 endif |
8085ae13cc4a
ode23s.m: new function from former odepkg (bug #57309)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
diff
changeset
|
162 |
8085ae13cc4a
ode23s.m: new function from former odepkg (bug #57309)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
diff
changeset
|
163 ## estimate the error |
8085ae13cc4a
ode23s.m: new function from former odepkg (bug #57309)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
diff
changeset
|
164 err_est = (dt/6) * (k(:,1) - 2*k(:,2) + k(:,3)); |
8085ae13cc4a
ode23s.m: new function from former odepkg (bug #57309)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
diff
changeset
|
165 |
8085ae13cc4a
ode23s.m: new function from former odepkg (bug #57309)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
diff
changeset
|
166 ## FIXME: to use in AbsRel_Norm function I need x_est and not err directly |
8085ae13cc4a
ode23s.m: new function from former odepkg (bug #57309)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
diff
changeset
|
167 x_est = x_next + err_est; |
8085ae13cc4a
ode23s.m: new function from former odepkg (bug #57309)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
diff
changeset
|
168 endif |
8085ae13cc4a
ode23s.m: new function from former odepkg (bug #57309)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
diff
changeset
|
169 |
8085ae13cc4a
ode23s.m: new function from former odepkg (bug #57309)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
diff
changeset
|
170 endfunction |
8085ae13cc4a
ode23s.m: new function from former odepkg (bug #57309)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
diff
changeset
|
171 |
8085ae13cc4a
ode23s.m: new function from former odepkg (bug #57309)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
diff
changeset
|
172 |
8085ae13cc4a
ode23s.m: new function from former odepkg (bug #57309)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
diff
changeset
|
173 function prt = __dfxpdp__ (p, func, rtol, pattern) |
8085ae13cc4a
ode23s.m: new function from former odepkg (bug #57309)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
diff
changeset
|
174 |
8085ae13cc4a
ode23s.m: new function from former odepkg (bug #57309)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
diff
changeset
|
175 ## This subfunction was copied 2011 from the OF "optim" package |
8085ae13cc4a
ode23s.m: new function from former odepkg (bug #57309)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
diff
changeset
|
176 ## "inst/private/__dfdp__.m". |
8085ae13cc4a
ode23s.m: new function from former odepkg (bug #57309)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
diff
changeset
|
177 |
8085ae13cc4a
ode23s.m: new function from former odepkg (bug #57309)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
diff
changeset
|
178 f = func (p)(:); |
8085ae13cc4a
ode23s.m: new function from former odepkg (bug #57309)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
diff
changeset
|
179 m = numel (f); |
8085ae13cc4a
ode23s.m: new function from former odepkg (bug #57309)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
diff
changeset
|
180 n = numel (p); |
8085ae13cc4a
ode23s.m: new function from former odepkg (bug #57309)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
diff
changeset
|
181 |
8085ae13cc4a
ode23s.m: new function from former odepkg (bug #57309)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
diff
changeset
|
182 diffp = rtol .* ones (n, 1); |
8085ae13cc4a
ode23s.m: new function from former odepkg (bug #57309)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
diff
changeset
|
183 |
8085ae13cc4a
ode23s.m: new function from former odepkg (bug #57309)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
diff
changeset
|
184 del = ifelse (p == 0, diffp, diffp .* p); |
8085ae13cc4a
ode23s.m: new function from former odepkg (bug #57309)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
diff
changeset
|
185 absdel = abs (del); |
8085ae13cc4a
ode23s.m: new function from former odepkg (bug #57309)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
diff
changeset
|
186 |
8085ae13cc4a
ode23s.m: new function from former odepkg (bug #57309)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
diff
changeset
|
187 ## double sided interval |
8085ae13cc4a
ode23s.m: new function from former odepkg (bug #57309)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
diff
changeset
|
188 p1 = p + absdel / 2; |
8085ae13cc4a
ode23s.m: new function from former odepkg (bug #57309)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
diff
changeset
|
189 p2 = p - absdel / 2; |
8085ae13cc4a
ode23s.m: new function from former odepkg (bug #57309)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
diff
changeset
|
190 |
8085ae13cc4a
ode23s.m: new function from former odepkg (bug #57309)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
diff
changeset
|
191 ps = p; |
8085ae13cc4a
ode23s.m: new function from former odepkg (bug #57309)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
diff
changeset
|
192 if (nargin > 3 && issparse (pattern)) |
8085ae13cc4a
ode23s.m: new function from former odepkg (bug #57309)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
diff
changeset
|
193 prt = pattern; # initialize Jacobian |
8085ae13cc4a
ode23s.m: new function from former odepkg (bug #57309)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
diff
changeset
|
194 for j = find (any (pattern, 1)) |
8085ae13cc4a
ode23s.m: new function from former odepkg (bug #57309)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
diff
changeset
|
195 ps(j) = p1(j); |
8085ae13cc4a
ode23s.m: new function from former odepkg (bug #57309)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
diff
changeset
|
196 tp1 = func (ps); |
8085ae13cc4a
ode23s.m: new function from former odepkg (bug #57309)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
diff
changeset
|
197 ps(j) = p2(j); |
8085ae13cc4a
ode23s.m: new function from former odepkg (bug #57309)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
diff
changeset
|
198 tp2 = func (ps); |
8085ae13cc4a
ode23s.m: new function from former odepkg (bug #57309)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
diff
changeset
|
199 pattern_nnz = find (pattern(:, j)); |
8085ae13cc4a
ode23s.m: new function from former odepkg (bug #57309)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
diff
changeset
|
200 prt(pattern_nnz, j) = (tp1(pattern_nnz) - tp2(pattern_nnz)) / absdel(j); |
8085ae13cc4a
ode23s.m: new function from former odepkg (bug #57309)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
diff
changeset
|
201 ps(j) = p(j); |
8085ae13cc4a
ode23s.m: new function from former odepkg (bug #57309)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
diff
changeset
|
202 endfor |
8085ae13cc4a
ode23s.m: new function from former odepkg (bug #57309)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
diff
changeset
|
203 else |
8085ae13cc4a
ode23s.m: new function from former odepkg (bug #57309)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
diff
changeset
|
204 prt = zeros (m, n); # initialize Jacobian |
8085ae13cc4a
ode23s.m: new function from former odepkg (bug #57309)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
diff
changeset
|
205 for j = 1:n |
8085ae13cc4a
ode23s.m: new function from former odepkg (bug #57309)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
diff
changeset
|
206 ps(j) = p1(j); |
8085ae13cc4a
ode23s.m: new function from former odepkg (bug #57309)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
diff
changeset
|
207 tp1 = func (ps); |
8085ae13cc4a
ode23s.m: new function from former odepkg (bug #57309)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
diff
changeset
|
208 ps(j) = p2(j); |
8085ae13cc4a
ode23s.m: new function from former odepkg (bug #57309)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
diff
changeset
|
209 tp2 = func (ps); |
8085ae13cc4a
ode23s.m: new function from former odepkg (bug #57309)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
diff
changeset
|
210 prt(:, j) = (tp1(:) - tp2(:)) / absdel(j); |
8085ae13cc4a
ode23s.m: new function from former odepkg (bug #57309)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
diff
changeset
|
211 ps(j) = p(j); |
8085ae13cc4a
ode23s.m: new function from former odepkg (bug #57309)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
diff
changeset
|
212 endfor |
8085ae13cc4a
ode23s.m: new function from former odepkg (bug #57309)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
diff
changeset
|
213 endif |
8085ae13cc4a
ode23s.m: new function from former odepkg (bug #57309)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
diff
changeset
|
214 |
8085ae13cc4a
ode23s.m: new function from former odepkg (bug #57309)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
diff
changeset
|
215 endfunction |