Mercurial > octave
diff scripts/ode/private/runge_kutta_45_dorpri.m @ 20621:b92f8e148936
maint: Continued clean-up of functions in ode/private dir.
* AbsRel_Norm.m: Use retval as return variable. Use sumsq() rather than explicit
squaring of vector and sum(). Combine multiple lines where possible.
* integrate_adaptive.m: Rewrite docstring. Only call starting_stepsize() if
InitialStep option is empty.
* integrate_const.m: Rewrite docstring. Remove useless commented out code.
Combine multiple lines where possible.
* integrate_n_steps.m: Rewrite docstring. Remove useless commented out code.
Combine multiple lines where possible.
* kahan.m: Remove excessive 4-space indentation, use 2-space indentation.
* ode_rk_interpolate.m: Use parentheses around condition for switch stmt.
Combine multiple lines where possible.
* ode_struct_value_check.m: Remove comma from Copyright statement that Octave
doesn't use.
* odepkg_event_handle.m: Remove comma from Copyright statement that Octave
doesn't use.
* odepkg_structure_check.m: Remove comma from Copyright statement that Octave
doesn't use.
* runge_kutta_45_dorpri.m: Remove comma from Copyright statement that Octave
doesn't use. Improve docstring. Match variable names in documentation to
those in code.
* starting_stepsize.m: Rewrite docstring. Use spaces between function name
and opening parenthesis.
author | Rik <rik@octave.org> |
---|---|
date | Wed, 14 Oct 2015 10:35:53 -0700 |
parents | a22d8a2eb0e5 |
children | 80e630b37ba1 |
line wrap: on
line diff
--- a/scripts/ode/private/runge_kutta_45_dorpri.m Wed Oct 14 09:25:04 2015 -0700 +++ b/scripts/ode/private/runge_kutta_45_dorpri.m Wed Oct 14 10:35:53 2015 -0700 @@ -1,5 +1,5 @@ -## Copyright (C) 2015, Carlo de Falco -## Copyright (C) 2013, Roberto Porcu' <roberto.porcu@polimi.it> +## Copyright (C) 2015 Carlo de Falco +## Copyright (C) 2013 Roberto Porcu' <roberto.porcu@polimi.it> ## ## This file is part of Octave. ## @@ -23,7 +23,7 @@ ## @deftypefnx {Function File} {[@var{t_next}, @var{x_next}, @var{x_est}, @var{k_vals_out}] =} runge_kutta_45_dorpri (@var{@@fun}, @var{t}, @var{x}, @var{dt}, @var{options}, @var{k_vals_in}) ## ## This function can be used to integrate a system of ODEs with a given initial -## condition @var{x} from @var{t} to @var{t+dt}, with the Dormand-Prince method. +## condition @var{x} from @var{t} to @var{t+dt} with the Dormand-Prince method. ## For the definition of this method see ## @url{http://en.wikipedia.org/wiki/Dormand%E2%80%93Prince_method}. ## @@ -36,7 +36,7 @@ ## error. ## ## Fourth output parameter is matrix containing the Runge-Kutta evaluations -## to use in a FSAL scheme or for dense output. +## to use in an FSAL scheme or for dense output. ## ## First input argument is the function describing the system of ODEs to be ## integrated. @@ -52,14 +52,15 @@ ## adapt the computation to what is needed. ## ## Sixth input parameter is optional and describes the Runge-Kutta evaluations -## of the previous step to use in a FSAL scheme. +## of the previous step to use in an FSAL scheme. ## @end deftypefn ## ## @seealso{odepkg} -function [t_out, x_out, x_est, k] = ... - runge_kutta_45_dorpri (f, t, x, dt, opts = [], k_vals = [], - t_out = t + dt) +function [t_next, x_next, x_est, k] = runge_kutta_45_dorpri (f, t, x, dt, + options = [], + k_vals = [], + t_next = t + dt) persistent a = [0 0 0 0 0 0; 1/5 0 0 0 0 0; @@ -70,43 +71,43 @@ 35/384 0 500/1113 125/192 -2187/6784 11/84]; persistent b = [0 1/5 3/10 4/5 8/9 1 1]; persistent c = [(35/384) 0 (500/1113) (125/192) (-2187/6784) (11/84)]; - ## x_est according to Shampine 1986: + persistent c_prime = [(5179/57600) 0 (7571/16695) (393/640), ... + (-92097/339200) (187/2100) (1/40)]; + ## According to Shampine 1986: ## persistent c_prime = [(1951/21600) 0 (22642/50085) (451/720), ... ## (-12231/42400) (649/6300) (1/60)]; - persistent c_prime = [(5179/57600) 0 (7571/16695) (393/640), ... - (-92097/339200) (187/2100) (1/40)]; s = t + dt * b; cc = dt * c; aa = dt * a; k = zeros (rows (x), 7); - if (! isempty (opts)) # extra arguments for function evaluator - args = opts.vfunarguments; + if (! isempty (options)) # extra arguments for function evaluator + args = options.vfunarguments; else args = {}; endif - if (! isempty (k_vals)) # k values from previous step are passed + if (! isempty (k_vals)) # k values from previous step are passed k(:,1) = k_vals(:,end); # FSAL property else k(:,1) = feval (f, t, x, args{:}); endif - k(:,2) = feval (f, s(2), x + k(:,1) * aa(2, 1).', args{:}); + k(:,2) = feval (f, s(2), x + k(:,1) * aa(2, 1).' , args{:}); k(:,3) = feval (f, s(3), x + k(:,1:2) * aa(3, 1:2).', args{:}); k(:,4) = feval (f, s(4), x + k(:,1:3) * aa(4, 1:3).', args{:}); k(:,5) = feval (f, s(5), x + k(:,1:4) * aa(5, 1:4).', args{:}); k(:,6) = feval (f, s(6), x + k(:,1:5) * aa(6, 1:5).', args{:}); ## compute new time and new values for the unknowns - ## t_out = t + dt; - x_out = x + k(:,1:6) * cc(:); # 5th order approximation + ## t_next = t + dt; + x_next = x + k(:,1:6) * cc(:); # 5th order approximation ## if the estimation of the error is required if (nargout >= 3) ## new solution to be compared with the previous one - k(:,7) = feval (f, t_out, x_out, args{:}); + k(:,7) = feval (f, t_next, x_next, args{:}); cc_prime = dt * c_prime; x_est = x + k * cc_prime(:); endif