From: <tr...@us...> - 2007-11-09 16:35:13
|
Revision: 4191 http://octave.svn.sourceforge.net/octave/?rev=4191&view=rev Author: treichl Date: 2007-11-09 08:35:11 -0800 (Fri, 09 Nov 2007) Log Message: ----------- More testsuite functions for IDE solvers. Modified Paths: -------------- trunk/octave-forge/main/odepkg/inst/odepkg_testsuite_implrober.m Added Paths: ----------- trunk/octave-forge/main/odepkg/inst/odepkg_testsuite_implakzo.m Added: trunk/octave-forge/main/odepkg/inst/odepkg_testsuite_implakzo.m =================================================================== --- trunk/octave-forge/main/odepkg/inst/odepkg_testsuite_implakzo.m (rev 0) +++ trunk/octave-forge/main/odepkg/inst/odepkg_testsuite_implakzo.m 2007-11-09 16:35:11 UTC (rev 4191) @@ -0,0 +1,194 @@ +%# Copyright (C) 2007, Thomas Treichl <tr...@us...> +%# OdePkg - Package for solving ordinary differential equations with octave +%# +%# This program is free software; you can redistribute it and/or modify +%# it under the terms of the GNU General Public License as published by +%# the Free Software Foundation; either version 2 of the License, or +%# (at your option) any later version. +%# +%# This program is distributed in the hope that it will be useful, +%# but WITHOUT ANY WARRANTY; without even the implied warranty of +%# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +%# GNU General Public License for more details. +%# +%# You should have received a copy of the GNU General Public License +%# along with this program; if not, write to the Free Software +%# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +%# -*- texinfo -*- +%# @deftypefn {Function File} {[@var{solution}] =} odepkg_testsuite_implakzo (@var{@@solver}, @var{reltol}) +%# +%# If this function is called with two input arguments and the first input argument @var{@@solver} is a function handle describing an OdePkg solver and the second input argument @var{reltol} is a double scalar describing the relative error tolerance then return a cell array @var{solution} with performance informations about the chemical AKZO Nobel testsuite of implicit differential algebraic equations after solving (IDE--test). +%# +%# Run examples with the command +%# @example +%# demo odepkg_testsuite_implakzo +%# @end example +%# @end deftypefn +%# +%# @seealso{odepkg} + +function vret = odepkg_testsuite_implakzo (vhandle, vrtol) + + if (nargin ~= 2) %# Check number and types of all input arguments + help ('odepkg_testsuite_implakzo'); + error ('OdePkg:InvalidInputArgument', ... + 'Number of input arguments must be exactly two'); + elseif (~isa (vhandle, 'function_handle') || ~isscalar (vrtol)) + print_usage; + end + + vret{1} = vhandle; %# The handle for the solver that is used + vret{2} = vrtol; %# The value for the realtive tolerance + vret{3} = vret{2}; %# The value for the absolute tolerance + vret{4} = vret{2}; %# The value for the first time step + %# Write a debug message on the screen, because this testsuite function + %# may be called more than once from a loop over all solvers present + fprintf (1, ['Testsuite AKZO, testing solver %7s with relative', ... + ' tolerance %2.0e\n'], func2str (vret{1}), vrtol); fflush (1); + + %# Setting the integration algorithms option values + vstart = 0.0; %# The point of time when solving is started + vstop = 180.0; %# The point of time when solving is stoped + [vinity, vinityd] = odepkg_testsuite_implakzoinit; %# The initial values + + vopt = odeset ('Refine', 0, 'RelTol', vret{2}, 'AbsTol', vret{3}, ... + 'InitialStep', vret{4}, 'Stats', 'on', 'NormControl', 'off', ... + 'Jacobian', @odepkg_testsuite_implakzojac, 'MaxStep', vstop-vstart); + %# 'OutputFcn', @odeplot); + + %# Calculate the algorithm, start timer and do solving + tic; vsol = feval (vhandle, @odepkg_testsuite_implakzofun, ... + [vstart, vstop], vinity, vinityd', vopt); + vret{12} = toc; %# The value for the elapsed time + vref = odepkg_testsuite_implakzoref; %# Get the reference solution vector + if (max (size (vsol.y(end,:))) == max (size (vref))), vlst = vsol.y(end,:); + elseif (max (size (vsol.y(:,end))) == max (size (vref))), vlst = vsol.y(:,end); + end + vret{5} = odepkg_testsuite_calcmescd (vlst, vref, vret{3}, vret{2}); + vret{6} = odepkg_testsuite_calcscd (vlst, vref, vret{3}, vret{2}); +%# vret{7} = vsol.stats.success + vsol.stats.failed; %# The value for all evals +%# vret{8} = vsol.stats.success; %# The value for success evals +%# vret{9} = vsol.stats.fevals; %# The value for fun calls +%# vret{10} = vsol.stats.partial; %# The value for partial derivations +%# vret{11} = vsol.stats.ludecom; %# The value for LU decompositions + vret{7} = vsol.stats.nsteps + vsol.stats.nfailed; %# The value for all evals + vret{8} = vsol.stats.nsteps; %# The value for success evals + vret{9} = vsol.stats.nfevals; %# The value for fun calls + vret{10} = vsol.stats.nsolves; %# The value for partial derivations + vret{11} = vsol.stats.ndecomps; %# The value for LU decompositions + +%# Return the results for the for the chemical AKZO problem +function res = odepkg_testsuite_implakzofun (t, y, yd, varargin) + k1 = 18.7; k2 = 0.58; k3 = 0.09; k4 = 0.42; + kbig = 34.4; kla = 3.3; ks = 115.83; po2 = 0.9; + hen = 737; + + r1 = k1 * y(1)^4 * sqrt (y(2)); + r2 = k2 * y(3) * y(4); + r3 = k2 / kbig * y(1) * y(5); + r4 = k3 * y(1) * y(4)^2; + r5 = k4 * y(6)^2 * sqrt (y(2)); + fin = kla * (po2 / hen - y(2)); + + res(1,1) = -2 * r1 + r2 - r3 - r4 - yd(1); + res(2,1) = -0.5 * r1 - r4 - 0.5 * r5 + fin - yd(2); + res(3,1) = r1 - r2 + r3 - yd(3); + res(4,1) = - r2 + r3 - 2 * r4 - yd(4); + res(5,1) = r2 - r3 + r5 - yd(5); + res(6,1) = ks * y(1) * y(4) - y(6) - yd(6); + +%# Return the INITIAL values for the chemical AKZO problem +function [y0, yd0] = odepkg_testsuite_implakzoinit () + y0 = [0.444, 0.00123, 0, 0.007, 0, 115.83 * 0.444 * 0.007]; + yd0 = [-0.051, -0.014, 0.025, 0, 0.002, 0]; + +%# Return the JACOBIAN matrix for the chemical AKZO problem +function [dfdy, dfdyd] = odepkg_testsuite_implakzojac (t, y, varargin) + k1 = 18.7; k2 = 0.58; k3 = 0.09; k4 = 0.42; + kbig = 34.4; kla = 3.3; ks = 115.83; po2 = 0.9; + hen = 737; + +%# if (y(2) <= 0) +%# error ('odepkg_testsuite_implakzojac: Second input argument is negative'); +%# end + + dfdy = zeros (6, 6); + + r11 = 4 * k1 * y(1)^3 * sqrt (y(2)); + r12 = 0.5 * k1 * y(1)^4 / sqrt (y(2)); + r23 = k2 * y(4); + r24 = k2 * y(3); + r31 = (k2 / kbig) * y(5); + r35 = (k2 / kbig) * y(1); + r41 = k3 * y(4)^2; + r44 = 2 * k3 * y(1) * y(4); + r52 = 0.5 * k4 * y(6)^2 / sqrt (y(2)); + r56 = 2 * k4 * y(6) * sqrt (y(2)); + fin2 = -kla; + + dfdy(1,1) = -2 * r11 - r31 - r41; + dfdy(1,2) = -2 * r12; + dfdy(1,3) = r23; + dfdy(1,4) = r24 - r44; + dfdy(1,5) = -r35; + dfdy(2,1) = -0.5 * r11 - r41; + dfdy(2,2) = -0.5 * r12 - 0.5 * r52 + fin2; + dfdy(2,4) = -r44; + dfdy(2,6) = -0.5 * r56; + dfdy(3,1) = r11 + r31; + dfdy(3,2) = r12; + dfdy(3,3) = -r23; + dfdy(3,4) = -r24; + dfdy(3,5) = r35; + dfdy(4,1) = r31 - 2 * r41; + dfdy(4,3) = -r23; + dfdy(4,4) = -r24 - 2 * r44; + dfdy(4,5) = r35; + dfdy(5,1) = -r31; + dfdy(5,2) = r52; + dfdy(5,3) = r23; + dfdy(5,4) = r24; + dfdy(5,5) = -r35; + dfdy(5,6) = r56; + dfdy(6,1) = ks * y(4); + dfdy(6,4) = ks * y(1); + dfdy(6,6) = -1; + + dfdyd = - [ 1, 0, 0, 0, 0, 0; + 0, 1, 0, 0, 0, 0; + 0, 0, 1, 0, 0, 0; + 0, 0, 0, 1, 0, 0; + 0, 0, 0, 0, 1, 0; + 0, 0, 0, 0, 0, 1 ]; + +%# For the implicit form of the chemical AKZO Nobel problem a mass +%# matrix is not needed. This mass matrix is needed if the problem +%# is formulated in explicit form (cf. odepkg_testsuite_cemakzo.m). +%# function mass = odepkg_testsuite_implakzomass (t, y, varargin) +%# mass = [ 1, 0, 0, 0, 0, 0; +%# 0, 1, 0, 0, 0, 0; +%# 0, 0, 1, 0, 0, 0; +%# 0, 0, 0, 1, 0, 0; +%# 0, 0, 0, 0, 1, 0; +%# 0, 0, 0, 0, 0, 0 ]; + +%# Return the REFERENCE values for the chemical AKZO problem +function y = odepkg_testsuite_implakzoref () + y(1,1) = 0.11507949206617e+0; + y(2,1) = 0.12038314715677e-2; + y(3,1) = 0.16115628874079e+0; + y(4,1) = 0.36561564212492e-3; + y(5,1) = 0.17080108852644e-1; + y(6,1) = 0.48735313103074e-2; + +%!demo +%! vsolver = {@odebdi}; +%! for vcnt=1:length (vsolver) +%! vakzo{vcnt,1} = odepkg_testsuite_implakzo (vsolver{vcnt}, 1e-7); +%! end +%! vakzo + +%# Local Variables: *** +%# mode: octave *** +%# End: *** Modified: trunk/octave-forge/main/odepkg/inst/odepkg_testsuite_implrober.m =================================================================== --- trunk/octave-forge/main/odepkg/inst/odepkg_testsuite_implrober.m 2007-11-09 16:18:33 UTC (rev 4190) +++ trunk/octave-forge/main/odepkg/inst/odepkg_testsuite_implrober.m 2007-11-09 16:35:11 UTC (rev 4191) @@ -1,143 +1,139 @@ -%# Copyright (C) 2006, Thomas Treichl <tr...@us...> -%# OdePkg - Package for solving ordinary differential equations with octave -%# -%# This program is free software; you can redistribute it and/or modify -%# it under the terms of the GNU General Public License as published by -%# the Free Software Foundation; either version 2 of the License, or -%# (at your option) any later version. -%# -%# This program is distributed in the hope that it will be useful, -%# but WITHOUT ANY WARRANTY; without even the implied warranty of -%# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -%# GNU General Public License for more details. -%# -%# You should have received a copy of the GNU General Public License -%# along with this program; if not, write to the Free Software -%# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - -%# -*- texinfo -*- -%# @deftypefn {Function File} {[@var{solution}] =} odepkg_testsuite_implrober (@var{@@solver}, @var{reltol}) -%# -%# If this function is called with two input arguments and the first input argument @var{@@solver} is a function handle describing an OdePkg solver and the second input argument @var{reltol} is a double scalar describing the relative error tolerance then return a cell array @var{solution} with performance informations about the implicit form of the modified ROBERTSON testsuite of implicit differential algebraic equations after solving (IDE--test). -%# -%# Run examples with the command -%# @example -%# demo odepkg_testsuite_implrober -%# @end example -%# @end deftypefn -%# -%# @seealso{odepkg} - -function vret = odepkg_testsuite_implrober (vhandle, vrtol) - - %# Check number and types of all input arguments - if (nargin ~= 2) - help ('odepkg_testsuite_implrober'); - error ('OdePkg:odepkg_testsuite_implrober:InvalidInputArgument', ... - 'Number of input arguments must be exactly two'); - elseif (~isa (vhandle, 'function_handle') || ~isscalar (vrtol)) - usage ('odepkg_testsuite_implrober (@solver, reltol)'); - end - - vret{1} = vhandle; %# The name for the solver that is used - vret{2} = vrtol; %# The value for the realtive tolerance - vret{3} = vret{2} * 1e-2; %# The value for the absolute tolerance - vret{4} = vret{2}; %# The value for the first time step - %# Write a debug message on the screen, because this testsuite function - %# may be called more than once from a loop over all present solvers - fprintf (1, ['Testsuite implicit ROBERTSON, testing solver %7s with relative', ... - ' tolerance %2.0e\n'], func2str (vret{1}), vrtol); fflush (1); - - %# Setting the integration algorithm options - vstart = 0; %# The point of time when solving is started - vstop = 1e11; %# The point of time when solving is stoped - [vinity, vinityd] = odepkg_testsuite_implroberinit; %# The initial values - %# Cf. note for mass matrix below at commented out function definition - %# vmass = odepkg_testsuite_implrobermass; %# The mass matrix - - vopt = odeset ('Refine', 0, 'RelTol', vret{2}, 'AbsTol', vret{3}, ... - 'InitialStep', vret{4}, 'Stats', 'on', 'NormControl', 'off', ... - 'Jacobian', @odepkg_testsuite_implroberjac, ... %# 'Mass', vmass - 'MaxStep', vstop-vstart); - - %# Calculate the algorithm, start timer and do solving - tic; vsol = feval (vhandle, @odepkg_testsuite_implroberfun, ... - [vstart, vstop], vinity, vinityd', vopt); - vsol.x(end) - vsol.y(:,end) - vret{12} = toc; %# The value for the elapsed time - vref = odepkg_testsuite_implroberref; %# Get the reference solution vector - if (max (size (vsol.y(end,:))) == max (size (vref))), vlst = vsol.y(end,:); - elseif (max (size (vsol.y(:,end))) == max (size (vref))), vlst = vsol.y(:,end); - end - vret{5} = odepkg_testsuite_calcmescd (vlst, vref, vret{3}, vret{2}); - vret{6} = odepkg_testsuite_calcscd (vlst, vref, vret{3}, vret{2}); - %# vret{7} = vsol.stats.success + vsol.stats.failed; %# The value for all evals - %# vret{8} = vsol.stats.success; %# The value for success evals - %# vret{9} = vsol.stats.fevals; %# The value for fun calls - %# vret{10} = vsol.stats.partial; %# The value for partial derivations - %# vret{11} = vsol.stats.ludecom; %# The value for LU decompositions - vret{7} = vsol.stats.nsteps + vsol.stats.nfailed; %# The value for all evals - vret{8} = vsol.stats.nsteps; %# The value for success evals - vret{9} = vsol.stats.nfevals; %# The value for fun calls - vret{10} = vsol.stats.nsolves; %# The value for partial derivations - vret{11} = vsol.stats.ndecomps; %# The value for LU decompositions - -%#function odepkg_testsuite_implrober () -%# A = odeset ('RelTol', 1e-4, ... %# MATLAB ode15i needs 1e-6 to be stable -%# 'AbsTol', [1e-6, 1e-10, 1e-6], ... -%# 'Jacobian', @odepkg_testsuite_implroberjac); -%# [y0, yd0] = odepkg_testsuite_implroberinit; -%# ode15i (@odepkg_testsuite_implroberfun, [0, 1e11], y0, yd0', A) -%# [y0, yd0] = odepkg_testsuite_implroberinit; -%# ode15i (@odepkg_testsuite_implroberfun, [0, 1e11], y0, yd0') - -%# Returns the results for the for the implicit ROBERTSON problem -function res = odepkg_testsuite_implroberfun (t, y, yd, varargin) - res(1,1) = -0.04 * y(1) + 1e4 * y(2) * y(3) - yd(1); - res(2,1) = 0.04 * y(1) - 1e4 * y(2) * y(3) - 3e7 * y(2)^2 - yd(2); - res(3,1) = y(1) + y(2) + y(3) - 1; - -%# Returns the INITIAL values for the implicit ROBERTSON problem -function [y0, yd0] = odepkg_testsuite_implroberinit () - y0 = [1, 0, 0]; - yd0 = [-4e-2, 4e-2, 0]; - -%# Returns the JACOBIAN matrix for the implicit ROBERTSON problem -function [dfdy, dfdyd] = odepkg_testsuite_implroberjac (t, y, yd, varargin) - dfdy(1,1) = -0.04; - dfdy(1,2) = 1e4 * y(3); - dfdy(1,3) = 1e4 * y(2); - dfdy(2,1) = 0.04; - dfdy(2,2) = -1e4 * y(3) - 6e7 * y(2); - dfdy(2,3) = -1e4 * y(2); - dfdy(3,1) = 1; - dfdy(3,2) = 1; - dfdy(3,3) = 1; - - dfdyd(1,1) = -1; - dfdyd(2,2) = -1; - dfdyd(3,3) = 0; - -%# For the implicit form of the Robertson problem a mass matrix is not -%# allowed. This mass matrix is only needed if the Robertson problem -%# is formulated in explicit form (cf. odepkg_testsuite_implrober.m). -%# function mass = odepkg_testsuite_implrobermass (t, y, varargin) -%# mass = [1, 0, 0; 0, 1, 0; 0, 0, 0]; - -%# Returns the REFERENCE values for the implicit ROBERTSON problem -function y = odepkg_testsuite_implroberref () - y(1) = 0.20833401497012e-07; - y(2) = 0.83333607703347e-13; - y(3) = 0.99999997916650e+00; - -%!demo -%! vsolver = {@odebdi}; -%! for vcnt=1:length (vsolver) -%! virob{vcnt,1} = odepkg_testsuite_implrober (vsolver{vcnt}, 1e-7); -%! end -%! virob - -%# Local Variables: *** -%# mode: octave *** -%# End: *** +%# Copyright (C) 2006, Thomas Treichl <tr...@us...> +%# OdePkg - Package for solving ordinary differential equations with octave +%# +%# This program is free software; you can redistribute it and/or modify +%# it under the terms of the GNU General Public License as published by +%# the Free Software Foundation; either version 2 of the License, or +%# (at your option) any later version. +%# +%# This program is distributed in the hope that it will be useful, +%# but WITHOUT ANY WARRANTY; without even the implied warranty of +%# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +%# GNU General Public License for more details. +%# +%# You should have received a copy of the GNU General Public License +%# along with this program; if not, write to the Free Software +%# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +%# -*- texinfo -*- +%# @deftypefn {Function File} {[@var{solution}] =} odepkg_testsuite_implrober (@var{@@solver}, @var{reltol}) +%# +%# If this function is called with two input arguments and the first input argument @var{@@solver} is a function handle describing an OdePkg solver and the second input argument @var{reltol} is a double scalar describing the relative error tolerance then return a cell array @var{solution} with performance informations about the implicit form of the modified ROBERTSON testsuite of implicit differential algebraic equations after solving (IDE--test). +%# +%# Run examples with the command +%# @example +%# demo odepkg_testsuite_implrober +%# @end example +%# @end deftypefn +%# +%# @seealso{odepkg} + +function vret = odepkg_testsuite_implrober (vhandle, vrtol) + + %# Check number and types of all input arguments + if (nargin ~= 2) + help ('odepkg_testsuite_implrober'); + error ('OdePkg:InvalidInputArgument', ... + 'Number of input arguments must be exactly two'); + elseif (~isa (vhandle, 'function_handle') || ~isscalar (vrtol)) + print_usage; + end + + vret{1} = vhandle; %# The name for the solver that is used + vret{2} = vrtol; %# The value for the realtive tolerance + vret{3} = vret{2} * 1e-2; %# The value for the absolute tolerance + vret{4} = vret{2}; %# The value for the first time step + %# Write a debug message on the screen, because this testsuite function + %# may be called more than once from a loop over all present solvers + fprintf (1, ['Testsuite implicit ROBERTSON, testing solver %7s with relative', ... + ' tolerance %2.0e\n'], func2str (vret{1}), vrtol); fflush (1); + + %# Setting the integration algorithm options + vstart = 0; %# The point of time when solving is started + vstop = 1e11; %# The point of time when solving is stoped + [vinity, vinityd] = odepkg_testsuite_implroberinit; %# The initial values + + vopt = odeset ('Refine', 0, 'RelTol', vret{2}, 'AbsTol', vret{3}, ... + 'InitialStep', vret{4}, 'Stats', 'on', 'NormControl', 'off', ... + 'Jacobian', @odepkg_testsuite_implroberjac, 'MaxStep', vstop-vstart); + %# 'OutputFcn', @odeplot); + + %# Calculate the algorithm, start timer and do solving + tic; vsol = feval (vhandle, @odepkg_testsuite_implroberfun, ... + [vstart, vstop], vinity, vinityd', vopt); + vret{12} = toc; %# The value for the elapsed time + vref = odepkg_testsuite_implroberref; %# Get the reference solution vector + if (max (size (vsol.y(end,:))) == max (size (vref))), vlst = vsol.y(end,:); + elseif (max (size (vsol.y(:,end))) == max (size (vref))), vlst = vsol.y(:,end); + end + vret{5} = odepkg_testsuite_calcmescd (vlst, vref, vret{3}, vret{2}); + vret{6} = odepkg_testsuite_calcscd (vlst, vref, vret{3}, vret{2}); + %# vret{7} = vsol.stats.success + vsol.stats.failed; %# The value for all evals + %# vret{8} = vsol.stats.success; %# The value for success evals + %# vret{9} = vsol.stats.fevals; %# The value for fun calls + %# vret{10} = vsol.stats.partial; %# The value for partial derivations + %# vret{11} = vsol.stats.ludecom; %# The value for LU decompositions + vret{7} = vsol.stats.nsteps + vsol.stats.nfailed; %# The value for all evals + vret{8} = vsol.stats.nsteps; %# The value for success evals + vret{9} = vsol.stats.nfevals; %# The value for fun calls + vret{10} = vsol.stats.nsolves; %# The value for partial derivations + vret{11} = vsol.stats.ndecomps; %# The value for LU decompositions + +%#function odepkg_testsuite_implrober () +%# A = odeset ('RelTol', 1e-4, ... %# proprietary ode15i needs 1e-6 to be stable +%# 'AbsTol', [1e-6, 1e-10, 1e-6], ... +%# 'Jacobian', @odepkg_testsuite_implroberjac); +%# [y0, yd0] = odepkg_testsuite_implroberinit; +%# odebdi (@odepkg_testsuite_implroberfun, [0, 1e11], y0, yd0', A) +%# [y0, yd0] = odepkg_testsuite_implroberinit; +%# odebdi (@odepkg_testsuite_implroberfun, [0, 1e11], y0, yd0') + +%# Return the results for the for the implicit ROBERTSON problem +function res = odepkg_testsuite_implroberfun (t, y, yd, varargin) + res(1,1) = -0.04 * y(1) + 1e4 * y(2) * y(3) - yd(1); + res(2,1) = 0.04 * y(1) - 1e4 * y(2) * y(3) - 3e7 * y(2)^2 - yd(2); + res(3,1) = y(1) + y(2) + y(3) - 1; + +%# Return the INITIAL values for the implicit ROBERTSON problem +function [y0, yd0] = odepkg_testsuite_implroberinit () + y0 = [1, 0, 0]; + yd0 = [-4e-2, 4e-2, 0]; + +%# Return the JACOBIAN matrix for the implicit ROBERTSON problem +function [dfdy, dfdyd] = odepkg_testsuite_implroberjac (t, y, yd, varargin) + dfdy(1,1) = -0.04; + dfdy(1,2) = 1e4 * y(3); + dfdy(1,3) = 1e4 * y(2); + dfdy(2,1) = 0.04; + dfdy(2,2) = -1e4 * y(3) - 6e7 * y(2); + dfdy(2,3) = -1e4 * y(2); + dfdy(3,1) = 1; + dfdy(3,2) = 1; + dfdy(3,3) = 1; + + dfdyd(1,1) = -1; + dfdyd(2,2) = -1; + dfdyd(3,3) = 0; + +%# For the implicit form of the Robertson problem a mass matrix is not +%# allowed. This mass matrix is only needed if the Robertson problem +%# is formulated in explicit form (cf. odepkg_testsuite_implrober.m). +%# function mass = odepkg_testsuite_implrobermass (t, y, varargin) +%# mass = [1, 0, 0; 0, 1, 0; 0, 0, 0]; + +%# Return the REFERENCE values for the implicit ROBERTSON problem +function y = odepkg_testsuite_implroberref () + y(1) = 0.20833401497012e-07; + y(2) = 0.83333607703347e-13; + y(3) = 0.99999997916650e+00; + +%!demo +%! vsolver = {@odebdi}; +%! for vcnt=1:length (vsolver) +%! virob{vcnt,1} = odepkg_testsuite_implrober (vsolver{vcnt}, 1e-7); +%! end +%! virob + +%# Local Variables: *** +%# mode: octave *** +%# End: *** This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <tr...@us...> - 2007-11-25 17:35:56
|
Revision: 4296 http://octave.svn.sourceforge.net/octave/?rev=4296&view=rev Author: treichl Date: 2007-11-25 09:35:59 -0800 (Sun, 25 Nov 2007) Log Message: ----------- Removed a bug if the option 'Events' is used. Modified Paths: -------------- trunk/octave-forge/main/odepkg/inst/ode23.m trunk/octave-forge/main/odepkg/inst/ode45.m trunk/octave-forge/main/odepkg/inst/ode54.m trunk/octave-forge/main/odepkg/inst/ode78.m Modified: trunk/octave-forge/main/odepkg/inst/ode23.m =================================================================== --- trunk/octave-forge/main/odepkg/inst/ode23.m 2007-11-25 17:33:23 UTC (rev 4295) +++ trunk/octave-forge/main/odepkg/inst/ode23.m 2007-11-25 17:35:59 UTC (rev 4296) @@ -381,7 +381,7 @@ vu(:), [], vfunarguments{:}); %# 20070222, bugfix, Calling event function does not depend on %# OutputSel vretvalresult(vcntloop-1,:)', [], vfunarguments{:}); - if (~vevent{1}) + if (~isempty (vevent{1}) && vevent{1} == 1) vretvaltime(vcntloop-1,:) = vevent{3}(end,:); vretvalresult(vcntloop-1,:) = vevent{4}(end,:); vunhandledtermination = false; break; Modified: trunk/octave-forge/main/odepkg/inst/ode45.m =================================================================== --- trunk/octave-forge/main/odepkg/inst/ode45.m 2007-11-25 17:33:23 UTC (rev 4295) +++ trunk/octave-forge/main/odepkg/inst/ode45.m 2007-11-25 17:35:59 UTC (rev 4296) @@ -385,7 +385,7 @@ vu(:), [], vfunarguments{:}); %# 20070222, bugfix, Calling event function does not depend on %# OutputSel vretvalresult(vcntloop-1,:)', [], vfunarguments{:}); - if (~vevent{1}) + if (~isempty (vevent{1}) && vevent{1} == 1) vretvaltime(vcntloop-1,:) = vevent{3}(end,:); vretvalresult(vcntloop-1,:) = vevent{4}(end,:); vunhandledtermination = false; break; Modified: trunk/octave-forge/main/odepkg/inst/ode54.m =================================================================== --- trunk/octave-forge/main/odepkg/inst/ode54.m 2007-11-25 17:33:23 UTC (rev 4295) +++ trunk/octave-forge/main/odepkg/inst/ode54.m 2007-11-25 17:35:59 UTC (rev 4296) @@ -387,7 +387,7 @@ vu(:), [], vfunarguments{:}); %# 20070222, bugfix, Calling event function does not depend on %# OutputSel vretvalresult(vcntloop-1,:)', [], vfunarguments{:}); - if (~vevent{1}) + if (~isempty (vevent{1}) && vevent{1} == 1) vretvaltime(vcntloop-1,:) = vevent{3}(end,:); vretvalresult(vcntloop-1,:) = vevent{4}(end,:); vunhandledtermination = false; break; Modified: trunk/octave-forge/main/odepkg/inst/ode78.m =================================================================== --- trunk/octave-forge/main/odepkg/inst/ode78.m 2007-11-25 17:33:23 UTC (rev 4295) +++ trunk/octave-forge/main/odepkg/inst/ode78.m 2007-11-25 17:35:59 UTC (rev 4296) @@ -406,7 +406,7 @@ vu(:), [], vfunarguments{:}); %# 20070222, bugfix, Calling event function does not depend on %# OutputSel vretvalresult(vcntloop-1,:)', [], vfunarguments{:}); - if (~vevent{1}) + if (~isempty (vevent{1}) && vevent{1} == 1) vretvaltime(vcntloop-1,:) = vevent{3}(end,:); vretvalresult(vcntloop-1,:) = vevent{4}(end,:); vunhandledtermination = false; break; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <tr...@us...> - 2007-11-27 20:13:10
|
Revision: 4306 http://octave.svn.sourceforge.net/octave/?rev=4306&view=rev Author: treichl Date: 2007-11-27 12:13:13 -0800 (Tue, 27 Nov 2007) Log Message: ----------- Minor changes. Modified Paths: -------------- trunk/octave-forge/main/odepkg/inst/ode2r.m trunk/octave-forge/main/odepkg/inst/ode5d.m trunk/octave-forge/main/odepkg/inst/ode5r.m trunk/octave-forge/main/odepkg/inst/ode8d.m trunk/octave-forge/main/odepkg/inst/odeox.m trunk/octave-forge/main/odepkg/inst/odepkg.m trunk/octave-forge/main/odepkg/inst/odepkg_equations_ilorenz.m trunk/octave-forge/main/odepkg/inst/oders.m trunk/octave-forge/main/odepkg/inst/odesx.m Modified: trunk/octave-forge/main/odepkg/inst/ode2r.m =================================================================== --- trunk/octave-forge/main/odepkg/inst/ode2r.m 2007-11-27 18:42:06 UTC (rev 4305) +++ trunk/octave-forge/main/odepkg/inst/ode2r.m 2007-11-27 20:13:13 UTC (rev 4306) @@ -47,6 +47,7 @@ %# The following tests have been added to check the function's input arguments %# and output arguments %!test +%! warning ("off", "OdePkg:InvalidOption"); %! if (!strcmp (which ("odepkg_mexsolver_radau"), "")) %! vsol = ode2r (@odepkg_equations_vanderpol, [0 2], [2 0]); %! end @@ -91,6 +92,7 @@ %! A = odeset ('MaxStep', 0.1, 'RelTol', 1e-2, 'AbsTol', 1e-3); %! [vx, vy, va, vb, vc] = ode2r (@odepkg_equations_vanderpol, [0 2], [2 0], A, 1.2); %! end +%! warning ("on", "OdePkg:InvalidOption"); %!demo %! Modified: trunk/octave-forge/main/odepkg/inst/ode5d.m =================================================================== --- trunk/octave-forge/main/odepkg/inst/ode5d.m 2007-11-27 18:42:06 UTC (rev 4305) +++ trunk/octave-forge/main/odepkg/inst/ode5d.m 2007-11-27 20:13:13 UTC (rev 4306) @@ -40,6 +40,7 @@ %# The following tests have been added to check the function's input arguments %# and output arguments %!test +%! warning ("off", "OdePkg:InvalidOption"); %! if (!strcmp (which ("odepkg_mexsolver_dopri5"), "")) %! vsol = ode5d (@odepkg_equations_vanderpol, [0 2], [2 0]); %! end @@ -84,6 +85,7 @@ %! A = odeset ('MaxStep', 0.1, 'RelTol', 1e-2, 'AbsTol', 1e-3); %! [vx, vy, va, vb, vc] = ode5d (@odepkg_equations_vanderpol, [0 2], [2 0], A, 1.2); %! end +%! warning ("on", "OdePkg:InvalidOption"); %!demo %! Modified: trunk/octave-forge/main/odepkg/inst/ode5r.m =================================================================== --- trunk/octave-forge/main/odepkg/inst/ode5r.m 2007-11-27 18:42:06 UTC (rev 4305) +++ trunk/octave-forge/main/odepkg/inst/ode5r.m 2007-11-27 20:13:13 UTC (rev 4306) @@ -47,6 +47,7 @@ %# The following tests have been added to check the function's input arguments %# and output arguments %!test +%! warning ("off", "OdePkg:InvalidOption"); %! if (!strcmp (which ("odepkg_mexsolver_radau5"), "")) %! vsol = ode5r (@odepkg_equations_vanderpol, [0 2], [2 0]); %! end @@ -91,6 +92,7 @@ %! A = odeset ('MaxStep', 0.1, 'RelTol', 1e-2, 'AbsTol', 1e-3); %! [vx, vy, va, vb, vc] = ode5r (@odepkg_equations_vanderpol, [0 2], [2 0], A, 1.2); %! end +%! warning ("on", "OdePkg:InvalidOption"); %!demo %! Modified: trunk/octave-forge/main/odepkg/inst/ode8d.m =================================================================== --- trunk/octave-forge/main/odepkg/inst/ode8d.m 2007-11-27 18:42:06 UTC (rev 4305) +++ trunk/octave-forge/main/odepkg/inst/ode8d.m 2007-11-27 20:13:13 UTC (rev 4306) @@ -39,6 +39,7 @@ %# The following tests have been added to check the function's input arguments %# and output arguments %!test +%! warning ("off", "OdePkg:InvalidOption"); %! if (!strcmp (which ("odepkg_mexsolver_dop853"), "")) %! vsol = ode8d (@odepkg_equations_vanderpol, [0 2], [2 0]); %! end @@ -83,6 +84,7 @@ %! A = odeset ('MaxStep', 0.1, 'RelTol', 1e-2, 'AbsTol', 1e-3); %! [vx, vy, va, vb, vc] = ode8d (@odepkg_equations_vanderpol, [0 2], [2 0], A, 1.2); %! end +%! warning ("on", "OdePkg:InvalidOption"); %!demo %! Modified: trunk/octave-forge/main/odepkg/inst/odeox.m =================================================================== --- trunk/octave-forge/main/odepkg/inst/odeox.m 2007-11-27 18:42:06 UTC (rev 4305) +++ trunk/octave-forge/main/odepkg/inst/odeox.m 2007-11-27 20:13:13 UTC (rev 4306) @@ -38,6 +38,7 @@ %# The following tests have been added to check the function's input arguments %# and output arguments %!test +%! warning ("off", "OdePkg:InvalidOption"); %! if (!strcmp (which ("odepkg_mexsolver_odex"), "")) %! vsol = odeox (@odepkg_equations_vanderpol, [0 2], [2 0]); %! end @@ -82,6 +83,7 @@ %! A = odeset ('MaxStep', 0.1, 'RelTol', 1e-2, 'AbsTol', 1e-3); %! [vx, vy, va, vb, vc] = odeox (@odepkg_equations_vanderpol, [0 2], [2 0], A, 1.2); %! end +%! warning ("on", "OdePkg:InvalidOption"); %!demo %! Modified: trunk/octave-forge/main/odepkg/inst/odepkg.m =================================================================== --- trunk/octave-forge/main/odepkg/inst/odepkg.m 2007-11-27 18:42:06 UTC (rev 4305) +++ trunk/octave-forge/main/odepkg/inst/odepkg.m 2007-11-27 20:13:13 UTC (rev 4306) @@ -64,10 +64,10 @@ test (vfun{vcnt}, 'quiet'); fflush (1); end - printf ('Testing function odepkg_testsuite_chemakzo ... '); - odepkg_testsuite_chemakzo (@odepkg_mexsolver_radau, 10^-04); - printf ('Testing function odepkg_testsuite_chemakzo ... '); - odepkg_testsuite_chemakzo (@odepkg_mexsolver_seulex, 10^-04); +% printf ('Testing function odepkg_testsuite_chemakzo ... '); +% odepkg_testsuite_chemakzo (@odepkg_mexsolver_radau, 10^-04); +% printf ('Testing function odepkg_testsuite_chemakzo ... '); +% odepkg_testsuite_chemakzo (@odepkg_mexsolver_seulex, 10^-04); function [] = odepkg_internal_helpextract () Modified: trunk/octave-forge/main/odepkg/inst/odepkg_equations_ilorenz.m =================================================================== --- trunk/octave-forge/main/odepkg/inst/odepkg_equations_ilorenz.m 2007-11-27 18:42:06 UTC (rev 4305) +++ trunk/octave-forge/main/odepkg/inst/odepkg_equations_ilorenz.m 2007-11-27 20:13:13 UTC (rev 4306) @@ -38,13 +38,11 @@ y(1) * y(2) - 8/3 * y(3) - yd(3)]; %!test -%! if (!strcmp (which ("odepkg_mexsolver_rodas"), "")) +%! if (!strcmp (which ("odebdi"), "")) %! warning ("off", "OdePkg:InvalidOption"); %! A = odeset ('InitialStep', 1e-3, 'MaxStep', 1e-1); %! [vt, vy] = odebdi (@odepkg_equations_ilorenz, [0 25], %! [3 15 1], [120 81 42.333333], A); -%#! assert (vt(end,:), 25, 1e-3); -%#! assert (vy(end,:), [9.626662, 13.572730, 23.811914], 1e-3); %! warning ("on", "OdePkg:InvalidOption"); %! endif Modified: trunk/octave-forge/main/odepkg/inst/oders.m =================================================================== --- trunk/octave-forge/main/odepkg/inst/oders.m 2007-11-27 18:42:06 UTC (rev 4305) +++ trunk/octave-forge/main/odepkg/inst/oders.m 2007-11-27 20:13:13 UTC (rev 4306) @@ -47,6 +47,7 @@ %# The following tests have been added to check the function's input arguments %# and output arguments %!test +%! warning ("off", "OdePkg:InvalidOption"); %! if (!strcmp (which ("odepkg_mexsolver_rodas"), "")) %! vsol = oders (@odepkg_equations_vanderpol, [0 2], [2 0]); %! end @@ -91,6 +92,7 @@ %! A = odeset ('MaxStep', 0.1, 'RelTol', 1e-2, 'AbsTol', 1e-3); %! [vx, vy, va, vb, vc] = oders (@odepkg_equations_vanderpol, [0 2], [2 0], A, 1.2); %! end +%! warning ("on", "OdePkg:InvalidOption"); %!demo %! Modified: trunk/octave-forge/main/odepkg/inst/odesx.m =================================================================== --- trunk/octave-forge/main/odepkg/inst/odesx.m 2007-11-27 18:42:06 UTC (rev 4305) +++ trunk/octave-forge/main/odepkg/inst/odesx.m 2007-11-27 20:13:13 UTC (rev 4306) @@ -46,6 +46,7 @@ %# The following tests have been added to check the function's input arguments %# and output arguments %!test +%! warning ("off", "OdePkg:InvalidOption"); %! if (!strcmp (which ("odepkg_mexsolver_seulex"), "")) %! vsol = odesx (@odepkg_equations_vanderpol, [0 2], [2 0]); %! end @@ -90,6 +91,7 @@ %! A = odeset ('MaxStep', 0.1, 'RelTol', 1e-2, 'AbsTol', 1e-3); %! [vx, vy, va, vb, vc] = odesx (@odepkg_equations_vanderpol, [0 2], [2 0], A, 1.2); %! end +%! warning ("on", "OdePkg:InvalidOption"); %!demo %! This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <tr...@us...> - 2008-01-19 17:00:36
|
Revision: 4522 http://octave.svn.sourceforge.net/octave/?rev=4522&view=rev Author: treichl Date: 2008-01-19 09:00:11 -0800 (Sat, 19 Jan 2008) Log Message: ----------- Updated. Modified Paths: -------------- trunk/octave-forge/main/odepkg/inst/odepkg.m trunk/octave-forge/main/odepkg/inst/odepkg_testsuite_oregonator.m Modified: trunk/octave-forge/main/odepkg/inst/odepkg.m =================================================================== --- trunk/octave-forge/main/odepkg/inst/odepkg.m 2008-01-19 16:56:21 UTC (rev 4521) +++ trunk/octave-forge/main/odepkg/inst/odepkg.m 2008-01-19 17:00:11 UTC (rev 4522) @@ -117,6 +117,7 @@ function [] = odepkg_internal_ccrefextract () vfiles = {'../src/odepkg_octsolver_mebdfi.cc', ... + '../src/odepkg_octsolver_rodas.cc', ... '../src/odepkg_auxiliary_functions.cc', ... }; vfiles = sort (vfiles); Modified: trunk/octave-forge/main/odepkg/inst/odepkg_testsuite_oregonator.m =================================================================== --- trunk/octave-forge/main/odepkg/inst/odepkg_testsuite_oregonator.m 2008-01-19 16:56:21 UTC (rev 4521) +++ trunk/octave-forge/main/odepkg/inst/odepkg_testsuite_oregonator.m 2008-01-19 17:00:11 UTC (rev 4522) @@ -53,7 +53,7 @@ vopt = odeset ('Refine', 0, 'RelTol', vret{2}, 'AbsTol', vret{3}, ... 'InitialStep', vret{4}, 'Stats', 'on', 'NormControl', 'off', ... - 'Jacobian', @odepkg_testsuite_oregonatorjac, 'MaxStep', vstop-vstart); + 'Jacobian', @odepkg_testsuite_oregonatorjac, 'MaxStep', vstop-vstart) %# Calculate the algorithm, start timer and do solving tic; vsol = feval (vhandle, @odepkg_testsuite_oregonatorfun, ... This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <tr...@us...> - 2008-01-24 19:10:10
|
Revision: 4547 http://octave.svn.sourceforge.net/octave/?rev=4547&view=rev Author: treichl Date: 2008-01-24 11:10:10 -0800 (Thu, 24 Jan 2008) Log Message: ----------- Performance optimizations. Modified Paths: -------------- trunk/octave-forge/main/odepkg/inst/ode23.m trunk/octave-forge/main/odepkg/inst/ode45.m trunk/octave-forge/main/odepkg/inst/ode54.m trunk/octave-forge/main/odepkg/inst/ode78.m Modified: trunk/octave-forge/main/odepkg/inst/ode23.m =================================================================== --- trunk/octave-forge/main/odepkg/inst/ode23.m 2008-01-24 19:07:47 UTC (rev 4546) +++ trunk/octave-forge/main/odepkg/inst/ode23.m 2008-01-24 19:10:10 UTC (rev 4547) @@ -1,5 +1,5 @@ -%# Copyright (C) 2006, Thomas Treichl <tr...@us...> -%# OdePkg - Package for solving ordinary differential equations with Octave +%# Copyright (C) 2006-2008, Thomas Treichl <tr...@us...> +%# OdePkg - A package for solving differential equations with GNU Octave %# %# This program is free software; you can redistribute it and/or modify %# it under the terms of the GNU General Public License as published by @@ -42,7 +42,7 @@ %# taken as a base for the following implementation. %# 20060810, Thomas Treichl %# This function was adapted to the new syntax that is used by the -%# new OdePkg for Octave and is compatible to MatLab's ode23. +%# new OdePkg for Octave and is compatible to Matlab's ode23. function [varargout] = ode23 (vfun, vslot, vinit, varargin) @@ -90,14 +90,14 @@ vfunarguments = {}; end - %# Preprocessing, have a look which options have been set in - %# vodeoptions. Check if a invalid option has been set and print - %# warnings. - if (size (vslot, 1) > size (vslot, 2)), vslot = vslot'; end %# create row vector - if (size (vinit, 1) > size (vinit, 2)), vinit = vinit'; end %# create row vector - if (size (vslot, 2) > 2), vstepsizegiven = true; %# Step size checking + %# Start preprocessing, have a look which options have been set in + %# vodeoptions. Check if an invalid or unused option has been set and + %# print warnings. + vslot = vslot(:)'; %# Create a row vector + vinit = vinit(:)'; %# Create a row vector + if (length (vslot) > 2), vstepsizegiven = true; %# Step size checking else vstepsizegiven = false; end - %# A row vector could always easily be created with vinit = (vinit(:))'; + %# Get the default options that can be set with 'odeset' temporarily vodetemp = odeset; @@ -171,7 +171,7 @@ %# Implementation of the option InitialStep has been finished. This %# option can be set by the user to another value than default value. - if (isempty (vodeoptions.InitialStep)) + if (isempty (vodeoptions.InitialStep) && ~vstepsizegiven) vodeoptions.InitialStep = abs (vslot(1,1) - vslot(1,2)) / 10; vodeoptions.InitialStep = vodeoptions.InitialStep / 10^vodeoptions.Refine; warning ('OdePkg:InvalidOption', ... @@ -180,7 +180,7 @@ %# Implementation of the option MaxStep has been finished. This option %# can be set by the user to another value than default value. - if (isempty (vodeoptions.MaxStep)) + if (isempty (vodeoptions.MaxStep) && ~vstepsizegiven) vodeoptions.MaxStep = abs (vslot(1,1) - vslot(1,length (vslot))) / 10; %# vodeoptions.MaxStep = vodeoptions.MaxStep / 10^vodeoptions.Refine; warning ('OdePkg:InvalidOption', ... @@ -215,7 +215,7 @@ elseif (isa (vodeoptions.Mass, 'function_handle')) vhavemasshandle = true; %# mass defined by a function handle else %# no mass matrix - creating a diag-matrix of ones for mass - vhavemasshandle = false; vmass = diag (ones (length (vinit), 1), 0); + vhavemasshandle = false; %# vmass = diag (ones (length (vinit), 1), 0); end %# Implementation of the option MStateDependence has been finished. @@ -268,13 +268,13 @@ else vretvalresult = vinit; end - %# Initialize OutputFcn + %# Initialize the OutputFcn if (vhaveoutputfunction) feval (vodeoptions.OutputFcn, vslot', ... vretvalresult', 'init', vfunarguments{:}); end - %# Initialize EventFcn + %# Initialize the EventFcn if (vhaveeventfunction) odepkg_event_handle (vodeoptions.Events, vtimestamp, ... vretvalresult', 'init', vfunarguments{:}); @@ -288,7 +288,7 @@ vb3 = [1/6; 2/3; 1/6]; %# b-coefficients vc = sum (va, 2); - %# The solver main loop - stop if endpoint has been reached + %# The solver main loop - stop if the endpoint has been reached vcntloop = 2; vcntcycles = 1; vu = vinit; vk = vu' * zeros(1,3); vcntiter = 0; vunhandledtermination = true; while ((vtimestamp < vtimestop && vstepsize >= vminstepsize)) @@ -299,22 +299,22 @@ %# Estimate the three results when using this solver for j = 1:3 + vthetime = vtimestamp + vc(j,1) * vstepsize; + vtheinput = vu' + vstepsize * vk(:,1:j-1) * va(j,1:j-1)'; if (vhavemasshandle) %# Handle only the dynamic mass matrix, if (vmassdependence) %# constant mass matrices have already vmass = feval ... %# been set before (if any) - (vodeoptions.Mass, vtimestamp + vc(j,1) * vstepsize, ... - vu' + vstepsize * vk(:,1:j-1) * va(j,1:j-1)', ... - vfunarguments{:}); + (vodeoptions.Mass, vthetime, vtheinput, vfunarguments{:}); else %# if (vmassdependence == false) vmass = feval ... %# then we only have the time argument - (vodeoptions.Mass, vtimestamp + vc(j,1) * vstepsize, ... - vfunarguments{:}); + (vodeoptions.Mass, vthetime, vfunarguments{:}); end + vk(:,j) = vmass \ feval ... + (vfun, vthetime, vtheinput, vfunarguments{:}); + else + vk(:,j) = feval ... + (vfun, vthetime, vtheinput, vfunarguments{:}); end - vk(:,j) = vmass \ feval ... - (vfun, vtimestamp + vc(j,1) * vstepsize, ... - vu' + vstepsize * vk(:,1:j-1) * va(j,1:j-1)', ... - vfunarguments{:}); end %# Compute the 2nd and the 3rd order estimation @@ -348,7 +348,8 @@ vretvaltime(vcntloop,:) = vtimestamp; if (vhaveoutputselection) vretvalresult(vcntloop,:) = vu(vodeoptions.OutputSel); - else vretvalresult(vcntloop,:) = vu; + else + vretvalresult(vcntloop,:) = vu; end vcntloop = vcntloop + 1; vcntiter = 0; @@ -369,7 +370,7 @@ end vpltret = feval (vodeoptions.OutputFcn, vtimestamp, ... vretvalresult(vcntloop-1,:)', [], vfunarguments{:}); - if (~vpltret), vunhandledtermination = false; break; end + if (vpltret), vunhandledtermination = false; break; end end %# Call event only if a valid result has been found, therefore this @@ -379,8 +380,6 @@ vevent = ... odepkg_event_handle (vodeoptions.Events, vtimestamp, ... vu(:), [], vfunarguments{:}); - %# 20070222, bugfix, Calling event function does not depend on - %# OutputSel vretvalresult(vcntloop-1,:)', [], vfunarguments{:}); if (~isempty (vevent{1}) && vevent{1} == 1) vretvaltime(vcntloop-1,:) = vevent{3}(end,:); vretvalresult(vcntloop-1,:) = vevent{4}(end,:); @@ -431,7 +430,7 @@ warning (['Solver has been stopped by a call of "break" in', ... ' the main iteration loop at time t = %f before endpoint at', ... ' tend = %f was reached. This may happen because the @odeplot', ... - ' function returned zero or the @event function returned one.'], ... + ' function returned "true" or the @event function returned "true".'], ... vtimestamp, vtimestop); end end @@ -449,15 +448,18 @@ %# Print additional information if option Stats is set if (strcmp (vodeoptions.Stats, 'on')) vhavestats = true; - vsuccess = vcntloop-2; %# vcntloop from 2..end - vfailed = (vcntcycles-1)-(vcntloop-2)+1; %# vcntcycl from 1..end - vfuncalls = 3*(vcntcycles-1); %# number of ode evaluations - vludecomp = 0; %# number of LU decompositions - vpartderv = 0; %# number of partial derivatives - vlinsols = 0; %# no. of solutions of linear systems - vmsg = sprintf ('Number of successful steps: %d', vsuccess); disp (vmsg); - vmsg = sprintf ('Number of failed attempts: %d', vfailed); disp (vmsg); - vmsg = sprintf ('Number of function calls: %d', vfuncalls); disp (vmsg); + vnsteps = vcntloop-2; %# vcntloop from 2..end + vnfailed = (vcntcycles-1)-(vcntloop-2)+1; %# vcntcycl from 1..end + vnfevals = 3*(vcntcycles-1); %# number of ode evaluations + vndecomps = 0; %# number of LU decompositions + vnpds = 0; %# number of partial derivatives + vnlinsols = 0; %# no. of solutions of linear systems + %# Print cost statistics if no output argument is given + if (nargout == 0) + vmsg = fprintf (1, 'Number of successful steps: %d', vnsteps); + vmsg = fprintf (1, 'Number of failed attempts: %d', vnfailed); + vmsg = fprintf (1, 'Number of function calls: %d', vnfevals); + end else vhavestats = false; end @@ -471,12 +473,12 @@ varargout{1}.ye = vevent{4}; %# Results when an event occured end if (vhavestats) - varargout{1}.stats.success = vsuccess; - varargout{1}.stats.failed = vfailed; - varargout{1}.stats.fevals = vfuncalls; - varargout{1}.stats.partial = vpartderv; - varargout{1}.stats.ludecom = vludecomp; - varargout{1}.stats.linsol = vlinsols; + varargout{1}.stats.nsteps = vnsteps; + varargout{1}.stats.nfailed = vnfailed; + varargout{1}.stats.nfevals = vnfevals; + varargout{1}.stats.npds = vnpds; + varargout{1}.stats.ndecomps = vndecomps; + varargout{1}.stats.nlinsols = vnlinsols; end elseif (nargout == 2) varargout{1} = vretvaltime; %# Time stamps are first output argument @@ -495,10 +497,9 @@ %# else nothing will be returned, varargout{1} undefined end -%!function ydot = odepkg_equations_vanderpol (tvar, yvar, varargin) -%! mu = 1; -%! ydot = [yvar(2); ... -%! mu * (1 - yvar(1)^2) * yvar(2) - yvar(1)]; +%!function ydot = fpol (vt, vy, varargin) +%! ydot = [yvar(2); (1 - yvar(1)^2) * yvar(2) - yvar(1)]; +%! %!test %! warning ("off", "OdePkg:InvalidOption"); %! vsol = ode23 (@odepkg_equations_vanderpol, [0 2], [2 0]); Modified: trunk/octave-forge/main/odepkg/inst/ode45.m =================================================================== --- trunk/octave-forge/main/odepkg/inst/ode45.m 2008-01-24 19:07:47 UTC (rev 4546) +++ trunk/octave-forge/main/odepkg/inst/ode45.m 2008-01-24 19:10:10 UTC (rev 4547) @@ -1,5 +1,5 @@ -%# Copyright (C) 2006, Thomas Treichl <tr...@us...> -%# OdePkg - Package for solving ordinary differential equations with Octave +%# Copyright (C) 2006-2008, Thomas Treichl <tr...@us...> +%# OdePkg - A package for solving differential equations with GNU Octave %# %# This program is free software; you can redistribute it and/or modify %# it under the terms of the GNU General Public License as published by @@ -42,7 +42,7 @@ %# taken as a base for the following implementation. %# 20060810, Thomas Treichl %# This function was adapted to the new syntax that is used by the -%# new OdePkg for Octave and is compatible to MatLab's ode45. +%# new OdePkg for Octave and is compatible to Matlab's ode45. function [varargout] = ode45 (vfun, vslot, vinit, varargin) @@ -93,11 +93,11 @@ %# Preprocessing, have a look which options have been set in %# vodeoptions. Check if a invalid option has been set and print %# warnings. - if (size (vslot, 1) > size (vslot, 2)), vslot = vslot'; end %# create row vector - if (size (vinit, 1) > size (vinit, 2)), vinit = vinit'; end %# create row vector - if (size (vslot, 2) > 2), vstepsizegiven = true; %# Step size checking + vslot = vslot(:)'; %# Create a row vector + vinit = vinit(:)'; %# Create a row vector + if (length (vslot) > 2), vstepsizegiven = true; %# Step size checking else vstepsizegiven = false; end - %# A row vector could always easily be created with vinit = (vinit(:))'; + %# Get the default options that can be set with 'odeset' temporarily vodetemp = odeset; @@ -171,7 +171,7 @@ %# Implementation of the option InitialStep has been finished. This %# option can be set by the user to another value than default value. - if (isempty (vodeoptions.InitialStep)) + if (isempty (vodeoptions.InitialStep) && ~vstepsizegiven) vodeoptions.InitialStep = abs (vslot(1,1) - vslot(1,2)) / 10; vodeoptions.InitialStep = vodeoptions.InitialStep / 10^vodeoptions.Refine; warning ('OdePkg:InvalidOption', ... @@ -180,7 +180,7 @@ %# Implementation of the option MaxStep has been finished. This option %# can be set by the user to another value than default value. - if (isempty (vodeoptions.MaxStep)) + if (isempty (vodeoptions.MaxStep) && ~vstepsizegiven) vodeoptions.MaxStep = abs (vslot(1,1) - vslot(1,length (vslot))) / 10; %# vodeoptions.MaxStep = vodeoptions.MaxStep / 10^vodeoptions.Refine; warning ('OdePkg:InvalidOption', ... @@ -215,7 +215,7 @@ elseif (isa (vodeoptions.Mass, 'function_handle')) vhavemasshandle = true; %# mass defined by a function handle else %# no mass matrix - creating a diag-matrix of ones for mass - vhavemasshandle = false; vmass = diag (ones (length (vinit), 1), 0); + vhavemasshandle = false; %# vmass = diag (ones (length (vinit), 1), 0); end %# Implementation of the option MStateDependence has been finished. @@ -303,22 +303,22 @@ %# Estimate the six results when using this solver for j = 1:6 + vthetime = vtimestamp + vc(j,1) * vstepsize; + vtheinput = vu' + vstepsize * vk(:,1:j-1) * va(j,1:j-1)'; if (vhavemasshandle) %# Handle only the dynamic mass matrix, if (vmassdependence) %# constant mass matrices have already vmass = feval ... %# been set before (if any) - (vodeoptions.Mass, vtimestamp + vc(j,1) * vstepsize, ... - vu' + vstepsize * vk(:,1:j-1) * va(j,1:j-1)', ... - vfunarguments{:}); + (vodeoptions.Mass, vthetime, vtheinput, vfunarguments{:}); else %# if (vmassdependence == false) vmass = feval ... %# then we only have the time argument - (vodeoptions.Mass, vtimestamp + vc(j,1) * vstepsize, ... - vfunarguments{:}); + (vodeoptions.Mass, vthetime, vfunarguments{:}); end + vk(:,j) = vmass \ feval ... + (vfun, vthetime, vtheinput, vfunarguments{:}); + else + vk(:,j) = feval ... + (vfun, vthetime, vtheinput, vfunarguments{:}); end - vk(:,j) = vmass \ feval ... - (vfun, vtimestamp + vc(j,1) * vstepsize, ... - vu' + vstepsize * vk(:,1:j-1) * va(j,1:j-1)', ... - vfunarguments{:}); end %# Compute the 4th and the 5th order estimation @@ -373,7 +373,7 @@ end vpltret = feval (vodeoptions.OutputFcn, vtimestamp, ... vretvalresult(vcntloop-1,:)', [], vfunarguments{:}); - if (~vpltret), vunhandledtermination = false; break; end + if (vpltret), vunhandledtermination = false; break; end end %# Call event only if a valid result has been found, therefore this @@ -383,8 +383,6 @@ vevent = ... odepkg_event_handle (vodeoptions.Events, vtimestamp, ... vu(:), [], vfunarguments{:}); - %# 20070222, bugfix, Calling event function does not depend on - %# OutputSel vretvalresult(vcntloop-1,:)', [], vfunarguments{:}); if (~isempty (vevent{1}) && vevent{1} == 1) vretvaltime(vcntloop-1,:) = vevent{3}(end,:); vretvalresult(vcntloop-1,:) = vevent{4}(end,:); @@ -453,15 +451,18 @@ %# Print additional information if option Stats is set if (strcmp (vodeoptions.Stats, 'on')) vhavestats = true; - vsuccess = vcntloop-2; %# vcntloop from 2..end - vfailed = (vcntcycles-1)-(vcntloop-2)+1; %# vcntcycl from 1..end - vfuncalls = 6*(vcntcycles-1); %# number of ode evaluations - vludecomp = 0; %# number of LU decompositions - vpartderv = 0; %# number of partial derivatives - vlinsols = 0; %# no. of solutions of linear systems - vmsg = sprintf ('Number of successful steps: %d', vsuccess); disp (vmsg); - vmsg = sprintf ('Number of failed attempts: %d', vfailed); disp (vmsg); - vmsg = sprintf ('Number of function calls: %d', vfuncalls); disp (vmsg); + vnsteps = vcntloop-2; %# vcntloop from 2..end + vnfailed = (vcntcycles-1)-(vcntloop-2)+1; %# vcntcycl from 1..end + vnfevals = 6*(vcntcycles-1); %# number of ode evaluations + vndecomps = 0; %# number of LU decompositions + vnpds = 0; %# number of partial derivatives + vnlinsols = 0; %# no. of solutions of linear systems + %# Print cost statistics if no output argument is given + if (nargout == 0) + vmsg = fprintf (1, 'Number of successful steps: %d', vnsteps); + vmsg = fprintf (1, 'Number of failed attempts: %d', vnfailed); + vmsg = fprintf (1, 'Number of function calls: %d', vnfevals); + end else vhavestats = false; end @@ -475,12 +476,12 @@ varargout{1}.ye = vevent{4}; %# Results when an event occured end if (vhavestats) - varargout{1}.stats.success = vsuccess; - varargout{1}.stats.failed = vfailed; - varargout{1}.stats.fevals = vfuncalls; - varargout{1}.stats.partial = vpartderv; - varargout{1}.stats.ludecom = vludecomp; - varargout{1}.stats.linsol = vlinsols; + varargout{1}.stats.nsteps = vnsteps; + varargout{1}.stats.nfailed = vnfailed; + varargout{1}.stats.nfevals = vnfevals; + varargout{1}.stats.npds = vnpds; + varargout{1}.stats.ndecomps = vndecomps; + varargout{1}.stats.nlinsols = vnlinsols; end elseif (nargout == 2) varargout{1} = vretvaltime; %# Time stamps are first output argument Modified: trunk/octave-forge/main/odepkg/inst/ode54.m =================================================================== --- trunk/octave-forge/main/odepkg/inst/ode54.m 2008-01-24 19:07:47 UTC (rev 4546) +++ trunk/octave-forge/main/odepkg/inst/ode54.m 2008-01-24 19:10:10 UTC (rev 4547) @@ -1,5 +1,5 @@ -%# Copyright (C) 2006, Thomas Treichl <tr...@us...> -%# OdePkg - Package for solving ordinary differential equations with Octave +%# Copyright (C) 2006-2008, Thomas Treichl <tr...@us...> +%# OdePkg - A package for solving differential equations with GNU Octave %# %# This program is free software; you can redistribute it and/or modify %# it under the terms of the GNU General Public License as published by @@ -42,7 +42,7 @@ %# taken as a base for the following implementation. %# 20060810, Thomas Treichl %# This function was adapted to the new syntax that is used by the -%# new odepkg for octave. An equivalent function in MatLab does not +%# new OdePkg for Octave. An equivalent function in Matlab does not %# exist. function [varargout] = ode54 (vfun, vslot, vinit, varargin) @@ -94,11 +94,11 @@ %# Preprocessing, have a look which options have been set in %# vodeoptions. Check if a invalid option has been set and print %# warnings. - if (size (vslot, 1) > size (vslot, 2)), vslot = vslot'; end %# create row vector - if (size (vinit, 1) > size (vinit, 2)), vinit = vinit'; end %# create row vector - if (size (vslot, 2) > 2), vstepsizegiven = true; %# Step size checking + vslot = vslot(:)'; %# Create a row vector + vinit = vinit(:)'; %# Create a row vector + if (length (vslot) > 2), vstepsizegiven = true; %# Step size checking else vstepsizegiven = false; end - %# A row vector could always easily be created with vinit = (vinit(:))'; + %# Get the default options that can be set with 'odeset' temporarily vodetemp = odeset; @@ -172,7 +172,7 @@ %# Implementation of the option InitialStep has been finished. This %# option can be set by the user to another value than default value. - if (isempty (vodeoptions.InitialStep)) + if (isempty (vodeoptions.InitialStep) && ~vstepsizegiven) vodeoptions.InitialStep = abs (vslot(1,1) - vslot(1,2)) / 10; vodeoptions.InitialStep = vodeoptions.InitialStep / 10^vodeoptions.Refine; warning ('OdePkg:InvalidOption', ... @@ -181,7 +181,7 @@ %# Implementation of the option MaxStep has been finished. This option %# can be set by the user to another value than default value. - if (isempty (vodeoptions.MaxStep)) + if (isempty (vodeoptions.MaxStep) && ~vstepsizegiven) vodeoptions.MaxStep = abs (vslot(1,1) - vslot(1,length (vslot))) / 10; %# vodeoptions.MaxStep = vodeoptions.MaxStep / 10^vodeoptions.Refine; warning ('OdePkg:InvalidOption', ... @@ -216,7 +216,7 @@ elseif (isa (vodeoptions.Mass, 'function_handle')) vhavemasshandle = true; %# mass defined by a function handle else %# no mass matrix - creating a diag-matrix of ones for mass - vhavemasshandle = false; vmass = diag (ones (length (vinit), 1), 0); + vhavemasshandle = false; %# vmass = diag (ones (length (vinit), 1), 0); end %# Implementation of the option MStateDependence has been finished. @@ -305,22 +305,22 @@ %# Estimate the seven results when using this solver for j = 1:7 + vthetime = vtimestamp + vc(j,1) * vstepsize; + vtheinput = vu' + vstepsize * vk(:,1:j-1) * va(j,1:j-1)'; if (vhavemasshandle) %# Handle only the dynamic mass matrix, if (vmassdependence) %# constant mass matrices have already vmass = feval ... %# been set before (if any) - (vodeoptions.Mass, vtimestamp + vc(j,1) * vstepsize, ... - vu' + vstepsize * vk(:,1:j-1) * va(j,1:j-1)', ... - vfunarguments{:}); + (vodeoptions.Mass, vthetime, vtheinput, vfunarguments{:}); else %# if (vmassdependence == false) vmass = feval ... %# then we only have the time argument - (vodeoptions.Mass, vtimestamp + vc(j,1) * vstepsize, ... - vfunarguments{:}); + (vodeoptions.Mass, vthetime, vfunarguments{:}); end + vk(:,j) = vmass \ feval ... + (vfun, vthetime, vtheinput, vfunarguments{:}); + else + vk(:,j) = feval ... + (vfun, vthetime, vtheinput, vfunarguments{:}); end - vk(:,j) = vmass \ feval ... - (vfun, vtimestamp + vc(j,1) * vstepsize, ... - vu' + vstepsize * vk(:,1:j-1) * va(j,1:j-1)', ... - vfunarguments{:}); end %# Compute the 4th and the 5th order estimation @@ -341,7 +341,7 @@ else vdelta = norm (y5 - y4, Inf); vtau = max (vodeoptions.RelTol * max (norm (vu', Inf), 1.0), ... - vodeoptions.AbsTol); + vodeoptions.AbsTol); end else %# if (vstepsizegiven == true) vdelta = 1; vtau = 2; @@ -354,7 +354,8 @@ vretvaltime(vcntloop,:) = vtimestamp; if (vhaveoutputselection) vretvalresult(vcntloop,:) = vu(vodeoptions.OutputSel); - else vretvalresult(vcntloop,:) = vu; + else + vretvalresult(vcntloop,:) = vu; end vcntloop = vcntloop + 1; vcntiter = 0; @@ -375,7 +376,7 @@ end vpltret = feval (vodeoptions.OutputFcn, vtimestamp, ... vretvalresult(vcntloop-1,:)', [], vfunarguments{:}); - if (~vpltret), vunhandledtermination = false; break; end + if (vpltret), vunhandledtermination = false; break; end end %# Call event only if a valid result has been found, therefore this @@ -385,8 +386,6 @@ vevent = ... odepkg_event_handle (vodeoptions.Events, vtimestamp, ... vu(:), [], vfunarguments{:}); - %# 20070222, bugfix, Calling event function does not depend on - %# OutputSel vretvalresult(vcntloop-1,:)', [], vfunarguments{:}); if (~isempty (vevent{1}) && vevent{1} == 1) vretvaltime(vcntloop-1,:) = vevent{3}(end,:); vretvalresult(vcntloop-1,:) = vevent{4}(end,:); @@ -455,15 +454,18 @@ %# Print additional information if option Stats is set if (strcmp (vodeoptions.Stats, 'on')) vhavestats = true; - vsuccess = vcntloop-2; %# vcntloop from 2..end - vfailed = (vcntcycles-1)-(vcntloop-2)+1; %# vcntcycl from 1..end - vfuncalls = 7*(vcntcycles-1); %# number of ode evaluations - vludecomp = 0; %# number of LU decompositions - vpartderv = 0; %# number of partial derivatives - vlinsols = 0; %# no. of solutions of linear systems - vmsg = sprintf ('Number of successful steps: %d', vsuccess); disp (vmsg); - vmsg = sprintf ('Number of failed attempts: %d', vfailed); disp (vmsg); - vmsg = sprintf ('Number of function calls: %d', vfuncalls); disp (vmsg); + vnsteps = vcntloop-2; %# vcntloop from 2..end + vnfailed = (vcntcycles-1)-(vcntloop-2)+1; %# vcntcycl from 1..end + vnfevals = 7*(vcntcycles-1); %# number of ode evaluations + vndecomps = 0; %# number of LU decompositions + vnpds = 0; %# number of partial derivatives + vnlinsols = 0; %# no. of solutions of linear systems + %# Print cost statistics if no output argument is given + if (nargout == 0) + vmsg = fprintf (1, 'Number of successful steps: %d', vnsteps); + vmsg = fprintf (1, 'Number of failed attempts: %d', vnfailed); + vmsg = fprintf (1, 'Number of function calls: %d', vnfevals); + end else vhavestats = false; end @@ -477,12 +479,12 @@ varargout{1}.ye = vevent{4}; %# Results when an event occured end if (vhavestats) - varargout{1}.stats.success = vsuccess; - varargout{1}.stats.failed = vfailed; - varargout{1}.stats.fevals = vfuncalls; - varargout{1}.stats.partial = vpartderv; - varargout{1}.stats.ludecom = vludecomp; - varargout{1}.stats.linsol = vlinsols; + varargout{1}.stats.nsteps = vnsteps; + varargout{1}.stats.nfailed = vnfailed; + varargout{1}.stats.nfevals = vnfevals; + varargout{1}.stats.npds = vnpds; + varargout{1}.stats.ndecomps = vndecomps; + varargout{1}.stats.nlinsols = vnlinsols; end elseif (nargout == 2) varargout{1} = vretvaltime; %# Time stamps are first output argument Modified: trunk/octave-forge/main/odepkg/inst/ode78.m =================================================================== --- trunk/octave-forge/main/odepkg/inst/ode78.m 2008-01-24 19:07:47 UTC (rev 4546) +++ trunk/octave-forge/main/odepkg/inst/ode78.m 2008-01-24 19:10:10 UTC (rev 4547) @@ -1,5 +1,5 @@ -%# Copyright (C) 2006, Thomas Treichl <tr...@us...> -%# OdePkg - Package for solving ordinary differential equations with Octave +%# Copyright (C) 2006-2008, Thomas Treichl <tr...@us...> +%# OdePkg - A package for solving differential equations with GNU Octave %# %# This program is free software; you can redistribute it and/or modify %# it under the terms of the GNU General Public License as published by @@ -41,8 +41,8 @@ %# under the GPL for the use with Octave. This function has been %# taken as a base for the following implementation. %# 20060810, Thomas Treichl -%# This function was adapted to the new syntax that is used by -%# OdePkg for Octave. An equivalent function in MatLab does not +%# This function was adapted to the new syntax that is used by the +%# new OdePkg for Octave. An equivalent function in Matlab does not %# exist. function [varargout] = ode78 (vfun, vslot, vinit, varargin) @@ -50,7 +50,7 @@ if (nargin == 0) %# Check number and types of all input arguments help ('ode78'); error ('OdePkg:InvalidArgument', ... - 'Number of input arguments must be greater than zero'); + 'Number of input arguments must be greater than zero'); elseif (nargin < 3) print_usage; @@ -93,11 +93,11 @@ %# Preprocessing, have a look which options have been set in %# vodeoptions. Check if a invalid option has been set and print %# warnings. - if (size (vslot, 1) > size (vslot, 2)), vslot = vslot'; end %# create row vector - if (size (vinit, 1) > size (vinit, 2)), vinit = vinit'; end %# create row vector - if (size (vslot, 2) > 2), vstepsizegiven = true; %# Step size checking + vslot = vslot(:)'; %# Create a row vector + vinit = vinit(:)'; %# Create a row vector + if (length (vslot) > 2), vstepsizegiven = true; %# Step size checking else vstepsizegiven = false; end - %# A row vector could always easily be created with vinit = (vinit(:))'; + %# Get the default options that can be set with 'odeset' temporarily vodetemp = odeset; @@ -171,7 +171,7 @@ %# Implementation of the option InitialStep has been finished. This %# option can be set by the user to another value than default value. - if (isempty (vodeoptions.InitialStep)) + if (isempty (vodeoptions.InitialStep) && ~vstepsizegiven) vodeoptions.InitialStep = abs (vslot(1,1) - vslot(1,2)) / 10; vodeoptions.InitialStep = vodeoptions.InitialStep / 10^vodeoptions.Refine; warning ('OdePkg:InvalidOption', ... @@ -180,7 +180,7 @@ %# Implementation of the option MaxStep has been finished. This option %# can be set by the user to another value than default value. - if (isempty (vodeoptions.MaxStep)) + if (isempty (vodeoptions.MaxStep) && ~vstepsizegiven) vodeoptions.MaxStep = abs (vslot(1,1) - vslot(1,length (vslot))) / 10; %# vodeoptions.MaxStep = vodeoptions.MaxStep / 10^vodeoptions.Refine; warning ('OdePkg:InvalidOption', ... @@ -215,7 +215,7 @@ elseif (isa (vodeoptions.Mass, 'function_handle')) vhavemasshandle = true; %# mass defined by a function handle else %# no mass matrix - creating a diag-matrix of ones for mass - vhavemasshandle = false; vmass = diag (ones (length (vinit), 1), 0); + vhavemasshandle = false; %# vmass = diag (ones (length (vinit), 1), 0); end %# Implementation of the option MStateDependence has been finished. @@ -324,22 +324,22 @@ %# Estimate the thirteen results when using this solver for j = 1:13 + vthetime = vtimestamp + vc(j,1) * vstepsize; + vtheinput = vu' + vstepsize * vk(:,1:j-1) * va(j,1:j-1)'; if (vhavemasshandle) %# Handle only the dynamic mass matrix, if (vmassdependence) %# constant mass matrices have already vmass = feval ... %# been set before (if any) - (vodeoptions.Mass, vtimestamp + vc(j,1) * vstepsize, ... - vu' + vstepsize * vk(:,1:j-1) * va(j,1:j-1)', ... - vfunarguments{:}); + (vodeoptions.Mass, vthetime, vtheinput, vfunarguments{:}); else %# if (vmassdependence == false) vmass = feval ... %# then we only have the time argument - (vodeoptions.Mass, vtimestamp + vc(j,1) * vstepsize, ... - vfunarguments{:}); + (vodeoptions.Mass, vthetime, vfunarguments{:}); end + vk(:,j) = vmass \ feval ... + (vfun, vthetime, vtheinput, vfunarguments{:}); + else + vk(:,j) = feval ... + (vfun, vthetime, vtheinput, vfunarguments{:}); end - vk(:,j) = vmass \ feval ... - (vfun, vtimestamp + vc(j,1) * vstepsize, ... - vu' + vstepsize * vk(:,1:j-1) * va(j,1:j-1)', ... - vfunarguments{:}); end %# Compute the 7th and the 8th order estimation @@ -373,7 +373,8 @@ vretvaltime(vcntloop,:) = vtimestamp; if (vhaveoutputselection) vretvalresult(vcntloop,:) = vu(vodeoptions.OutputSel); - else vretvalresult(vcntloop,:) = vu; + else + vretvalresult(vcntloop,:) = vu; end vcntloop = vcntloop + 1; vcntiter = 0; @@ -394,7 +395,7 @@ end vpltret = feval (vodeoptions.OutputFcn, vtimestamp, ... vretvalresult(vcntloop-1,:)', [], vfunarguments{:}); - if (~vpltret), vunhandledtermination = false; break; end + if (vpltret), vunhandledtermination = false; break; end end %# Call event only if a valid result has been found, therefore this @@ -404,8 +405,6 @@ vevent = ... odepkg_event_handle (vodeoptions.Events, vtimestamp, ... vu(:), [], vfunarguments{:}); - %# 20070222, bugfix, Calling event function does not depend on - %# OutputSel vretvalresult(vcntloop-1,:)', [], vfunarguments{:}); if (~isempty (vevent{1}) && vevent{1} == 1) vretvaltime(vcntloop-1,:) = vevent{3}(end,:); vretvalresult(vcntloop-1,:) = vevent{4}(end,:); @@ -474,15 +473,18 @@ %# Print additional information if option Stats is set if (strcmp (vodeoptions.Stats, 'on')) vhavestats = true; - vsuccess = vcntloop-2; %# vcntloop from 2..end - vfailed = (vcntcycles-1)-(vcntloop-2)+1; %# vcntcycl from 1..end - vfuncalls = 13*(vcntcycles-1); %# number of ode evaluations - vludecomp = 0; %# number of LU decompositions - vpartderv = 0; %# number of partial derivatives - vlinsols = 0; %# no. of solutions of linear systems - vmsg = sprintf ('Number of successful steps: %d', vsuccess); disp (vmsg); - vmsg = sprintf ('Number of failed attempts: %d', vfailed); disp (vmsg); - vmsg = sprintf ('Number of function calls: %d', vfuncalls); disp (vmsg); + vnsteps = vcntloop-2; %# vcntloop from 2..end + vnfailed = (vcntcycles-1)-(vcntloop-2)+1; %# vcntcycl from 1..end + vnfevals = 13*(vcntcycles-1); %# number of ode evaluations + vndecomps = 0; %# number of LU decompositions + vnpds = 0; %# number of partial derivatives + vnlinsols = 0; %# no. of solutions of linear systems + %# Print cost statistics if no output argument is given + if (nargout == 0) + vmsg = fprintf (1, 'Number of successful steps: %d', vnsteps); + vmsg = fprintf (1, 'Number of failed attempts: %d', vnfailed); + vmsg = fprintf (1, 'Number of function calls: %d', vnfevals); + end else vhavestats = false; end @@ -496,12 +498,12 @@ varargout{1}.ye = vevent{4}; %# Results when an event occured end if (vhavestats) - varargout{1}.stats.success = vsuccess; - varargout{1}.stats.failed = vfailed; - varargout{1}.stats.fevals = vfuncalls; - varargout{1}.stats.partial = vpartderv; - varargout{1}.stats.ludecom = vludecomp; - varargout{1}.stats.linsol = vlinsols; + varargout{1}.stats.nsteps = vnsteps; + varargout{1}.stats.nfailed = vnfailed; + varargout{1}.stats.nfevals = vnfevals; + varargout{1}.stats.npds = vnpds; + varargout{1}.stats.ndecomps = vndecomps; + varargout{1}.stats.nlinsols = vnlinsols; end elseif (nargout == 2) varargout{1} = vretvaltime; %# Time stamps are first output argument This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <tr...@us...> - 2008-01-24 19:11:43
|
Revision: 4549 http://octave.svn.sourceforge.net/octave/?rev=4549&view=rev Author: treichl Date: 2008-01-24 11:11:46 -0800 (Thu, 24 Jan 2008) Log Message: ----------- Speed optimization and cleanup. Modified Paths: -------------- trunk/octave-forge/main/odepkg/inst/odephas2.m trunk/octave-forge/main/odepkg/inst/odephas3.m trunk/octave-forge/main/odepkg/inst/odeplot.m trunk/octave-forge/main/odepkg/inst/odeprint.m Modified: trunk/octave-forge/main/odepkg/inst/odephas2.m =================================================================== --- trunk/octave-forge/main/odepkg/inst/odephas2.m 2008-01-24 19:11:12 UTC (rev 4548) +++ trunk/octave-forge/main/odepkg/inst/odephas2.m 2008-01-24 19:11:46 UTC (rev 4549) @@ -1,5 +1,5 @@ -%# Copyright (C) 2006, Thomas Treichl <tr...@us...> -%# OdePkg - Package for solving ordinary differential equations with octave +%# Copyright (C) 2006-2008, Thomas Treichl <tr...@us...> +%# OdePkg - A package for solving differential equations with GNU Octave %# %# This program is free software; you can redistribute it and/or modify %# it under the terms of the GNU General Public License as published by @@ -23,7 +23,7 @@ %# @item @code{"init"} %# then @var{t} must be a double column vector of length 2 with the first and the last time step and nothing is returned from this function, %# @item @code{""} -%# then @var{t} must be a double scalar specifying the actual time step and the return value is true (resp. value 1), +%# then @var{t} must be a double scalar specifying the actual time step and the return value is false (resp. value 0) for 'not stop solving', %# @item @code{"done"} %# then @var{t} must be a double scalar specifying the last time step and nothing is returned from this function. %# @end table @@ -43,27 +43,23 @@ %# No input argument check is done for a higher processing speed persistent vfigure; persistent vyold; persistent vcounter; - if (strcmp (vflag, 'init') == true) + if (strcmp (vflag, 'init')) %# Nothing to return, vt is either the time slot [tstart tstop] %# or [t0, t1, ..., tn], vy is the inital value vector 'vinit' vfigure = figure; vyold = vy(:,1); vcounter = 1; - elseif (isempty (vflag) == true) - %# Return something in varargout{1}, either true for 'not stopping - %# the integration' or false for 'stopping the integration' - vcounter = vcounter + 1; - figure (vfigure); + elseif (isempty (vflag)) + %# Return something in varargout{1}, either false for 'not stopping + %# the integration' or true for 'stopping the integration' + vcounter = vcounter + 1; figure (vfigure); vyold(:,vcounter) = vy(:,1); plot (vyold(1,:), vyold(2,:), '-o'); - drawnow; - varargout{1} = true; - %# Do not stop the integration algorithm if varargout{1} = true; - %# stop the integration algorithm if varargout{1} = false; + drawnow; varargout{1} = false; - elseif (strcmp (vflag, 'done') == true) + elseif (strcmp (vflag, 'done')) %# Cleanup has to be done, clear the persistent variables because %# we don't need them anymore - clear ('vfigure', 'vyold', 'vcounter') + clear ('vfigure', 'vyold', 'vcounter'); end Modified: trunk/octave-forge/main/odepkg/inst/odephas3.m =================================================================== --- trunk/octave-forge/main/odepkg/inst/odephas3.m 2008-01-24 19:11:12 UTC (rev 4548) +++ trunk/octave-forge/main/odepkg/inst/odephas3.m 2008-01-24 19:11:46 UTC (rev 4549) @@ -1,5 +1,5 @@ -%# Copyright (C) 2006, Thomas Treichl <tr...@us...> -%# OdePkg - Package for solving ordinary differential equations with octave +%# Copyright (C) 2006-2008, Thomas Treichl <tr...@us...> +%# OdePkg - A package for solving differential equations with GNU Octave %# %# This program is free software; you can redistribute it and/or modify %# it under the terms of the GNU General Public License as published by @@ -23,7 +23,7 @@ %# @item @code{"init"} %# then @var{t} must be a double column vector of length 2 with the first and the last time step and nothing is returned from this function, %# @item @code{""} -%# then @var{t} must be a double scalar specifying the actual time step and the return value is true (resp. value 1), +%# then @var{t} must be a double scalar specifying the actual time step and the return value is false (resp. value 0) for 'not stop solving', %# @item @code{"done"} %# then @var{t} must be a double scalar specifying the last time step and nothing is returned from this function. %# @end table @@ -45,27 +45,23 @@ %# varargout{1} either true or false, if 'done' then varargout{1} = []. persistent vfigure; persistent vyold; persistent vcounter; - if (strcmp (vflag, 'init') == true) + if (strcmp (vflag, 'init')) %# vt is either the time slot [tstart tstop] or [t0, t1, ..., tn] %# vy is the inital value vector vinit from the caller function - vfigure = figure; - vyold = vy(:,1); - vcounter = 1; + vfigure = figure; vyold = vy(:,1); vcounter = 1; - elseif (isempty (vflag) == true) - %# Return something in varargout{1}, either true for 'not stopping - %# the integration' or false for 'stopping the integration' - vcounter = vcounter + 1; - figure (vfigure); - vyold(:,vcounter) = vy(:,1); + elseif (isempty (vflag)) + %# Return something in varargout{1}, either false for 'not stopping + %# the integration' or true for 'stopping the integration' + vcounter = vcounter + 1; figure (vfigure); + vyold(:,vcounter) = vy(:,1); plot3 (vyold(1,:), vyold(2,:), vyold (3,:), '-o'); - drawnow; - varargout{1} = true; + drawnow; varargout{1} = false; - elseif (strcmp (vflag, 'done') == true) + elseif (strcmp (vflag, 'done')) %# Cleanup has to be done, clear the persistent variables because %# we don't need them anymore - clear ('vfigure', 'vyold', 'vcounter') + clear ('vfigure', 'vyold', 'vcounter'); end Modified: trunk/octave-forge/main/odepkg/inst/odeplot.m =================================================================== --- trunk/octave-forge/main/odepkg/inst/odeplot.m 2008-01-24 19:11:12 UTC (rev 4548) +++ trunk/octave-forge/main/odepkg/inst/odeplot.m 2008-01-24 19:11:46 UTC (rev 4549) @@ -1,5 +1,5 @@ -%# Copyright (C) 2006, Thomas Treichl <tr...@us...> -%# OdePkg - Package for solving ordinary differential equations with octave +%# Copyright (C) 2006-2008, Thomas Treichl <tr...@us...> +%# OdePkg - A package for solving differential equations with GNU Octave %# %# This program is free software; you can redistribute it and/or modify %# it under the terms of the GNU General Public License as published by @@ -23,7 +23,7 @@ %# @item @code{"init"} %# then @var{t} must be a double column vector of length 2 with the first and the last time step and nothing is returned from this function, %# @item @code{""} -%# then @var{t} must be a double scalar specifying the actual time step and the return value is true (resp. value 1), +%# then @var{t} must be a double scalar specifying the actual time step and the return value is false (resp. value 0) for 'not stop solving', %# @item @code{"done"} %# then @var{t} must be a double scalar specifying the last time step and nothing is returned from this function. %# @end table @@ -38,36 +38,31 @@ %# %# @seealso{odepkg} -function [varargout] = odeplot (vt, vy, vflag) +function [varargout] = odeplot (vt, vy, vflag, varargin) %# No input argument check is done for a higher processing speed persistent vfigure; persistent vtold; persistent vyold; persistent vcounter; - if (strcmp (vflag, 'init') == true) + if (strcmp (vflag, 'init')) %# Nothing to return, vt is either the time slot [tstart tstop] %# or [t0, t1, ..., tn], vy is the inital value vector 'vinit' - vfigure = figure; -%# axis ([vt(1,1), vt(1,length(vt))]); - vtold = vt(1,1); - vyold = vy(:,1); + vfigure = figure; vtold = vt(1,1); vyold = vy(:,1); vcounter = 1; - elseif (isempty (vflag) == true) - %# Return something in varargout{1}, either true for 'not stopping - %# the integration' or false for 'stopping the integration' - vcounter = vcounter + 1; - figure (vfigure); - vtold(vcounter,1) = vt(1,1); + elseif (isempty (vflag)) + %# Return something in varargout{1}, either false for 'not stopping + %# the integration' or true for 'stopping the integration' + vcounter = vcounter + 1; figure (vfigure); + vtold(vcounter,1) = vt(1,1); vyold(:,vcounter) = vy(:,1); - plot (vtold, vyold, '-o'); - drawnow; - varargout{1} = true; + plot (vtold, vyold, '-o'); drawnow; + varargout{1} = false; - elseif (strcmp (vflag, 'done') == true) + elseif (strcmp (vflag, 'done')) %# Cleanup has to be done, clear the persistent variables because %# we don't need them anymore - clear ('vfigure', 'vtold', 'vyold', 'vcounter') + clear ('vfigure', 'vtold', 'vyold', 'vcounter'); end Modified: trunk/octave-forge/main/odepkg/inst/odeprint.m =================================================================== --- trunk/octave-forge/main/odepkg/inst/odeprint.m 2008-01-24 19:11:12 UTC (rev 4548) +++ trunk/octave-forge/main/odepkg/inst/odeprint.m 2008-01-24 19:11:46 UTC (rev 4549) @@ -1,5 +1,5 @@ -%# Copyright (C) 2006, Thomas Treichl <tr...@us...> -%# OdePkg - Package for solving ordinary differential equations with octave +%# Copyright (C) 2006-2008, Thomas Treichl <tr...@us...> +%# OdePkg - A package for solving differential equations with GNU Octave %# %# This program is free software; you can redistribute it and/or modify %# it under the terms of the GNU General Public License as published by @@ -23,7 +23,7 @@ %# @item @code{"init"} %# then @var{t} must be a double column vector of length 2 with the first and the last time step and nothing is returned from this function, %# @item @code{""} -%# then @var{t} must be a double scalar specifying the actual time step and the return value is true (resp. value 1), +%# then @var{t} must be a double scalar specifying the actual time step and the return value is false (resp. value 0) for 'not stop solving', %# @item @code{"done"} %# then @var{t} must be a double scalar specifying the last time step and nothing is returned from this function. %# @end table @@ -45,18 +45,15 @@ %# odephas2 and odephas3 for another implementation. vflag either %# is "init", [] or "done". - if (strcmp (vflag, 'init') == true) + if (strcmp (vflag, 'init')) fprintf (1, '%f%s\n', vt (1,1), sprintf (' %f', vy) ); fflush (1); - elseif (isempty (vflag) == true) %# Return varargout{1} + elseif (isempty (vflag)) %# Return value varargout{1} needed fprintf (1, '%f%s\n', vt (1,1), sprintf (' %f', vy) ); - fflush (1); - varargout{1} = true; - %# Do not stop the integration algorithm - %# if varargout{1} = false; stop the integration algorithm + fflush (1); varargout{1} = false; - elseif (strcmp (vflag, 'done') == true) + elseif (strcmp (vflag, 'done')) %# Cleanup could be done, but nothing to do in this function end This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <tr...@us...> - 2008-01-24 19:12:27
|
Revision: 4550 http://octave.svn.sourceforge.net/octave/?rev=4550&view=rev Author: treichl Date: 2008-01-24 11:12:28 -0800 (Thu, 24 Jan 2008) Log Message: ----------- Update of the copyright notice. Modified Paths: -------------- trunk/octave-forge/main/odepkg/inst/odepkg_equations_ilorenz.m trunk/octave-forge/main/odepkg/inst/odepkg_equations_lorenz.m trunk/octave-forge/main/odepkg/inst/odepkg_equations_pendulous.m trunk/octave-forge/main/odepkg/inst/odepkg_equations_roessler.m trunk/octave-forge/main/odepkg/inst/odepkg_equations_secondorderlag.m trunk/octave-forge/main/odepkg/inst/odepkg_equations_vanderpol.m Modified: trunk/octave-forge/main/odepkg/inst/odepkg_equations_ilorenz.m =================================================================== --- trunk/octave-forge/main/odepkg/inst/odepkg_equations_ilorenz.m 2008-01-24 19:11:46 UTC (rev 4549) +++ trunk/octave-forge/main/odepkg/inst/odepkg_equations_ilorenz.m 2008-01-24 19:12:28 UTC (rev 4550) @@ -1,71 +1,71 @@ -%# Copyright (C) 2007, Thomas Treichl <tr...@us...> -%# OdePkg - Package for solving ordinary differential equations with octave -%# -%# This program is free software; you can redistribute it and/or modify -%# it under the terms of the GNU General Public License as published by -%# the Free Software Foundation; either version 2 of the License, or -%# (at your option) any later version. -%# -%# This program is distributed in the hope that it will be useful, -%# but WITHOUT ANY WARRANTY; without even the implied warranty of -%# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -%# GNU General Public License for more details. -%# -%# You should have received a copy of the GNU General Public License -%# along with this program; if not, write to the Free Software -%# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - -%# -*- texinfo -*- -%# @deftypefn {Function File} {[@var{res}] =} odepkg_equations_ilorenz (@var{t}, @var{y}, var{yd}) -%# -%# Return three residuals of the implicit ordinary differential equations (IDEs) from the "Lorenz attractor" implementation, cf. @url{http://en.wikipedia.org/wiki/Lorenz_equation} for further details. The output argument @var{res} is a column vector and contains the residuals, @var{y} is a column vector that contains the integration results from the previous integration step, @var{yd} is a column vector that contains the derivatives of the last integration step and @var{t} is a scalar value with the actual time stamp. There is no error handling implemented in this function to achieve the highest performance available. -%# -%# Run examples with the command -%# @example -%# demo odepkg_equations_ilorenz -%# @end example -%# @end deftypefn -%# -%# @seealso{odepkg} - -function res = odepkg_equations_ilorenz (t, y, yd) - %# No Jacobian needed - %# y0 = [3 15 1]' - %# yd0 = [120 81 42.333333]' - %# odebdi (@odepkg_equations_ilorenz, [0, 25], [3 15 1]', [120 81 42.333333]') - res = [10 * (y(2) - y(1)) - yd(1); - y(1) * (28 - y(3)) - yd(2); - y(1) * y(2) - 8/3 * y(3) - yd(3)]; - -%!test -%! if (!strcmp (which ("odebdi"), "")) -%! warning ("off", "OdePkg:InvalidOption"); -%! A = odeset ('InitialStep', 1e-3, 'MaxStep', 1e-1); -%! [vt, vy] = odebdi (@odepkg_equations_ilorenz, [0 25], -%! [3 15 1], [120 81 42.333333], A); -%! warning ("on", "OdePkg:InvalidOption"); -%! endif - -%!demo -%! -%! A = odeset ('InitialStep', 1e-3, 'MaxStep', 1e-1); -%! [t, y] = odebdi (@odepkg_equations_ilorenz, [0 25], -%! [3 15 1], [120 81 42.333333], A); -%! -%! subplot (2, 2, 1); grid ('on'); plot (t, y(:,1), '-b;f_x(t);', ... -%! t, y(:,2), '-g;f_y(t);', t, y(:,3), '-r;f_z(t);'); -%! subplot (2, 2, 2); grid ('on'); plot (y(:,1), y(:,2), '-b;f_{xyz}(x, y);'); -%! subplot (2, 2, 3); grid ('on'); plot (y(:,2), y(:,3), '-b;f_{xyz}(y, z);'); -%! subplot (2, 2, 4); grid ('on'); plot3 (y(:,1), y(:,2), y(:,3), ... -%! '-b;f_{xyz}(x, y, z);'); -%! -%! % ------------------------------------------------------------------------- -%! % The upper left subfigure shows the three results of the integration over -%! % time. The upper right subfigure shows the force f in a two dimensional -%! % (x,y) plane as well as the lower left subfigure shows the force in the -%! % (y,z) plane. The three dimensional force is plotted in the lower right -%! % subfigure. - -%# Local Variables: *** -%# mode: octave *** -%# End: *** +%# Copyright (C) 2007-2008, Thomas Treichl <tr...@us...> +%# OdePkg - A package for solving differential equations with GNU Octave +%# +%# This program is free software; you can redistribute it and/or modify +%# it under the terms of the GNU General Public License as published by +%# the Free Software Foundation; either version 2 of the License, or +%# (at your option) any later version. +%# +%# This program is distributed in the hope that it will be useful, +%# but WITHOUT ANY WARRANTY; without even the implied warranty of +%# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +%# GNU General Public License for more details. +%# +%# You should have received a copy of the GNU General Public License +%# along with this program; if not, write to the Free Software +%# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +%# -*- texinfo -*- +%# @deftypefn {Function File} {[@var{res}] =} odepkg_equations_ilorenz (@var{t}, @var{y}, var{yd}) +%# +%# Return three residuals of the implicit ordinary differential equations (IDEs) from the "Lorenz attractor" implementation, cf. @url{http://en.wikipedia.org/wiki/Lorenz_equation} for further details. The output argument @var{res} is a column vector and contains the residuals, @var{y} is a column vector that contains the integration results from the previous integration step, @var{yd} is a column vector that contains the derivatives of the last integration step and @var{t} is a scalar value with the actual time stamp. There is no error handling implemented in this function to achieve the highest performance available. +%# +%# Run examples with the command +%# @example +%# demo odepkg_equations_ilorenz +%# @end example +%# @end deftypefn +%# +%# @seealso{odepkg} + +function res = odepkg_equations_ilorenz (t, y, yd) + %# No Jacobian needed + %# y0 = [3 15 1]' + %# yd0 = [120 81 42.333333]' + %# odebdi (@odepkg_equations_ilorenz, [0, 25], [3 15 1]', [120 81 42.333333]') + res = [10 * (y(2) - y(1)) - yd(1); + y(1) * (28 - y(3)) - yd(2); + y(1) * y(2) - 8/3 * y(3) - yd(3)]; + +%!test +%! if (!strcmp (which ("odebdi"), "")) +%! warning ("off", "OdePkg:InvalidOption"); +%! A = odeset ('InitialStep', 1e-3, 'MaxStep', 1e-1); +%! [vt, vy] = odebdi (@odepkg_equations_ilorenz, [0 25], +%! [3 15 1], [120 81 42.333333], A); +%! warning ("on", "OdePkg:InvalidOption"); +%! endif + +%!demo +%! +%! A = odeset ('InitialStep', 1e-3, 'MaxStep', 1e-1); +%! [t, y] = odebdi (@odepkg_equations_ilorenz, [0 25], +%! [3 15 1], [120 81 42.333333], A); +%! +%! subplot (2, 2, 1); grid ('on'); plot (t, y(:,1), '-b;f_x(t);', ... +%! t, y(:,2), '-g;f_y(t);', t, y(:,3), '-r;f_z(t);'); +%! subplot (2, 2, 2); grid ('on'); plot (y(:,1), y(:,2), '-b;f_{xyz}(x, y);'); +%! subplot (2, 2, 3); grid ('on'); plot (y(:,2), y(:,3), '-b;f_{xyz}(y, z);'); +%! subplot (2, 2, 4); grid ('on'); plot3 (y(:,1), y(:,2), y(:,3), ... +%! '-b;f_{xyz}(x, y, z);'); +%! +%! % ------------------------------------------------------------------------- +%! % The upper left subfigure shows the three results of the integration over +%! % time. The upper right subfigure shows the force f in a two dimensional +%! % (x,y) plane as well as the lower left subfigure shows the force in the +%! % (y,z) plane. The three dimensional force is plotted in the lower right +%! % subfigure. + +%# Local Variables: *** +%# mode: octave *** +%# End: *** Modified: trunk/octave-forge/main/odepkg/inst/odepkg_equations_lorenz.m =================================================================== --- trunk/octave-forge/main/odepkg/inst/odepkg_equations_lorenz.m 2008-01-24 19:11:46 UTC (rev 4549) +++ trunk/octave-forge/main/odepkg/inst/odepkg_equations_lorenz.m 2008-01-24 19:12:28 UTC (rev 4550) @@ -1,5 +1,5 @@ -%# Copyright (C) 2006, Thomas Treichl <tr...@us...> -%# OdePkg - Package for solving ordinary differential equations with octave +%# Copyright (C) 2006-2008, Thomas Treichl <tr...@us...> +%# OdePkg - A package for solving differential equations with GNU Octave %# %# This program is free software; you can redistribute it and/or modify %# it under the terms of the GNU General Public License as published by Modified: trunk/octave-forge/main/odepkg/inst/odepkg_equations_pendulous.m =================================================================== --- trunk/octave-forge/main/odepkg/inst/odepkg_equations_pendulous.m 2008-01-24 19:11:46 UTC (rev 4549) +++ trunk/octave-forge/main/odepkg/inst/odepkg_equations_pendulous.m 2008-01-24 19:12:28 UTC (rev 4550) @@ -1,5 +1,5 @@ -%# Copyright (C) 2006, Thomas Treichl <tr...@us...> -%# OdePkg - Package for solving ordinary differential equations with octave +%# Copyright (C) 2006-2008, Thomas Treichl <tr...@us...> +%# OdePkg - A package for solving differential equations with GNU Octave %# %# This program is free software; you can redistribute it and/or modify %# it under the terms of the GNU General Public License as published by Modified: trunk/octave-forge/main/odepkg/inst/odepkg_equations_roessler.m =================================================================== --- trunk/octave-forge/main/odepkg/inst/odepkg_equations_roessler.m 2008-01-24 19:11:46 UTC (rev 4549) +++ trunk/octave-forge/main/odepkg/inst/odepkg_equations_roessler.m 2008-01-24 19:12:28 UTC (rev 4550) @@ -1,5 +1,5 @@ -%# Copyright (C) 2006, Thomas Treichl <tr...@us...> -%# OdePkg - Package for solving ordinary differential equations with octave +%# Copyright (C) 2006-2008, Thomas Treichl <tr...@us...> +%# OdePkg - A package for solving differential equations with GNU Octave %# %# This program is free software; you can redistribute it and/or modify %# it under the terms of the GNU General Public License as published by Modified: trunk/octave-forge/main/odepkg/inst/odepkg_equations_secondorderlag.m =================================================================== --- trunk/octave-forge/main/odepkg/inst/odepkg_equations_secondorderlag.m 2008-01-24 19:11:46 UTC (rev 4549) +++ trunk/octave-forge/main/odepkg/inst/odepkg_equations_secondorderlag.m 2008-01-24 19:12:28 UTC (rev 4550) @@ -1,5 +1,5 @@ -%# Copyright (C) 2006, Thomas Treichl <tr...@us...> -%# OdePkg - Package for solving ordinary differential equations with octave +%# Copyright (C) 2006-2008, Thomas Treichl <tr...@us...> +%# OdePkg - A package for solving differential equations with GNU Octave %# %# This program is free software; you can redistribute it and/or modify %# it under the terms of the GNU General Public License as published by Modified: trunk/octave-forge/main/odepkg/inst/odepkg_equations_vanderpol.m =================================================================== --- trunk/octave-forge/main/odepkg/inst/odepkg_equations_vanderpol.m 2008-01-24 19:11:46 UTC (rev 4549) +++ trunk/octave-forge/main/odepkg/inst/odepkg_equations_vanderpol.m 2008-01-24 19:12:28 UTC (rev 4550) @@ -1,5 +1,5 @@ -%# Copyright (C) 2006, Thomas Treichl <tr...@us...> -%# OdePkg - Package for solving ordinary differential equations with octave +%# Copyright (C) 2006-2008, Thomas Treichl <tr...@us...> +%# OdePkg - A package for solving differential equations with GNU Octave %# %# This program is free software; you can redistribute it and/or modify %# it under the terms of the GNU General Public License as published by This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <tr...@us...> - 2008-01-24 19:14:32
|
Revision: 4552 http://octave.svn.sourceforge.net/octave/?rev=4552&view=rev Author: treichl Date: 2008-01-24 11:14:33 -0800 (Thu, 24 Jan 2008) Log Message: ----------- Update of the copyright notice. Modified Paths: -------------- trunk/octave-forge/main/odepkg/inst/odeget.m trunk/octave-forge/main/odepkg/inst/odepkg_event_handle.m trunk/octave-forge/main/odepkg/inst/odepkg_structure_check.m trunk/octave-forge/main/odepkg/inst/odeset.m Modified: trunk/octave-forge/main/odepkg/inst/odeget.m =================================================================== --- trunk/octave-forge/main/odepkg/inst/odeget.m 2008-01-24 19:13:50 UTC (rev 4551) +++ trunk/octave-forge/main/odepkg/inst/odeget.m 2008-01-24 19:14:33 UTC (rev 4552) @@ -1,5 +1,5 @@ -%# Copyright (C) 2006, Thomas Treichl <tr...@us...> -%# OdePkg - Package for solving ordinary differential equations with octave +%# Copyright (C) 2006-2008, Thomas Treichl <tr...@us...> +%# OdePkg - A package for solving differential equations with GNU Octave %# %# This program is free software; you can redistribute it and/or modify %# it under the terms of the GNU General Public License as published by Modified: trunk/octave-forge/main/odepkg/inst/odepkg_event_handle.m =================================================================== --- trunk/octave-forge/main/odepkg/inst/odepkg_event_handle.m 2008-01-24 19:13:50 UTC (rev 4551) +++ trunk/octave-forge/main/odepkg/inst/odepkg_event_handle.m 2008-01-24 19:14:33 UTC (rev 4552) @@ -1,5 +1,5 @@ -%# Copyright (C) 2006, Thomas Treichl <tr...@us...> -%# OdePkg - Package for solving ordinary differential equations with octave +%# Copyright (C) 2006-2008, Thomas Treichl <tr...@us...> +%# OdePkg - A package for solving differential equations with GNU Octave %# %# This program is free software; you can redistribute it and/or modify %# it under the terms of the GNU General Public License as published by @@ -104,7 +104,7 @@ end %# We create a new output values if we found a valid index - if (!isempty (vindex)) + if (~isempty (vindex)) %# Change the persistent result cell array vretcell{1} = any (vterm(vindex)); %# Stop integration or not vretcell{2}(vevecnt,1) = vindex(1,1); %# Take first event that occurs Modified: trunk/octave-forge/main/odepkg/inst/odepkg_structure_check.m =================================================================== --- trunk/octave-forge/main/odepkg/inst/odepkg_structure_check.m 2008-01-24 19:13:50 UTC (rev 4551) +++ trunk/octave-forge/main/odepkg/inst/odepkg_structure_check.m 2008-01-24 19:14:33 UTC (rev 4552) @@ -1,5 +1,5 @@ -%# Copyright (C) 2006, Thomas Treichl <tr...@us...> -%# OdePkg - Package for solving ordinary differential equations with Octave +%# Copyright (C) 2006-2008, Thomas Treichl <tr...@us...> +%# OdePkg - A package for solving differential equations with GNU Octave %# %# This program is free software; you can redistribute it and/or modify %# it under the terms of the GNU General Public License as published by Modified: trunk/octave-forge/main/odepkg/inst/odeset.m =================================================================== --- trunk/octave-forge/main/odepkg/inst/odeset.m 2008-01-24 19:13:50 UTC (rev 4551) +++ trunk/octave-forge/main/odepkg/inst/odeset.m 2008-01-24 19:14:33 UTC (rev 4552) @@ -1,5 +1,5 @@ -%# Copyright (C) 2006, Thomas Treichl <tr...@us...> -%# OdePkg - Package for solving ordinary differential equations with octave +%# Copyright (C) 2006-2008, Thomas Treichl <tr...@us...> +%# OdePkg - A package for solving differential equations with GNU Octave %# %# This program is free software; you can redistribute it and/or modify %# it under the terms of the GNU General Public License as published by This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <tr...@us...> - 2008-02-13 10:53:21
|
Revision: 4623 http://octave.svn.sourceforge.net/octave/?rev=4623&view=rev Author: treichl Date: 2008-02-13 02:53:23 -0800 (Wed, 13 Feb 2008) Log Message: ----------- Minor changes. Modified Paths: -------------- trunk/octave-forge/main/odepkg/inst/odepkg.m trunk/octave-forge/main/odepkg/inst/odeplot.m Modified: trunk/octave-forge/main/odepkg/inst/odepkg.m =================================================================== --- trunk/octave-forge/main/odepkg/inst/odepkg.m 2008-02-13 09:44:49 UTC (rev 4622) +++ trunk/octave-forge/main/odepkg/inst/odepkg.m 2008-02-13 10:53:23 UTC (rev 4623) @@ -163,8 +163,8 @@ odepkg_testsuite_write (vsol); function [] = odepkg_performance_octavehires () - vfun = {@ode23, @ode45, @ode54, @ode78}; -%# @ode2r, @ode5r, @oders, @odesx, @odebda}; + vfun = {@ode23, @ode45, @ode54, @ode78, ... + @ode2r, @ode5r, @oders, @odesx, @odebda}; for vcnt=1:length(vfun) vsol{vcnt, 1} = odepkg_testsuite_hires (vfun{vcnt}, 1e-7); end @@ -179,7 +179,8 @@ odepkg_testsuite_write (vsol); function [] = odepkg_performance_octavechemakzo () - vfun = {@ode23, @ode45, @ode54, @ode78}; + vfun = {@ode23, @ode45, @ode54, @ode78, ... + @ode2r, @ode5r, @oders, @odesx, @odebda}; for vcnt=1:length(vfun) vsol{vcnt, 1} = odepkg_testsuite_chemakzo (vfun{vcnt}, 1e-7); end Modified: trunk/octave-forge/main/odepkg/inst/odeplot.m =================================================================== --- trunk/octave-forge/main/odepkg/inst/odeplot.m 2008-02-13 09:44:49 UTC (rev 4622) +++ trunk/octave-forge/main/odepkg/inst/odeplot.m 2008-02-13 10:53:23 UTC (rev 4623) @@ -55,7 +55,7 @@ vcounter = vcounter + 1; figure (vfigure); vtold(vcounter,1) = vt(1,1); vyold(:,vcounter) = vy(:,1); - plot (vtold, vyold, '-o'); drawnow; + plot (vtold, vyold, '-o', 'markersize', 1); drawnow; varargout{1} = false; elseif (strcmp (vflag, 'done')) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <tr...@us...> - 2008-02-22 21:52:17
|
Revision: 4670 http://octave.svn.sourceforge.net/octave/?rev=4670&view=rev Author: treichl Date: 2008-02-22 13:52:23 -0800 (Fri, 22 Feb 2008) Log Message: ----------- Minor changes and fixes. Modified Paths: -------------- trunk/octave-forge/main/odepkg/inst/odepkg_testsuite_chemakzo.m trunk/octave-forge/main/odepkg/inst/odepkg_testsuite_hires.m trunk/octave-forge/main/odepkg/inst/odepkg_testsuite_implakzo.m trunk/octave-forge/main/odepkg/inst/odepkg_testsuite_implrober.m trunk/octave-forge/main/odepkg/inst/odepkg_testsuite_oregonator.m trunk/octave-forge/main/odepkg/inst/odepkg_testsuite_pollution.m trunk/octave-forge/main/odepkg/inst/odepkg_testsuite_robertson.m Modified: trunk/octave-forge/main/odepkg/inst/odepkg_testsuite_chemakzo.m =================================================================== --- trunk/octave-forge/main/odepkg/inst/odepkg_testsuite_chemakzo.m 2008-02-22 21:51:55 UTC (rev 4669) +++ trunk/octave-forge/main/odepkg/inst/odepkg_testsuite_chemakzo.m 2008-02-22 21:52:23 UTC (rev 4670) @@ -171,11 +171,7 @@ y(6,1) = 0.48735313103074e-2; %!demo -%! vsolver = {@ode23, @ode45, @ode54, @ode78, ... -%! @odepkg_mexsolver_dopri5, @odepkg_mexsolver_dop853, ... -%! @odepkg_mexsolver_odex, @odepkg_mexsolver_radau, ... -%! @odepkg_mexsolver_radau5, @odepkg_mexsolver_rodas, ... -%! @odepkg_mexsolver_seulex}; +%! vsolver = {@odebda, @oders, @ode2r, @ode5r, @odesx}; %! for vcnt=1:length (vsolver) %! vakzo{vcnt,1} = odepkg_testsuite_chemakzo (vsolver{vcnt}, 1e-7); %! end Modified: trunk/octave-forge/main/odepkg/inst/odepkg_testsuite_hires.m =================================================================== --- trunk/octave-forge/main/odepkg/inst/odepkg_testsuite_hires.m 2008-02-22 21:51:55 UTC (rev 4669) +++ trunk/octave-forge/main/odepkg/inst/odepkg_testsuite_hires.m 2008-02-22 21:52:23 UTC (rev 4670) @@ -32,7 +32,7 @@ if (nargin ~= 2) %# Check number and types of all input arguments help ('odepkg_testsuite_hires'); error ('OdePkg:InvalidArgument', ... - 'Number of input arguments must be exactly two'); + 'Number of input arguments must be exactly two'); elseif (~isa (vhandle, 'function_handle') || ~isscalar (vrtol)) print_usage; end @@ -60,8 +60,10 @@ [vstart, vstop], vinit, vopt); vret{12} = toc; %# The value for the elapsed time vref = odepkg_testsuite_hiresref; %# Get the reference solution vector - if (max (size (vsol.y(end,:))) == max (size (vref))), vlst = vsol.y(end,:); - elseif (max (size (vsol.y(:,end))) == max (size (vref))), vlst = vsol.y(:,end); + if (exist ('OCTAVE_VERSION') ~= 0) + vlst = vsol.y(end,:); + else + vlst = vsol.y(:,end); end vret{5} = odepkg_testsuite_calcmescd (vlst, vref, vret{3}, vret{2}); vret{6} = odepkg_testsuite_calcscd (vlst, vref, vret{3}, vret{2}); @@ -127,10 +129,7 @@ %!demo %! vsolver = {@ode23, @ode45, @ode54, @ode78, ... -%! @odepkg_mexsolver_dopri5, @odepkg_mexsolver_dop853, ... -%! @odepkg_mexsolver_odex, @odepkg_mexsolver_radau, ... -%! @odepkg_mexsolver_radau5, @odepkg_mexsolver_rodas, ... -%! @odepkg_mexsolver_seulex}; +%! @odebda, @oders, @ode2r, @ode5r, @odesx}; %! for vcnt=1:length (vsolver) %! vhires{vcnt,1} = odepkg_testsuite_hires (vsolver{vcnt}, 1e-7); %! end Modified: trunk/octave-forge/main/odepkg/inst/odepkg_testsuite_implakzo.m =================================================================== --- trunk/octave-forge/main/odepkg/inst/odepkg_testsuite_implakzo.m 2008-02-22 21:51:55 UTC (rev 4669) +++ trunk/octave-forge/main/odepkg/inst/odepkg_testsuite_implakzo.m 2008-02-22 21:52:23 UTC (rev 4670) @@ -54,15 +54,17 @@ vopt = odeset ('Refine', 0, 'RelTol', vret{2}, 'AbsTol', vret{3}, ... 'InitialStep', vret{4}, 'Stats', 'on', 'NormControl', 'off', ... 'Jacobian', @odepkg_testsuite_implakzojac, 'MaxStep', vstop-vstart); - %# 'OutputFcn', @odeplot); + %# ,'OutputFcn', @odeplot, 'MaxStep', 1); %# Calculate the algorithm, start timer and do solving tic; vsol = feval (vhandle, @odepkg_testsuite_implakzofun, ... [vstart, vstop], vinity, vinityd', vopt); vret{12} = toc; %# The value for the elapsed time vref = odepkg_testsuite_implakzoref; %# Get the reference solution vector - if (max (size (vsol.y(end,:))) == max (size (vref))), vlst = vsol.y(end,:); - elseif (max (size (vsol.y(:,end))) == max (size (vref))), vlst = vsol.y(:,end); + if (exist ('OCTAVE_VERSION') ~= 0) + vlst = vsol.y(end,:); + else + vlst = vsol.y(:,end); end vret{5} = odepkg_testsuite_calcmescd (vlst, vref, vret{3}, vret{2}); vret{6} = odepkg_testsuite_calcscd (vlst, vref, vret{3}, vret{2}); Modified: trunk/octave-forge/main/odepkg/inst/odepkg_testsuite_implrober.m =================================================================== --- trunk/octave-forge/main/odepkg/inst/odepkg_testsuite_implrober.m 2008-02-22 21:51:55 UTC (rev 4669) +++ trunk/octave-forge/main/odepkg/inst/odepkg_testsuite_implrober.m 2008-02-22 21:52:23 UTC (rev 4670) @@ -62,8 +62,10 @@ [vstart, vstop], vinity, vinityd', vopt); vret{12} = toc; %# The value for the elapsed time vref = odepkg_testsuite_implroberref; %# Get the reference solution vector - if (max (size (vsol.y(end,:))) == max (size (vref))), vlst = vsol.y(end,:); - elseif (max (size (vsol.y(:,end))) == max (size (vref))), vlst = vsol.y(:,end); + if (exist ('OCTAVE_VERSION') ~= 0) + vlst = vsol.y(end,:); + else + vlst = vsol.y(:,end); end vret{5} = odepkg_testsuite_calcmescd (vlst, vref, vret{3}, vret{2}); vret{6} = odepkg_testsuite_calcscd (vlst, vref, vret{3}, vret{2}); Modified: trunk/octave-forge/main/odepkg/inst/odepkg_testsuite_oregonator.m =================================================================== --- trunk/octave-forge/main/odepkg/inst/odepkg_testsuite_oregonator.m 2008-02-22 21:51:55 UTC (rev 4669) +++ trunk/octave-forge/main/odepkg/inst/odepkg_testsuite_oregonator.m 2008-02-22 21:52:23 UTC (rev 4670) @@ -32,7 +32,7 @@ if (nargin ~= 2) %# Check number and types of all input arguments help ('odepkg_testsuite_oregonator'); error ('OdePkg:InvalidArgument', ... - 'Number of input arguments must be exactly two'); + 'Number of input arguments must be exactly two'); elseif (~isa (vhandle, 'function_handle') || ~isscalar (vrtol)) usage ('odepkg_testsuite_oregonator (@solver, reltol)'); end @@ -47,29 +47,31 @@ ' tolerance %2.0e\n'], func2str (vret{1}), vrtol); fflush (1); %# Setting the integration algorithms option values - vstart = 0.0; %# The point of time when solving is started - vstop = 360.0; %# The point of time when solving is stoped + vstart = 0.0; %# The point of time when solving is started + vstop = 360.0; %# The point of time when solving is stoped vinit = odepkg_testsuite_oregonatorinit; %# The initial values vopt = odeset ('Refine', 0, 'RelTol', vret{2}, 'AbsTol', vret{3}, ... 'InitialStep', vret{4}, 'Stats', 'on', 'NormControl', 'off', ... - 'Jacobian', @odepkg_testsuite_oregonatorjac, 'MaxStep', vstop-vstart) + 'Jacobian', @odepkg_testsuite_oregonatorjac, 'MaxStep', vstop-vstart); %# Calculate the algorithm, start timer and do solving tic; vsol = feval (vhandle, @odepkg_testsuite_oregonatorfun, ... [vstart, vstop], vinit, vopt); - vret{12} = toc; %# The value for the elapsed time + vret{12} = toc; %# The value for the elapsed time vref = odepkg_testsuite_oregonatorref; %# Get the reference solution vector - if (max (size (vsol.y(end,:))) == max (size (vref))), vlst = vsol.y(end,:); - elseif (max (size (vsol.y(:,end))) == max (size (vref))), vlst = vsol.y(:,end); + if (exist ('OCTAVE_VERSION') ~= 0) + vlst = vsol.y(end,:); + else + vlst = vsol.y(:,end); end vret{5} = odepkg_testsuite_calcmescd (vlst, vref, vret{3}, vret{2}); vret{6} = odepkg_testsuite_calcscd (vlst, vref, vret{3}, vret{2}); - vret{7} = vsol.stats.success + vsol.stats.failed; %# The value for all evals - vret{8} = vsol.stats.success; %# The value for success evals - vret{9} = vsol.stats.fevals; %# The value for fun calls - vret{10} = vsol.stats.partial; %# The value for partial derivations - vret{11} = vsol.stats.ludecom; %# The value for LU decompositions + vret{7} = vsol.stats.nsteps + vsol.stats.nfailed; %# The value for all evals + vret{8} = vsol.stats.nsteps; %# The value for success evals + vret{9} = vsol.stats.nfevals; %# The value for fun calls + vret{10} = vsol.stats.npds; %# The value for partial derivations + vret{11} = vsol.stats.ndecomps; %# The value for LU decompositions %# Returns the results for the OREGONATOR problem function f = odepkg_testsuite_oregonatorfun (t, y, varargin) @@ -101,10 +103,7 @@ %!demo %! vsolver = {@ode23, @ode45, @ode54, @ode78, ... -%! @odepkg_mexsolver_dopri5, @odepkg_mexsolver_dop853, ... -%! @odepkg_mexsolver_odex, @odepkg_mexsolver_radau, ... -%! @odepkg_mexsolver_radau5, @odepkg_mexsolver_rodas, ... -%! @odepkg_mexsolver_seulex}; +%! @odebda, @oders, @ode2r, @ode5r, @odesx}; %! for vcnt=1:length (vsolver) %! voreg{vcnt,1} = odepkg_testsuite_oregonator (vsolver{vcnt}, 1e-7); %! end Modified: trunk/octave-forge/main/odepkg/inst/odepkg_testsuite_pollution.m =================================================================== --- trunk/octave-forge/main/odepkg/inst/odepkg_testsuite_pollution.m 2008-02-22 21:51:55 UTC (rev 4669) +++ trunk/octave-forge/main/odepkg/inst/odepkg_testsuite_pollution.m 2008-02-22 21:52:23 UTC (rev 4670) @@ -58,10 +58,12 @@ %# Calculate the algorithm, start timer and do solving tic; vsol = feval (vhandle, @odepkg_testsuite_pollutionfun, ... [vstart, vstop], vinit, vopt); - vret{12} = toc; %# The value for the elapsed time + vret{12} = toc; %# The value for the elapsed time vref = odepkg_testsuite_pollutionref; %# Get the reference solution vector - if (max (size (vsol.y(end,:))) == max (size (vref))), vlst = vsol.y(end,:); - elseif (max (size (vsol.y(:,end))) == max (size (vref))), vlst = vsol.y(:,end); + if (exist ('OCTAVE_VERSION') ~= 0) + vlst = vsol.y(end,:); + else + vlst = vsol.y(:,end); end vret{5} = odepkg_testsuite_calcmescd (vlst, vref, vret{3}, vret{2}); vret{6} = odepkg_testsuite_calcscd (vlst, vref, vret{3}, vret{2}); @@ -245,10 +247,7 @@ %!demo %! vsolver = {@ode23, @ode45, @ode54, @ode78, ... -%! @odepkg_mexsolver_dopri5, @odepkg_mexsolver_dop853, ... -%! @odepkg_mexsolver_odex, @odepkg_mexsolver_radau, ... -%! @odepkg_mexsolver_radau5, @odepkg_mexsolver_rodas, ... -%! @odepkg_mexsolver_seulex}; +%! @odebda, @oders, @ode2r, @ode5r, @odesx}; %! for vcnt=1:length (vsolver) %! poll{vcnt,1} = odepkg_testsuite_pollution (vsolver{vcnt}, 1e-7); %! end Modified: trunk/octave-forge/main/odepkg/inst/odepkg_testsuite_robertson.m =================================================================== --- trunk/octave-forge/main/odepkg/inst/odepkg_testsuite_robertson.m 2008-02-22 21:51:55 UTC (rev 4669) +++ trunk/octave-forge/main/odepkg/inst/odepkg_testsuite_robertson.m 2008-02-22 21:52:23 UTC (rev 4670) @@ -32,7 +32,7 @@ if (nargin ~= 2) %# Check number and types of all input arguments help ('odepkg_testsuite_robertson'); error ('OdePkg:InvalidArgument', ... - 'Number of input arguments must be exactly two'); + 'Number of input arguments must be exactly two'); elseif (~isa (vhandle, 'function_handle') || ~isscalar (vrtol)) print_usage; end @@ -62,8 +62,10 @@ [vstart, vstop], vinit, vopt); vret{12} = toc; %# The value for the elapsed time vref = odepkg_testsuite_robertsonref; %# Get the reference solution vector - if (max (size (vsol.y(end,:))) == max (size (vref))), vlst = vsol.y(end,:); - elseif (max (size (vsol.y(:,end))) == max (size (vref))), vlst = vsol.y(:,end); + if (exist ('OCTAVE_VERSION') ~= 0) + vlst = vsol.y(end,:); + else + vlst = vsol.y(:,end); end vret{5} = odepkg_testsuite_calcmescd (vlst, vref, vret{3}, vret{2}); vret{6} = odepkg_testsuite_calcscd (vlst, vref, vret{3}, vret{2}); @@ -106,11 +108,7 @@ y(3) = 0.99999997916650e+00; %!demo -%! vsolver = {@ode23, @ode45, @ode54, @ode78, ... -%! @odepkg_mexsolver_dopri5, @odepkg_mexsolver_dop853, ... -%! @odepkg_mexsolver_odex, @odepkg_mexsolver_radau, ... -%! @odepkg_mexsolver_radau5, @odepkg_mexsolver_rodas, ... -%! @odepkg_mexsolver_seulex}; +%! vsolver = {@odebda, @oders, @ode2r, @ode5r, @odesx}; %! for vcnt=1:length (vsolver) %! vrober{vcnt,1} = odepkg_testsuite_robertson (vsolver{vcnt}, 1e-7); %! end This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <tr...@us...> - 2008-02-22 21:54:12
|
Revision: 4671 http://octave.svn.sourceforge.net/octave/?rev=4671&view=rev Author: treichl Date: 2008-02-22 13:54:14 -0800 (Fri, 22 Feb 2008) Log Message: ----------- Included 'markersize' flag into plot command. Modified Paths: -------------- trunk/octave-forge/main/odepkg/inst/odephas2.m trunk/octave-forge/main/odepkg/inst/odephas3.m Modified: trunk/octave-forge/main/odepkg/inst/odephas2.m =================================================================== --- trunk/octave-forge/main/odepkg/inst/odephas2.m 2008-02-22 21:52:23 UTC (rev 4670) +++ trunk/octave-forge/main/odepkg/inst/odephas2.m 2008-02-22 21:54:14 UTC (rev 4671) @@ -52,7 +52,7 @@ %# the integration' or true for 'stopping the integration' vcounter = vcounter + 1; figure (vfigure); vyold(:,vcounter) = vy(:,1); - plot (vyold(1,:), vyold(2,:), '-o'); + plot (vyold(1,:), vyold(2,:), '-o', 'markersize', 1); drawnow; varargout{1} = false; elseif (strcmp (vflag, 'done')) Modified: trunk/octave-forge/main/odepkg/inst/odephas3.m =================================================================== --- trunk/octave-forge/main/odepkg/inst/odephas3.m 2008-02-22 21:52:23 UTC (rev 4670) +++ trunk/octave-forge/main/odepkg/inst/odephas3.m 2008-02-22 21:54:14 UTC (rev 4671) @@ -54,7 +54,7 @@ %# the integration' or true for 'stopping the integration' vcounter = vcounter + 1; figure (vfigure); vyold(:,vcounter) = vy(:,1); - plot3 (vyold(1,:), vyold(2,:), vyold (3,:), '-o'); + plot3 (vyold(1,:), vyold(2,:), vyold (3,:), '-o', 'markersize', 1); drawnow; varargout{1} = false; elseif (strcmp (vflag, 'done')) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <tr...@us...> - 2008-03-01 20:39:49
|
Revision: 4690 http://octave.svn.sourceforge.net/octave/?rev=4690&view=rev Author: treichl Date: 2008-03-01 12:39:55 -0800 (Sat, 01 Mar 2008) Log Message: ----------- Minor changes and updates. Modified Paths: -------------- trunk/octave-forge/main/odepkg/inst/ode23.m trunk/octave-forge/main/odepkg/inst/ode45.m trunk/octave-forge/main/odepkg/inst/ode54.m trunk/octave-forge/main/odepkg/inst/ode78.m Modified: trunk/octave-forge/main/odepkg/inst/ode23.m =================================================================== --- trunk/octave-forge/main/odepkg/inst/ode23.m 2008-03-01 20:28:03 UTC (rev 4689) +++ trunk/octave-forge/main/odepkg/inst/ode23.m 2008-03-01 20:39:55 UTC (rev 4690) @@ -62,9 +62,9 @@ error ('OdePkg:InvalidArgument', ... 'Second input argument must be a valid vector'); - elseif (~isvector (vinit) || ~isnumeric (vinit)) + elseif (~isnumeric (vinit)) error ('OdePkg:InvalidArgument', ... - 'Third input argument must be a valid vector'); + 'Third input argument must be a valid numerical value'); elseif (nargin >= 4) @@ -532,23 +532,6 @@ %! [vx, vy, va, vb, vc] = ode23 (@odepkg_equations_vanderpol, [0 2], [2 0], A, 1.2); %! warning ("on", "OdePkg:InvalidOption"); -%!demo -%! -%! A = odeset ('RelTol', 1e-1, 'AbsTol', 1e-2); -%! [vx, vy] = ode23 (@odepkg_equations_secondorderlag, [0 2.5], [0 0], ... -%! A, 5, 2, 0.02, 0.1); -%! -%! plot (vx, vy(:,1), '-ob;y, x2;', vx, vy(:,2), '-or;x1;', ... -%! vx, ones(length(vx),1)*5, '-og;u;'); -%! -%! % --------------------------------------------------------------------- -%! % The figure window shows the state variables x1, x2 as well as the -%! % input signal u and the output signal y(=x2) of a second order lag -%! % implementation (cf. the control theory). The function ode23 was -%! % called with an option argument A that has been set before with the -%! % command "odeset" and with further parameters "5, 2, 0.02, 0.1" that -%! % are passed to the set of ordinary differential equations. - %# Local Variables: *** %# mode: octave *** %# End: *** Modified: trunk/octave-forge/main/odepkg/inst/ode45.m =================================================================== --- trunk/octave-forge/main/odepkg/inst/ode45.m 2008-03-01 20:28:03 UTC (rev 4689) +++ trunk/octave-forge/main/odepkg/inst/ode45.m 2008-03-01 20:39:55 UTC (rev 4690) @@ -62,9 +62,9 @@ error ('OdePkg:InvalidArgument', ... 'Second input argument must be a valid vector'); - elseif (~isvector (vinit) || ~isnumeric (vinit)) + elseif (~isnumeric (vinit)) error ('OdePkg:InvalidArgument', ... - 'Third input argument must be a valid vector'); + 'Third input argument must be a valid numerical value'); elseif (nargin >= 4) Modified: trunk/octave-forge/main/odepkg/inst/ode54.m =================================================================== --- trunk/octave-forge/main/odepkg/inst/ode54.m 2008-03-01 20:28:03 UTC (rev 4689) +++ trunk/octave-forge/main/odepkg/inst/ode54.m 2008-03-01 20:39:55 UTC (rev 4690) @@ -63,9 +63,9 @@ error ('OdePkg:InvalidArgument', ... 'Second input argument must be a valid vector'); - elseif (~isvector (vinit) || ~isnumeric (vinit)) + elseif (~isnumeric (vinit)) error ('OdePkg:InvalidArgument', ... - 'Third input argument must be a valid vector'); + 'Third input argument must be a valid numerical value'); elseif (nargin >= 4) Modified: trunk/octave-forge/main/odepkg/inst/ode78.m =================================================================== --- trunk/octave-forge/main/odepkg/inst/ode78.m 2008-03-01 20:28:03 UTC (rev 4689) +++ trunk/octave-forge/main/odepkg/inst/ode78.m 2008-03-01 20:39:55 UTC (rev 4690) @@ -62,9 +62,9 @@ error ('OdePkg:InvalidArgument', ... 'Second input argument must be a valid vector'); - elseif (~isvector (vinit) || ~isnumeric (vinit)) + elseif (~isnumeric (vinit)) error ('OdePkg:InvalidArgument', ... - 'Third input argument must be a valid vector'); + 'Third input argument must be a valid numerical value'); elseif (nargin >= 4) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <tr...@us...> - 2008-03-06 19:54:31
|
Revision: 4699 http://octave.svn.sourceforge.net/octave/?rev=4699&view=rev Author: treichl Date: 2008-03-06 11:54:32 -0800 (Thu, 06 Mar 2008) Log Message: ----------- Speed improvements, new test functions, fixed help texts and other minor changes. Modified Paths: -------------- trunk/octave-forge/main/odepkg/inst/ode23.m trunk/octave-forge/main/odepkg/inst/ode45.m trunk/octave-forge/main/odepkg/inst/ode54.m trunk/octave-forge/main/odepkg/inst/ode78.m Modified: trunk/octave-forge/main/odepkg/inst/ode23.m =================================================================== --- trunk/octave-forge/main/odepkg/inst/ode23.m 2008-03-06 11:48:17 UTC (rev 4698) +++ trunk/octave-forge/main/odepkg/inst/ode23.m 2008-03-06 19:54:32 UTC (rev 4699) @@ -27,9 +27,14 @@ %# %# If this function is called with more than one return argument then return the time stamps @var{t}, the solution values @var{y} and optionally the extended time stamp information @var{xe}, the extended solution information @var{ye} and the extended index information @var{ie} all of type double column vector. %# -%# Run examples with the command +%# For example, solve an anonymous implementation of the Van der Pol equation +%# %# @example -%# demo ode23 +%# fvdb = @@(vt,vy) [vy(2); (1 - vy(1)^2) * vy(2) - vy(1)]; +%# +%# vopt = odeset ("RelTol", 1e-3, "AbsTol", 1e-3, \ +%# "NormControl", "on", "OutputFcn", @@odeplot); +%# ode23 (fvdb, [0 20], [2 0], vopt); %# @end example %# @end deftypefn %# @@ -45,8 +50,7 @@ function [varargout] = ode23 (vfun, vslot, vinit, varargin) - %# Check number and types of all input arguments - if (nargin == 0) + if (nargin == 0) %# Check number and types of all input arguments help ('ode23'); error ('OdePkg:InvalidArgument', ... 'Number of input arguments must be greater than zero'); @@ -472,6 +476,7 @@ varargout{1}.ye = vevent{4}; %# Results when an event occured end if (vhavestats) + varargout{1}.stats = struct; varargout{1}.stats.nsteps = vnsteps; varargout{1}.stats.nfailed = vnfailed; varargout{1}.stats.nfevals = vnfevals; @@ -496,41 +501,163 @@ %# else nothing will be returned, varargout{1} undefined end -%!function ydot = fpol (vt, vy, varargin) -%! ydot = [yvar(2); (1 - yvar(1)^2) * yvar(2) - yvar(1)]; +%! # We are using the "Van der Pol" implementation for all tests that +%! # are done for this function. We also define a Jacobian, Events, +%! # pseudo-Mass implementation. For further tests we also define a +%! # reference solution (computed at high accuracy) and an OutputFcn +%!function [ydot] = fpol (vt, vy, varargin) %# The Van der Pol +%! ydot = [vy(2); (1 - vy(1)^2) * vy(2) - vy(1)]; +%!function [vjac] = fjac (vt, vy, varargin) %# its Jacobian +%! vjac = [0, 1; -1 - 2 * vy(1) * vy(2), 1 - vy(1)^2]; +%!function [vjac] = fjcc (vt, vy, varargin) %# sparse type +%! vjac = [0, 1; -1 - 2 * vy(1) * vy(2), 1 - vy(1)^2]; +%!function [vval, vtrm, vdir] = feve (vt, vy, varargin) +%! vval = fpol (vt, vy, varargin); %# We use the derivatives +%! vtrm = zeros (2,1); %# that's why component 2 +%! vdir = ones (2,1); %# seems to not be exact +%!function [vval, vtrm, vdir] = fevn (vt, vy, varargin) +%! vval = fpol (vt, vy, varargin); %# We use the derivatives +%! vtrm = ones (2,1); %# that's why component 2 +%! vdir = ones (2,1); %# seems to not be exact +%!function [vmas] = fmas (vt, vy) +%! vmas = [1, 0; 0, 1]; %# Dummy mass matrix for tests +%!function [vmas] = fmsa (vt, vy) +%! vmas = sparse ([1, 0; 0, 1]); %# A sparse dummy matrix +%!function [vref] = fref () %# The computed reference solut +%! vref = [0.32331666704577, -1.83297456798624]; +%!function [vout] = fout (vt, vy, vflag, varargin) +%! if (regexp (char (vflag), 'init') == 1) +%! if (any (size (vt) ~= [2, 1])) error ('"fout" step "init"'); end +%! elseif (isempty (vflag)) +%! if (any (size (vt) ~= [1, 1])) error ('"fout" step "calc"'); end +%! vout = false; +%! elseif (regexp (char (vflag), 'done') == 1) +%! if (any (size (vt) ~= [1, 1])) error ('"fout" step "done"'); end +%! else error ('"fout" invalid vflag'); +%! end %! -%!test -%! warning ("off", "OdePkg:InvalidOption"); -%! vsol = ode23 (@odepkg_equations_vanderpol, [0 2], [2 0]); -%!test -%! [vx, vy] = ode23 (@odepkg_equations_vanderpol, [0 2], [2 0]); -%!test -%! [vx, vy, va, vb, vc] = ode23 (@odepkg_equations_vanderpol, [0 2], [2 0]); -%!test -%! vsol = ode23 (@odepkg_equations_vanderpol, linspace (0, 0.1, 2), [2 0]); -%!test -%! [vx, vy] = ode23 (@odepkg_equations_vanderpol, linspace (0, 0.1, 2), [2 0]); -%!test -%! [vx, vy, va, vb, vc] = ode23 (@odepkg_equations_vanderpol, linspace (0, 0.1, 2), [0 0]); -%!test -%! A = odeset ('MaxStep', 0.1, 'RelTol', 1e-2, 'AbsTol', 1e-3); -%! vsol = ode23 (@odepkg_equations_vanderpol, [0 2], [2 0], A); -%!test -%! A = odeset ('MaxStep', 0.1, 'RelTol', 1e-2, 'AbsTol', 1e-3); -%! [vx, vy] = ode23 (@odepkg_equations_vanderpol, [0 2], [2 0], A); -%!test -%! A = odeset ('MaxStep', 0.1, 'RelTol', 1e-2, 'AbsTol', 1e-3); -%! [vx, vy, va, vb, vc] = ode23 (@odepkg_equations_vanderpol, [0 2], [2 0], A); -%!test -%! A = odeset ('MaxStep', 0.1, 'RelTol', 1e-2, 'AbsTol', 1e-3); -%! vsol = ode23 (@odepkg_equations_vanderpol, [0 2], [2 0], A, 1.2); -%!test -%! A = odeset ('MaxStep', 0.1, 'RelTol', 1e-2, 'AbsTol', 1e-3); -%! [vx, vy] = ode23 (@odepkg_equations_vanderpol, [0 2], [2 0], A, 1.2); -%!test -%! A = odeset ('MaxStep', 0.1, 'RelTol', 1e-2, 'AbsTol', 1e-3); -%! [vx, vy, va, vb, vc] = ode23 (@odepkg_equations_vanderpol, [0 2], [2 0], A, 1.2); -%! warning ("on", "OdePkg:InvalidOption"); +%! %# Turn off output of warning messages for all tests, turn them on +%! %# again if the last test is called +%!error %# input argument number one +%! warning ('off', 'OdePkg:InvalidOption'); +%! B = ode23 (1, [0 25], [3 15 1]); +%!error %# input argument number two +%! B = ode23 (@fpol, 1, [3 15 1]); +%!error %# input argument number three +%! B = ode2r (@flor, [0 25], 1); +%!test %# one output argument +%! vsol = ode23 (@fpol, [0 2], [2 0]); +%! assert ([vsol.x(end), vsol.y(end,:)], [2, fref], 1e-3); +%! assert (isfield (vsol, 'solver')); +%! assert (vsol.solver, 'ode23'); +%!test %# two output arguments +%! [vt, vy] = ode23 (@fpol, [0 2], [2 0]); +%! assert ([vt(end), vy(end,:)], [2, fref], 1e-3); +%!test %# five output arguments and no Events +%! [vt, vy, vxe, vye, vie] = ode23 (@fpol, [0 2], [2 0]); +%! assert ([vt(end), vy(end,:)], [2, fref], 1e-3); +%! assert ([vie, vxe, vye], []); +%!test %# anonymous function instead of real function +%! fvdb = @(vt,vy) [vy(2); (1 - vy(1)^2) * vy(2) - vy(1)]; +%! vsol = ode23 (@fpol, [0 2], [2 0]); +%! assert ([vsol.x(end), vsol.y(end,:)], [2, fref], 1e-3); +%!test %# extra input arguments passed trhough +%! vsol = ode23 (@fpol, [0 2], [2 0], 12, 13, 'KL'); +%! assert ([vsol.x(end), vsol.y(end,:)], [2, fref], 1e-3); +%!test %# empty OdePkg structure *but* extra input arguments +%! vopt = odeset; +%! vsol = ode23 (@fpol, [0 2], [2 0], vopt, 12, 13, 'KL'); +%! assert ([vsol.x(end), vsol.y(end,:)], [2, fref], 1e-3); +%!error %# strange OdePkg structure +%! vopt = struct ('foo', 1); +%! vsol = ode23 (@fpol, [0 2], [2 0], vopt); +%!test %# AbsTol option +%! vopt = odeset ('AbsTol', 1e-5); +%! vsol = ode23 (@fpol, [0 2], [2 0], vopt); +%! assert ([vsol.x(end), vsol.y(end,:)], [2, fref], 1e-3); +%!test %# AbsTol and RelTol option +%! vopt = odeset ('AbsTol', 1e-8, 'RelTol', 1e-8); +%! vsol = ode23 (@fpol, [0 2], [2 0], vopt); +%! assert ([vsol.x(end), vsol.y(end,:)], [2, fref], 1e-3); +%!test %# RelTol and NormControl option -- higher accuracy +%! vopt = odeset ('RelTol', 1e-8, 'NormControl', 'on'); +%! vsol = ode23 (@fpol, [0 2], [2 0], vopt); +%! assert ([vsol.x(end), vsol.y(end,:)], [2, fref], 1e-6); +%!test %# Keeps initial values while integrating +%! vopt = odeset ('NonNegative', 2); +%! vsol = ode23 (@fpol, [0 2], [2 0], vopt); +%! assert ([vsol.x(end), vsol.y(end,:)], [2, 2, 0], 1e-1); +%!test %# Details of OutputSel and Refine can't be tested +%! vopt = odeset ('OutputFcn', @fout, 'OutputSel', 1, 'Refine', 5); +%! vsol = ode23 (@fpol, [0 2], [2 0], vopt); +%!test %# Stats must add further elements in vsol +%! vopt = odeset ('Stats', 'on'); +%! vsol = ode23 (@fpol, [0 2], [2 0], vopt); +%! assert (isfield (vsol, 'stats')); +%! assert (isfield (vsol.stats, 'nsteps')); +%!test %# InitialStep option +%! vopt = odeset ('InitialStep', 1e-8); +%! vsol = ode23 (@fpol, [0 0.2], [2 0], vopt); +%! assert ([vsol.x(2)-vsol.x(1)], [1e-8], 1e-9); +%!test %# MaxStep option +%! vopt = odeset ('MaxStep', 1e-2); +%! vsol = ode23 (@fpol, [0 0.2], [2 0], vopt); +%! assert ([vsol.x(5)-vsol.x(4)], [1e-2], 1e-3); +%!test %# Events option add further elements in vsol +%! vopt = odeset ('Events', @feve); +%! vsol = ode23 (@fpol, [0 10], [2 0], vopt); +%! assert (isfield (vsol, 'ie')); +%! assert (vsol.ie, [2; 1; 2]); +%! assert (isfield (vsol, 'xe')); +%! assert (isfield (vsol, 'ye')); +%!test %# Events option, now stop integration +%! vopt = odeset ('Events', @fevn, 'NormControl', 'on'); +%! vsol = ode23 (@fpol, [0 10], [2 0], vopt); +%! assert ([vsol.ie, vsol.xe, vsol.ye], ... +%! [2.0, 2.496110, -0.830550, -2.677589], 1e-3); +%!test %# Events option, five output arguments +%! vopt = odeset ('Events', @fevn, 'NormControl', 'on'); +%! [vt, vy, vxe, vye, vie] = ode23 (@fpol, [0 10], [2 0], vopt); +%! assert ([vie, vxe, vye], ... +%! [2.0, 2.496110, -0.830550, -2.677589], 1e-3); +%!test %# Jacobian option +%! vopt = odeset ('Jacobian', @fjac); +%! vsol = ode23 (@fpol, [0 2], [2 0], vopt); +%! assert ([vsol.x(end), vsol.y(end,:)], [2, fref], 1e-3); +%!test %# Jacobian option and sparse return value +%! vopt = odeset ('Jacobian', @fjcc); +%! vsol = ode23 (@fpol, [0 2], [2 0], vopt); +%! assert ([vsol.x(end), vsol.y(end,:)], [2, fref], 1e-3); +%! +%! %# test for JPattern option is missing +%! %# test for Vectorized option is missing +%! +%!test %# Mass option as function +%! vopt = odeset ('Mass', @fmas); +%! vsol = ode23 (@fpol, [0 2], [2 0], vopt); +%! assert ([vsol.x(end), vsol.y(end,:)], [2, fref], 1e-3); +%!test %# Mass option as matrix +%! vopt = odeset ('Mass', eye (2,2)); +%! vsol = ode23 (@fpol, [0 2], [2 0], vopt); +%! assert ([vsol.x(end), vsol.y(end,:)], [2, fref], 1e-3); +%!test %# Mass option as sparse matrix +%! vopt = odeset ('Mass', sparse (eye (2,2))); +%! vsol = ode23 (@fpol, [0 2], [2 0], vopt); +%! assert ([vsol.x(end), vsol.y(end,:)], [2, fref], 1e-3); +%!test %# Mass option as function and sparse matrix +%! vopt = odeset ('Mass', @fmsa); +%! vsol = ode23 (@fpol, [0 2], [2 0], vopt); +%! assert ([vsol.x(end), vsol.y(end,:)], [2, fref], 1e-3); +%!test %# Mass option as function and MStateDependence +%! vopt = odeset ('Mass', @fmas, 'MStateDependence', 'strong'); +%! vsol = ode23 (@fpol, [0 2], [2 0], vopt); +%! warning ('on', 'OdePkg:InvalidOption'); +%! assert ([vsol.x(end), vsol.y(end,:)], [2, fref], 1e-3); +%! +%! %# test for MvPattern option is missing +%! %# test for InitialSlope option is missing +%! %# test for MaxOrder option is missing +%! %# test for BDF option is missing %# Local Variables: *** %# mode: octave *** Modified: trunk/octave-forge/main/odepkg/inst/ode45.m =================================================================== --- trunk/octave-forge/main/odepkg/inst/ode45.m 2008-03-06 11:48:17 UTC (rev 4698) +++ trunk/octave-forge/main/odepkg/inst/ode45.m 2008-03-06 19:54:32 UTC (rev 4699) @@ -27,9 +27,14 @@ %# %# If this function is called with more than one return argument then return the time stamps @var{t}, the solution values @var{y} and optionally the extended time stamp information @var{xe}, the extended solution information @var{ye} and the extended index information @var{ie} all of type double column vector. %# -%# Run examples with the command +%# For example, solve an anonymous implementation of the Van der Pol equation +%# %# @example -%# demo ode45 +%# fvdb = @@(vt,vy) [vy(2); (1 - vy(1)^2) * vy(2) - vy(1)]; +%# +%# vopt = odeset ("RelTol", 1e-3, "AbsTol", 1e-3, \ +%# "NormControl", "on", "OutputFcn", @@odeplot); +%# ode45 (fvdb, [0 20], [2 0], vopt); %# @end example %# @end deftypefn %# @@ -45,8 +50,7 @@ function [varargout] = ode45 (vfun, vslot, vinit, varargin) - %# Check number and types of all input arguments - if (nargin == 0) + if (nargin == 0) %# Check number and types of all input arguments help ('ode45'); error ('OdePkg:InvalidArgument', ... 'Number of input arguments must be greater than zero'); @@ -89,9 +93,9 @@ vfunarguments = {}; end - %# Preprocessing, have a look which options have been set in - %# vodeoptions. Check if a invalid option has been set and print - %# warnings. + %# Start preprocessing, have a look which options have been set in + %# vodeoptions. Check if an invalid or unused option has been set and + %# print warnings. vslot = vslot(:)'; %# Create a row vector vinit = vinit(:)'; %# Create a row vector if (length (vslot) > 2), vstepsizegiven = true; %# Step size checking @@ -267,13 +271,13 @@ else vretvalresult = vinit; end - %# Initialize OutputFcn + %# Initialize the OutputFcn if (vhaveoutputfunction) feval (vodeoptions.OutputFcn, vslot', ... vretvalresult', 'init', vfunarguments{:}); end - %# Initialize EventFcn + %# Initialize the EventFcn if (vhaveeventfunction) odepkg_event_handle (vodeoptions.Events, vtimestamp, ... vretvalresult', 'init', vfunarguments{:}); @@ -291,7 +295,7 @@ vb5 = [16/135; 0; 6656/12825; 28561/56430; -9/50; 2/55]; vc = sum (va, 2); - %# The solver main loop - stop if endpoint has been reached + %# The solver main loop - stop if the endpoint has been reached vcntloop = 2; vcntcycles = 1; vu = vinit; vk = vu' * zeros(1,6); vcntiter = 0; vunhandledtermination = true; while ((vtimestamp < vtimestop && vstepsize >= vminstepsize)) @@ -351,7 +355,8 @@ vretvaltime(vcntloop,:) = vtimestamp; if (vhaveoutputselection) vretvalresult(vcntloop,:) = vu(vodeoptions.OutputSel); - else vretvalresult(vcntloop,:) = vu; + else + vretvalresult(vcntloop,:) = vu; end vcntloop = vcntloop + 1; vcntiter = 0; @@ -432,7 +437,7 @@ warning (['Solver has been stopped by a call of "break" in', ... ' the main iteration loop at time t = %f before endpoint at', ... ' tend = %f was reached. This may happen because the @odeplot', ... - ' function returned zero or the @event function returned one.'], ... + ' function returned "true" or the @event function returned "true".'], ... vtimestamp, vtimestop); end end @@ -475,6 +480,7 @@ varargout{1}.ye = vevent{4}; %# Results when an event occured end if (vhavestats) + varargout{1}.stats = struct; varargout{1}.stats.nsteps = vnsteps; varargout{1}.stats.nfailed = vnfailed; varargout{1}.stats.nfevals = vnfevals; @@ -499,59 +505,163 @@ %# else nothing will be returned, varargout{1} undefined end -%!function ydot = odepkg_equations_vanderpol (tvar, yvar, varargin) -%! mu = 1; -%! ydot = [yvar(2); ... -%! mu * (1 - yvar(1)^2) * yvar(2) - yvar(1)]; -%!test -%! warning ("off", "OdePkg:InvalidOption"); -%! vsol = ode45 (@odepkg_equations_vanderpol, [0 2], [2 0]); -%!test -%! [vx, vy] = ode45 (@odepkg_equations_vanderpol, [0 2], [2 0]); -%!test -%! [vx, vy, va, vb, vc] = ode45 (@odepkg_equations_vanderpol, [0 2], [2 0]); -%!test -%! vsol = ode45 (@odepkg_equations_vanderpol, linspace (0, 0.1, 2), [2 0]); -%!test -%! [vx, vy] = ode45 (@odepkg_equations_vanderpol, linspace (0, 0.1, 2), [2 0]); -%!test -%! [vx, vy, va, vb, vc] = ode45 (@odepkg_equations_vanderpol, linspace (0, 0.1, 2), [0 0]); -%!test -%! A = odeset ('MaxStep', 0.1, 'RelTol', 1e-2, 'AbsTol', 1e-3); -%! vsol = ode45 (@odepkg_equations_vanderpol, [0 2], [2 0], A); -%!test -%! A = odeset ('MaxStep', 0.1, 'RelTol', 1e-2, 'AbsTol', 1e-3); -%! [vx, vy] = ode45 (@odepkg_equations_vanderpol, [0 2], [2 0], A); -%!test -%! A = odeset ('MaxStep', 0.1, 'RelTol', 1e-2, 'AbsTol', 1e-3); -%! [vx, vy, va, vb, vc] = ode45 (@odepkg_equations_vanderpol, [0 2], [2 0], A); -%!test -%! A = odeset ('MaxStep', 0.1, 'RelTol', 1e-2, 'AbsTol', 1e-3); -%! vsol = ode45 (@odepkg_equations_vanderpol, [0 2], [2 0], A, 1.2); -%!test -%! A = odeset ('MaxStep', 0.1, 'RelTol', 1e-2, 'AbsTol', 1e-3); -%! [vx, vy] = ode45 (@odepkg_equations_vanderpol, [0 2], [2 0], A, 1.2); -%!test -%! A = odeset ('MaxStep', 0.1, 'RelTol', 1e-2, 'AbsTol', 1e-3); -%! [vx, vy, va, vb, vc] = ode45 (@odepkg_equations_vanderpol, [0 2], [2 0], A, 1.2); -%! warning ("on", "OdePkg:InvalidOption"); - -%!demo +%! # We are using the "Van der Pol" implementation for all tests that +%! # are done for this function. We also define a Jacobian, Events, +%! # pseudo-Mass implementation. For further tests we also define a +%! # reference solution (computed at high accuracy) and an OutputFcn +%!function [ydot] = fpol (vt, vy, varargin) %# The Van der Pol +%! ydot = [vy(2); (1 - vy(1)^2) * vy(2) - vy(1)]; +%!function [vjac] = fjac (vt, vy, varargin) %# its Jacobian +%! vjac = [0, 1; -1 - 2 * vy(1) * vy(2), 1 - vy(1)^2]; +%!function [vjac] = fjcc (vt, vy, varargin) %# sparse type +%! vjac = [0, 1; -1 - 2 * vy(1) * vy(2), 1 - vy(1)^2]; +%!function [vval, vtrm, vdir] = feve (vt, vy, varargin) +%! vval = fpol (vt, vy, varargin); %# We use the derivatives +%! vtrm = zeros (2,1); %# that's why component 2 +%! vdir = ones (2,1); %# seems to not be exact +%!function [vval, vtrm, vdir] = fevn (vt, vy, varargin) +%! vval = fpol (vt, vy, varargin); %# We use the derivatives +%! vtrm = ones (2,1); %# that's why component 2 +%! vdir = ones (2,1); %# seems to not be exact +%!function [vmas] = fmas (vt, vy) +%! vmas = [1, 0; 0, 1]; %# Dummy mass matrix for tests +%!function [vmas] = fmsa (vt, vy) +%! vmas = sparse ([1, 0; 0, 1]); %# A sparse dummy matrix +%!function [vref] = fref () %# The computed reference solut +%! vref = [0.32331666704577, -1.83297456798624]; +%!function [vout] = fout (vt, vy, vflag, varargin) +%! if (regexp (char (vflag), 'init') == 1) +%! if (any (size (vt) ~= [2, 1])) error ('"fout" step "init"'); end +%! elseif (isempty (vflag)) +%! if (any (size (vt) ~= [1, 1])) error ('"fout" step "calc"'); end +%! vout = false; +%! elseif (regexp (char (vflag), 'done') == 1) +%! if (any (size (vt) ~= [1, 1])) error ('"fout" step "done"'); end +%! else error ('"fout" invalid vflag'); +%! end %! -%! A = odeset ('RelTol', 1e-8); -%! [vx, vy] = ode45 (@odepkg_equations_secondorderlag, [0 2.5], [0 0], ... -%! A, 5, 2, 0.02, 0.1); +%! %# Turn off output of warning messages for all tests, turn them on +%! %# again if the last test is called +%!error %# input argument number one +%! warning ('off', 'OdePkg:InvalidOption'); +%! B = ode45 (1, [0 25], [3 15 1]); +%!error %# input argument number two +%! B = ode45 (@fpol, 1, [3 15 1]); +%!error %# input argument number three +%! B = ode2r (@flor, [0 25], 1); +%!test %# one output argument +%! vsol = ode45 (@fpol, [0 2], [2 0]); +%! assert ([vsol.x(end), vsol.y(end,:)], [2, fref], 1e-3); +%! assert (isfield (vsol, 'solver')); +%! assert (vsol.solver, 'ode45'); +%!test %# two output arguments +%! [vt, vy] = ode45 (@fpol, [0 2], [2 0]); +%! assert ([vt(end), vy(end,:)], [2, fref], 1e-3); +%!test %# five output arguments and no Events +%! [vt, vy, vxe, vye, vie] = ode45 (@fpol, [0 2], [2 0]); +%! assert ([vt(end), vy(end,:)], [2, fref], 1e-3); +%! assert ([vie, vxe, vye], []); +%!test %# anonymous function instead of real function +%! fvdb = @(vt,vy) [vy(2); (1 - vy(1)^2) * vy(2) - vy(1)]; +%! vsol = ode45 (@fpol, [0 2], [2 0]); +%! assert ([vsol.x(end), vsol.y(end,:)], [2, fref], 1e-3); +%!test %# extra input arguments passed trhough +%! vsol = ode45 (@fpol, [0 2], [2 0], 12, 13, 'KL'); +%! assert ([vsol.x(end), vsol.y(end,:)], [2, fref], 1e-3); +%!test %# empty OdePkg structure *but* extra input arguments +%! vopt = odeset; +%! vsol = ode45 (@fpol, [0 2], [2 0], vopt, 12, 13, 'KL'); +%! assert ([vsol.x(end), vsol.y(end,:)], [2, fref], 1e-3); +%!error %# strange OdePkg structure +%! vopt = struct ('foo', 1); +%! vsol = ode45 (@fpol, [0 2], [2 0], vopt); +%!test %# AbsTol option +%! vopt = odeset ('AbsTol', 1e-5); +%! vsol = ode45 (@fpol, [0 2], [2 0], vopt); +%! assert ([vsol.x(end), vsol.y(end,:)], [2, fref], 1e-3); +%!test %# AbsTol and RelTol option +%! vopt = odeset ('AbsTol', 1e-8, 'RelTol', 1e-8); +%! vsol = ode45 (@fpol, [0 2], [2 0], vopt); +%! assert ([vsol.x(end), vsol.y(end,:)], [2, fref], 1e-3); +%!test %# RelTol and NormControl option -- higher accuracy +%! vopt = odeset ('RelTol', 1e-8, 'NormControl', 'on'); +%! vsol = ode45 (@fpol, [0 2], [2 0], vopt); +%! assert ([vsol.x(end), vsol.y(end,:)], [2, fref], 1e-5); +%!test %# Keeps initial values while integrating +%! vopt = odeset ('NonNegative', 2); +%! vsol = ode45 (@fpol, [0 2], [2 0], vopt); +%! assert ([vsol.x(end), vsol.y(end,:)], [2, 2, 0], 0.5); +%!test %# Details of OutputSel and Refine can't be tested +%! vopt = odeset ('OutputFcn', @fout, 'OutputSel', 1, 'Refine', 5); +%! vsol = ode45 (@fpol, [0 2], [2 0], vopt); +%!test %# Stats must add further elements in vsol +%! vopt = odeset ('Stats', 'on'); +%! vsol = ode45 (@fpol, [0 2], [2 0], vopt); +%! assert (isfield (vsol, 'stats')); +%! assert (isfield (vsol.stats, 'nsteps')); +%!test %# InitialStep option +%! vopt = odeset ('InitialStep', 1e-8); +%! vsol = ode45 (@fpol, [0 0.2], [2 0], vopt); +%! assert ([vsol.x(2)-vsol.x(1)], [1e-8], 1e-9); +%!test %# MaxStep option +%! vopt = odeset ('MaxStep', 1e-2); +%! vsol = ode45 (@fpol, [0 0.2], [2 0], vopt); +%! assert ([vsol.x(5)-vsol.x(4)], [1e-2], 1e-3); +%!test %# Events option add further elements in vsol +%! vopt = odeset ('Events', @feve); +%! vsol = ode45 (@fpol, [0 10], [2 0], vopt); +%! assert (isfield (vsol, 'ie')); +%! assert (vsol.ie(1), 2); +%! assert (isfield (vsol, 'xe')); +%! assert (isfield (vsol, 'ye')); +%!test %# Events option, now stop integration +%! vopt = odeset ('Events', @fevn, 'NormControl', 'on'); +%! vsol = ode45 (@fpol, [0 10], [2 0], vopt); +%! assert ([vsol.ie, vsol.xe, vsol.ye], ... +%! [2.0, 2.496110, -0.830550, -2.677589], .5e-1); +%!test %# Events option, five output arguments +%! vopt = odeset ('Events', @fevn, 'NormControl', 'on'); +%! [vt, vy, vxe, vye, vie] = ode45 (@fpol, [0 10], [2 0], vopt); +%! assert ([vie, vxe, vye], ... +%! [2.0, 2.496110, -0.830550, -2.677589], .5e-1); +%!test %# Jacobian option +%! vopt = odeset ('Jacobian', @fjac); +%! vsol = ode45 (@fpol, [0 2], [2 0], vopt); +%! assert ([vsol.x(end), vsol.y(end,:)], [2, fref], 1e-3); +%!test %# Jacobian option and sparse return value +%! vopt = odeset ('Jacobian', @fjcc); +%! vsol = ode45 (@fpol, [0 2], [2 0], vopt); +%! assert ([vsol.x(end), vsol.y(end,:)], [2, fref], 1e-3); %! -%! plot (vx, vy(:,1), '-ob;y, x2;', vx, vy(:,2), '-or;x1;', ... -%! vx, ones(length(vx),1)*5, '-og;u;'); +%! %# test for JPattern option is missing +%! %# test for Vectorized option is missing %! -%! % --------------------------------------------------------------------- -%! % The figure window shows the state variables x1, x2 as well as the -%! % input signal u and the output signal y(=x2) of a second order lag -%! % implementation (cf. the control theory). The function ode45 was -%! % called with an option argument A that has been set before with the -%! % command "odeset" and with further parameters "5, 2, 0.02, 0.1" that -%! % are passed to the set of ordinary differential equations. +%!test %# Mass option as function +%! vopt = odeset ('Mass', @fmas); +%! vsol = ode45 (@fpol, [0 2], [2 0], vopt); +%! assert ([vsol.x(end), vsol.y(end,:)], [2, fref], 1e-3); +%!test %# Mass option as matrix +%! vopt = odeset ('Mass', eye (2,2)); +%! vsol = ode45 (@fpol, [0 2], [2 0], vopt); +%! assert ([vsol.x(end), vsol.y(end,:)], [2, fref], 1e-3); +%!test %# Mass option as sparse matrix +%! vopt = odeset ('Mass', sparse (eye (2,2))); +%! vsol = ode45 (@fpol, [0 2], [2 0], vopt); +%! assert ([vsol.x(end), vsol.y(end,:)], [2, fref], 1e-3); +%!test %# Mass option as function and sparse matrix +%! vopt = odeset ('Mass', @fmsa); +%! vsol = ode45 (@fpol, [0 2], [2 0], vopt); +%! assert ([vsol.x(end), vsol.y(end,:)], [2, fref], 1e-3); +%!test %# Mass option as function and MStateDependence +%! vopt = odeset ('Mass', @fmas, 'MStateDependence', 'strong'); +%! vsol = ode45 (@fpol, [0 2], [2 0], vopt); +%! warning ('on', 'OdePkg:InvalidOption'); +%! assert ([vsol.x(end), vsol.y(end,:)], [2, fref], 1e-3); +%! +%! %# test for MvPattern option is missing +%! %# test for InitialSlope option is missing +%! %# test for MaxOrder option is missing +%! %# test for BDF option is missing %# Local Variables: *** %# mode: octave *** Modified: trunk/octave-forge/main/odepkg/inst/ode54.m =================================================================== --- trunk/octave-forge/main/odepkg/inst/ode54.m 2008-03-06 11:48:17 UTC (rev 4698) +++ trunk/octave-forge/main/odepkg/inst/ode54.m 2008-03-06 19:54:32 UTC (rev 4699) @@ -27,9 +27,14 @@ %# %# If this function is called with more than one return argument then return the time stamps @var{t}, the solution values @var{y} and optionally the extended time stamp information @var{xe}, the extended solution information @var{ye} and the extended index information @var{ie} all of type double column vector. %# -%# Run examples with the command +%# For example, solve an anonymous implementation of the Van der Pol equation +%# %# @example -%# demo ode54 +%# fvdb = @@(vt,vy) [vy(2); (1 - vy(1)^2) * vy(2) - vy(1)]; +%# +%# vopt = odeset ("RelTol", 1e-3, "AbsTol", 1e-3, \ +%# "NormControl", "on", "OutputFcn", @@odeplot); +%# ode23 (fvdb, [0 20], [2 0], vopt); %# @end example %# @end deftypefn %# @@ -46,9 +51,8 @@ function [varargout] = ode54 (vfun, vslot, vinit, varargin) - %# Check number and types of all input arguments - if (nargin == 0) - help ('ode54'); + if (nargin == 0) %# Check number and types of all input arguments + help ('ode23'); error ('OdePkg:InvalidArgument', ... 'Number of input arguments must be greater than zero'); @@ -90,9 +94,9 @@ vfunarguments = {}; end - %# Preprocessing, have a look which options have been set in - %# vodeoptions. Check if a invalid option has been set and print - %# warnings. + %# Start preprocessing, have a look which options have been set in + %# vodeoptions. Check if an invalid or unused option has been set and + %# print warnings. vslot = vslot(:)'; %# Create a row vector vinit = vinit(:)'; %# Create a row vector if (length (vslot) > 2), vstepsizegiven = true; %# Step size checking @@ -268,13 +272,13 @@ else vretvalresult = vinit; end - %# Initialize OutputFcn + %# Initialize the OutputFcn if (vhaveoutputfunction) feval (vodeoptions.OutputFcn, vslot', ... vretvalresult', 'init', vfunarguments{:}); end - %# Initialize EventFcn + %# Initialize the EventFcn if (vhaveeventfunction) odepkg_event_handle (vodeoptions.Events, vtimestamp, ... vretvalresult', 'init', vfunarguments{:}); @@ -293,7 +297,7 @@ vb5 = [5179/57600; 0; 7571/16695; 393/640; -92097/339200; 187/2100; 1/40]; vc = sum (va, 2); - %# The solver main loop - stop if endpoint has been reached + %# The solver main loop - stop if the endpoint has been reached vcntloop = 2; vcntcycles = 1; vu = vinit; vk = vu' * zeros(1,7); vcntiter = 0; vunhandledtermination = true; while ((vtimestamp < vtimestop && vstepsize >= vminstepsize)) @@ -435,7 +439,7 @@ warning (['Solver has been stopped by a call of "break" in', ... ' the main iteration loop at time t = %f before endpoint at', ... ' tend = %f was reached. This may happen because the @odeplot', ... - ' function returned zero or the @event function returned one.'], ... + ' function returned "true" or the @event function returned "true".'], ... vtimestamp, vtimestop); end end @@ -478,6 +482,7 @@ varargout{1}.ye = vevent{4}; %# Results when an event occured end if (vhavestats) + varargout{1}.stats = struct; varargout{1}.stats.nsteps = vnsteps; varargout{1}.stats.nfailed = vnfailed; varargout{1}.stats.nfevals = vnfevals; @@ -502,59 +507,163 @@ %# else nothing will be returned, varargout{1} undefined end -%!function ydot = odepkg_equations_vanderpol (tvar, yvar, varargin) -%! mu = 1; -%! ydot = [yvar(2); ... -%! mu * (1 - yvar(1)^2) * yvar(2) - yvar(1)]; -%!test -%! warning ("off", "OdePkg:InvalidOption"); -%! vsol = ode54 (@odepkg_equations_vanderpol, [0 2], [2 0]); -%!test -%! [vx, vy] = ode54 (@odepkg_equations_vanderpol, [0 2], [2 0]); -%!test -%! [vx, vy, va, vb, vc] = ode54 (@odepkg_equations_vanderpol, [0 2], [2 0]); -%!test -%! vsol = ode54 (@odepkg_equations_vanderpol, linspace (0, 0.1, 2), [2 0]); -%!test -%! [vx, vy] = ode54 (@odepkg_equations_vanderpol, linspace (0, 0.1, 2), [2 0]); -%!test -%! [vx, vy, va, vb, vc] = ode54 (@odepkg_equations_vanderpol, linspace (0, 0.1, 2), [0 0]); -%!test -%! A = odeset ('MaxStep', 0.1, 'RelTol', 1e-2, 'AbsTol', 1e-3); -%! vsol = ode54 (@odepkg_equations_vanderpol, [0 2], [2 0], A); -%!test -%! A = odeset ('MaxStep', 0.1, 'RelTol', 1e-2, 'AbsTol', 1e-3); -%! [vx, vy] = ode54 (@odepkg_equations_vanderpol, [0 2], [2 0], A); -%!test -%! A = odeset ('MaxStep', 0.1, 'RelTol', 1e-2, 'AbsTol', 1e-3); -%! [vx, vy, va, vb, vc] = ode54 (@odepkg_equations_vanderpol, [0 2], [2 0], A); -%!test -%! A = odeset ('MaxStep', 0.1, 'RelTol', 1e-2, 'AbsTol', 1e-3); -%! vsol = ode54 (@odepkg_equations_vanderpol, [0 2], [2 0], A, 1.2); -%!test -%! A = odeset ('MaxStep', 0.1, 'RelTol', 1e-2, 'AbsTol', 1e-3); -%! [vx, vy] = ode54 (@odepkg_equations_vanderpol, [0 2], [2 0], A, 1.2); -%!test -%! A = odeset ('MaxStep', 0.1, 'RelTol', 1e-2, 'AbsTol', 1e-3); -%! [vx, vy, va, vb, vc] = ode54 (@odepkg_equations_vanderpol, [0 2], [2 0], A, 1.2); -%! warning ("on", "OdePkg:InvalidOption"); - -%!demo +%! # We are using the "Van der Pol" implementation for all tests that +%! # are done for this function. We also define a Jacobian, Events, +%! # pseudo-Mass implementation. For further tests we also define a +%! # reference solution (computed at high accuracy) and an OutputFcn +%!function [ydot] = fpol (vt, vy, varargin) %# The Van der Pol +%! ydot = [vy(2); (1 - vy(1)^2) * vy(2) - vy(1)]; +%!function [vjac] = fjac (vt, vy, varargin) %# its Jacobian +%! vjac = [0, 1; -1 - 2 * vy(1) * vy(2), 1 - vy(1)^2]; +%!function [vjac] = fjcc (vt, vy, varargin) %# sparse type +%! vjac = [0, 1; -1 - 2 * vy(1) * vy(2), 1 - vy(1)^2]; +%!function [vval, vtrm, vdir] = feve (vt, vy, varargin) +%! vval = fpol (vt, vy, varargin); %# We use the derivatives +%! vtrm = zeros (2,1); %# that's why component 2 +%! vdir = ones (2,1); %# seems to not be exact +%!function [vval, vtrm, vdir] = fevn (vt, vy, varargin) +%! vval = fpol (vt, vy, varargin); %# We use the derivatives +%! vtrm = ones (2,1); %# that's why component 2 +%! vdir = ones (2,1); %# seems to not be exact +%!function [vmas] = fmas (vt, vy) +%! vmas = [1, 0; 0, 1]; %# Dummy mass matrix for tests +%!function [vmas] = fmsa (vt, vy) +%! vmas = sparse ([1, 0; 0, 1]); %# A sparse dummy matrix +%!function [vref] = fref () %# The computed reference solut +%! vref = [0.32331666704577, -1.83297456798624]; +%!function [vout] = fout (vt, vy, vflag, varargin) +%! if (regexp (char (vflag), 'init') == 1) +%! if (any (size (vt) ~= [2, 1])) error ('"fout" step "init"'); end +%! elseif (isempty (vflag)) +%! if (any (size (vt) ~= [1, 1])) error ('"fout" step "calc"'); end +%! vout = false; +%! elseif (regexp (char (vflag), 'done') == 1) +%! if (any (size (vt) ~= [1, 1])) error ('"fout" step "done"'); end +%! else error ('"fout" invalid vflag'); +%! end %! -%! A = odeset ('RelTol', 1e-9); -%! [vx, vy] = ode54 (@odepkg_equations_secondorderlag, [0 2.5], [0 0], ... -%! A, 5, 2, 0.02, 0.1); +%! %# Turn off output of warning messages for all tests, turn them on +%! %# again if the last test is called +%!error %# input argument number one +%! warning ('off', 'OdePkg:InvalidOption'); +%! B = ode23 (1, [0 25], [3 15 1]); +%!error %# input argument number two +%! B = ode23 (@fpol, 1, [3 15 1]); +%!error %# input argument number three +%! B = ode2r (@flor, [0 25], 1); +%!test %# one output argument +%! vsol = ode23 (@fpol, [0 2], [2 0]); +%! assert ([vsol.x(end), vsol.y(end,:)], [2, fref], 1e-3); +%! assert (isfield (vsol, 'solver')); +%! assert (vsol.solver, 'ode23'); +%!test %# two output arguments +%! [vt, vy] = ode23 (@fpol, [0 2], [2 0]); +%! assert ([vt(end), vy(end,:)], [2, fref], 1e-3); +%!test %# five output arguments and no Events +%! [vt, vy, vxe, vye, vie] = ode23 (@fpol, [0 2], [2 0]); +%! assert ([vt(end), vy(end,:)], [2, fref], 1e-3); +%! assert ([vie, vxe, vye], []); +%!test %# anonymous function instead of real function +%! fvdb = @(vt,vy) [vy(2); (1 - vy(1)^2) * vy(2) - vy(1)]; +%! vsol = ode23 (@fpol, [0 2], [2 0]); +%! assert ([vsol.x(end), vsol.y(end,:)], [2, fref], 1e-3); +%!test %# extra input arguments passed trhough +%! vsol = ode23 (@fpol, [0 2], [2 0], 12, 13, 'KL'); +%! assert ([vsol.x(end), vsol.y(end,:)], [2, fref], 1e-3); +%!test %# empty OdePkg structure *but* extra input arguments +%! vopt = odeset; +%! vsol = ode23 (@fpol, [0 2], [2 0], vopt, 12, 13, 'KL'); +%! assert ([vsol.x(end), vsol.y(end,:)], [2, fref], 1e-3); +%!error %# strange OdePkg structure +%! vopt = struct ('foo', 1); +%! vsol = ode23 (@fpol, [0 2], [2 0], vopt); +%!test %# AbsTol option +%! vopt = odeset ('AbsTol', 1e-5); +%! vsol = ode23 (@fpol, [0 2], [2 0], vopt); +%! assert ([vsol.x(end), vsol.y(end,:)], [2, fref], 1e-3); +%!test %# AbsTol and RelTol option +%! vopt = odeset ('AbsTol', 1e-8, 'RelTol', 1e-8); +%! vsol = ode23 (@fpol, [0 2], [2 0], vopt); +%! assert ([vsol.x(end), vsol.y(end,:)], [2, fref], 1e-3); +%!test %# RelTol and NormControl option -- higher accuracy +%! vopt = odeset ('RelTol', 1e-8, 'NormControl', 'on'); +%! vsol = ode23 (@fpol, [0 2], [2 0], vopt); +%! assert ([vsol.x(end), vsol.y(end,:)], [2, fref], 1e-6); +%!test %# Keeps initial values while integrating +%! vopt = odeset ('NonNegative', 2); +%! vsol = ode23 (@fpol, [0 2], [2 0], vopt); +%! assert ([vsol.x(end), vsol.y(end,:)], [2, 2, 0], 1e-1); +%!test %# Details of OutputSel and Refine can't be tested +%! vopt = odeset ('OutputFcn', @fout, 'OutputSel', 1, 'Refine', 5); +%! vsol = ode23 (@fpol, [0 2], [2 0], vopt); +%!test %# Stats must add further elements in vsol +%! vopt = odeset ('Stats', 'on'); +%! vsol = ode23 (@fpol, [0 2], [2 0], vopt); +%! assert (isfield (vsol, 'stats')); +%! assert (isfield (vsol.stats, 'nsteps')); +%!test %# InitialStep option +%! vopt = odeset ('InitialStep', 1e-8); +%! vsol = ode23 (@fpol, [0 0.2], [2 0], vopt); +%! assert ([vsol.x(2)-vsol.x(1)], [1e-8], 1e-9); +%!test %# MaxStep option +%! vopt = odeset ('MaxStep', 1e-2); +%! vsol = ode23 (@fpol, [0 0.2], [2 0], vopt); +%! assert ([vsol.x(5)-vsol.x(4)], [1e-2], 1e-3); +%!test %# Events option add further elements in vsol +%! vopt = odeset ('Events', @feve); +%! vsol = ode23 (@fpol, [0 10], [2 0], vopt); +%! assert (isfield (vsol, 'ie')); +%! assert (vsol.ie, [2; 1; 2]); +%! assert (isfield (vsol, 'xe')); +%! assert (isfield (vsol, 'ye')); +%!test %# Events option, now stop integration +%! vopt = odeset ('Events', @fevn, 'NormControl', 'on'); +%! vsol = ode23 (@fpol, [0 10], [2 0], vopt); +%! assert ([vsol.ie, vsol.xe, vsol.ye], ... +%! [2.0, 2.496110, -0.830550, -2.677589], 1e-3); +%!test %# Events option, five output arguments +%! vopt = odeset ('Events', @fevn, 'NormControl', 'on'); +%! [vt, vy, vxe, vye, vie] = ode23 (@fpol, [0 10], [2 0], vopt); +%! assert ([vie, vxe, vye], ... +%! [2.0, 2.496110, -0.830550, -2.677589], 1e-3); +%!test %# Jacobian option +%! vopt = odeset ('Jacobian', @fjac); +%! vsol = ode23 (@fpol, [0 2], [2 0], vopt); +%! assert ([vsol.x(end), vsol.y(end,:)], [2, fref], 1e-3); +%!test %# Jacobian option and sparse return value +%! vopt = odeset ('Jacobian', @fjcc); +%! vsol = ode23 (@fpol, [0 2], [2 0], vopt); +%! assert ([vsol.x(end), vsol.y(end,:)], [2, fref], 1e-3); %! -%! plot (vx, vy(:,1), '-ob;y, x2;', vx, vy(:,2), '-or;x1;', ... -%! vx, ones(length(vx),1)*5, '-og;u;'); +%! %# test for JPattern option is missing +%! %# test for Vectorized option is missing %! -%! % --------------------------------------------------------------------- -%! % The figure window shows the state variables x1, x2 as well as the -%! % input signal u and the output signal y(=x2) of a second order lag -%! % implementation (cf. the control theory). The function ode54 was -%! % called with an option argument A that has been set before with the -%! % command "odeset" and with further parameters "5, 2, 0.02, 0.1" that -%! % are passed to the set of ordinary differential equations. +%!test %# Mass option as function +%! vopt = odeset ('Mass', @fmas); +%! vsol = ode23 (@fpol, [0 2], [2 0], vopt); +%! assert ([vsol.x(end), vsol.y(end,:)], [2, fref], 1e-3); +%!test %# Mass option as matrix +%! vopt = odeset ('Mass', eye (2,2)); +%! vsol = ode23 (@fpol, [0 2], [2 0], vopt); +%! assert ([vsol.x(end), vsol.y(end,:)], [2, fref], 1e-3); +%!test %# Mass option as sparse matrix +%! vopt = odeset ('Mass', sparse (eye (2,2))); +%! vsol = ode23 (@fpol, [0 2], [2 0], vopt); +%! assert ([vsol.x(end), vsol.y(end,:)], [2, fref], 1e-3); +%!test %# Mass option as function and sparse matrix +%! vopt = odeset ('Mass', @fmsa); +%! vsol = ode23 (@fpol, [0 2], [2 0], vopt); +%! assert ([vsol.x(end), vsol.y(end,:)], [2, fref], 1e-3); +%!test %# Mass option as function and MStateDependence +%! vopt = odeset ('Mass', @fmas, 'MStateDependence', 'strong'); +%! vsol = ode23 (@fpol, [0 2], [2 0], vopt); +%! warning ('on', 'OdePkg:InvalidOption'); +%! assert ([vsol.x(end), vsol.y(end,:)], [2, fref], 1e-3); +%! +%! %# test for MvPattern option is missing +%! %# test for InitialSlope option is missing +%! %# test for MaxOrder option is missing +%! %# test for BDF option is missing %# Local Variables: *** %# mode: octave *** Modified: trunk/octave-forge/main/odepkg/inst/ode78.m =================================================================== --- trunk/octave-forge/main/odepkg/inst/ode78.m 2008-03-06 11:48:17 UTC (rev 4698) +++ trunk/octave-forge/main/odepkg/inst/ode78.m 2008-03-06 19:54:32 UTC (rev 4699) @@ -27,9 +27,14 @@ %# %# If this function is called with more than one return argument then return the time stamps @var{t}, the solution values @var{y} and optionally the extended time stamp information @var{xe}, the extended solution information @var{ye} and the extended index information @var{ie} all of type double column vector. %# -%# Run examples with the command +%# For example, solve an anonymous implementation of the Van der Pol equation +%# %# @example -%# demo ode78 +%# fvdb = @@(vt,vy) [vy(2); (1 - vy(1)^2) * vy(2) - vy(1)]; +%# +%# vopt = odeset ("RelTol", 1e-3, "AbsTol", 1e-3, \ +%# "NormControl", "on", "OutputFcn", @@odeplot); +%# ode78 (fvdb, [0 20], [2 0], vopt); %# @end example %# @end deftypefn %# @@ -49,7 +54,7 @@ if (nargin == 0) %# Check number and types of all input arguments help ('ode78'); error ('OdePkg:InvalidArgument', ... - 'Number of input arguments must be greater than zero'); + 'Number of input arguments must be greater than zero'); elseif (nargin < 3) print_usage; @@ -89,9 +94,9 @@ vfunarguments = {}; end - %# Preprocessing, have a look which options have been set in - %# vodeoptions. Check if a invalid option has been set and print - %# warnings. + %# Start preprocessing, have a look which options have been set in + %# vodeoptions. Check if an invalid or unused option has been set and + %# print warnings. vslot = vslot(:)'; %# Create a row vector vinit = vinit(:)'; %# Create a row vector if (length (vslot) > 2), vstepsizegiven = true; %# Step size checking @@ -267,13 +272,13 @@ else vretvalresult = vinit; end - %# Initialize OutputFcn + %# Initialize the OutputFcn if (vhaveoutputfunction) feval (vodeoptions.OutputFcn, vslot', ... vretvalresult', 'init', vfunarguments{:}); end - %# Initialize EventFcn + %# Initialize the EventFcn if (vhaveeventfunction) odepkg_event_handle (vodeoptions.Events, vtimestamp, ... vretvalresult', 'init', vfunarguments{:}); @@ -312,7 +317,7 @@ 118820643/751138087; -528747749/2220607170; 1/4]; vc = sum (va, 2); - %# The solver main loop - stop if endpoint has been reached + %# The solver main loop - stop if the endpoint has been reached vcntloop = 2; vcntcycles = 1; vu = vinit; vk = vu' * zeros(1,13); vcntiter = 0; vunhandledtermination = true; while ((vtimestamp < vtimestop && vstepsize >= vminstepsize)) @@ -454,7 +459,7 @@ warning (['Solver has been stopped by a call of "break" in', ... ' the main iteration loop at time t = %f before endpoint at', ... ' tend = %f was reached. This may happen because the @odeplot', ... - ' function returned zero or the @event function returned one.'], ... + ' function returned "true" or the @event function returned "true".'], ... vtimestamp, vtimestop); end end @@ -497,6 +502,7 @@ varargout{1}.ye = vevent{4}; %# Results when an event occured end if (vhavestats) + varargout{1}.stats = struct; varargout{1}.stats.nsteps = vnsteps; varargout{1}.stats.nfailed = vnfailed; varargout{1}.stats.nfevals = vnfevals; @@ -521,59 +527,163 @@ %# else nothing will be returned, varargout{1} undefined end -%!function ydot = odepkg_equations_vanderpol (tvar, yvar, varargin) -%! mu = 1; -%! ydot = [yvar(2); ... -%! mu * (1 - yvar(1)^2) * yvar(2) - yvar(1)]; -%!test -%! warning ("off", "OdePkg:InvalidOption"); -%! vsol = ode78 (@odepkg_equations_vanderpol, [0 2], [2 0]); -%!test -%! [vx, vy] = ode78 (@odepkg_equations_vanderpol, [0 2], [2 0]); -%!test -%! [vx, vy, va, vb, vc] = ode78 (@odepkg_equations_vanderpol, [0 2], [2 0]); -%!test -%! vsol = ode78 (@odepkg_equations_vanderpol, linspace (0, 0.1, 2), [2 0]); -%!test -%! [vx, vy] = ode78 (@odepkg_equations_vanderpol, linspace (0, 0.1, 2), [2 0]); -%!test -%! [vx, vy, va, vb, vc] = ode78 (@odepkg_equations_vanderpol, linspace (0, 0.1, 2), [0 0]); -%!test -%! A = odeset ('MaxStep', 0.1, 'RelTol', 1e-2, 'AbsTol', 1e-3); -%! vsol = ode78 (@odepkg_equations_vanderpol, [0 2], [2 0], A); -%!test -%! A = odeset ('MaxStep', 0.1, 'RelTol', 1e-2, 'AbsTol', 1e-3); -%! [vx, vy] = ode78 (@odepkg_equations_vanderpol, [0 2], [2 0], A); -%!test -%! A = odeset ('MaxStep', 0.1, 'RelTol', 1e-2, 'AbsTol', 1e-3); -%! [vx, vy, va, vb, vc] = ode78 (@odepkg_equations_vanderpol, [0 2], [2 0], A); -%!test -%! A = odeset ('MaxStep', 0.1, 'RelTol', 1e-2, 'AbsTol', 1e-3); -%! vsol = ode78 (@odepkg_equations_vanderpol, [0 2], [2 0], A, 1.2); -%!test -%! A = odeset ('MaxStep', 0.1, 'RelTol', 1e-2, 'AbsTol', 1e-3); -%! [vx, vy] = ode78 (@odepkg_equations_vanderpol, [0 2], [2 0], A, 1.2); -%!test -%! A = odeset ('MaxStep', 0.1, 'RelTol', 1e-2, 'AbsTol', 1e-3); -%! [vx, vy, va, vb, vc] = ode78 (@odepkg_equations_vanderpol, [0 2], [2 0], A, 1.2); -%! warning ("on", "OdePkg:InvalidOption"); - -%!demo +%! # We are using the "Van der Pol" implementation for all tests that +%! # are done for this function. We also define a Jacobian, Events, +%! # pseudo-Mass implementation. For further tests we also define a +%! # reference solution (computed at high accuracy) and an OutputFcn +%!function [ydot] = fpol (vt, vy, varargin) %# The Van der Pol +%! ydot = [vy(2); (1 - vy(1)^2) * vy(2) - vy(1)]; +%!function [vjac] = fjac (vt, vy, varargin) %# its Jacobian +%! vjac = [0, 1; -1 - 2 * vy(1) * vy(2), 1 - vy(1)^2]; +%!function [vjac] = fjcc (vt, vy, varargin) %# sparse type +%! vjac = [0, 1; -1 - 2 * vy(1) * vy(2), 1 - vy(1)^2]; +%!function [vval, vtrm, vdir] = feve (vt, vy, varargin) +%! vval = fpol (vt, vy, varargin); %# We use the derivatives +%! vtrm = zeros (2,1); %# that's why component 2 +%! vdir = ones (2,1); %# seems to not be exact +%!function [vval, vtrm, vdir] = fevn (vt, vy, varargin) +%! vval = fpol (vt, vy, varargin); %# We use the derivatives +%! vtrm = ones (2,1); %# that's why component 2 +%! vdir = ones (2,1); %# seems to not be exact +%!function [vmas] = fmas (vt, vy) +%! vmas = [1, 0; 0, 1]; %# Dummy mass matrix for tests +%!function [vmas] = fmsa (vt, vy) +%! vmas = sparse ([1, 0; 0, 1]); %# A sparse dummy matrix +%!function [vref] = fref () %# The computed reference solut +%! vref = [0.32331666704577, -1.83297456798624]; +%!function [vout] = fout (vt, vy, vflag, varargin) +%! if (regexp (char (vflag), 'init') == 1) +%! if (any (size (vt) ~= [2, 1])) error ('"fout" step "init"'); end +%! elseif (isempty (vflag)) +%! if (any (size (vt) ~= [1, 1])) error ('"fout" step "calc"'); end +%! vout = false; +%! elseif (regexp (char (vflag), 'done') == 1) +%! if (any (size (vt) ~= [1, 1])) error ('"fout" step "done"'); end +%! else error ('"fout" invalid vflag'); +%! end %! -%! A = odeset ('RelTol', 1e-9); -%! [vx, vy] = ode78 (@odepkg_equations_secondorderlag, [0 2.5], [0 0], ... -%! A, 5, 2, 0.02, 0.1); +%! %# Turn off output of warning messages for all tests, turn them on +%! %# again if the last test is called +%!error %# input argument number one +%! warning ('off', 'OdePkg:InvalidOption'); +%! B = ode78 (1, [0 25], [3 15 1]); +%!error %# input argument number two +%! B = ode78 (@fpol, 1, [3 15 1]); +%!error %# input argument number three +%! B = ode2r (@flor, [0 25], 1); +%!test %# one output argument +%! vsol = ode78 (@fpol, [0 2], [2 0]); +%! assert ([vsol.x(end), vsol.y(end,:)], [2, fref], 1e-3); +%! assert (isfield (vsol, 'solver')); +%! assert (vsol.solver, 'ode78'); +%!test %# two output arguments +%! [vt, vy] = ode78 (@fpol, [0 2], [2 0]); +%! assert ([vt(end), vy(end,:)], [2, fref], 1e-3); +%!test %# five output arguments and no Events +%! [vt, vy, vxe, vye, vie] = ode78 (@fpol, [0 2], [2 0]); +%! assert ([vt(end), vy(end,:)], [2, fref], 1e-3); +%! assert ([vie, vxe, vye], []); +%!test %# anonymous function instead of real function +%! fvdb = @(vt,vy) [vy(2); (1 - vy(1)^2) * vy(2) - vy(1)]; +%! vsol = ode78 (@fpol, [0 2], [2 0]); +%! assert ([vsol.x(end), vsol.y(end,:)], [2, fref], 1e-3); +%!test %# extra input arguments passed trhough +%! vsol = ode78 (@fpol, [0 2], [2 0], 12, 13, 'KL'); +%! assert ([vsol.x(end), vsol.y(end,:)], [2, fref], 1e-3); +%!test %# empty OdePkg structure *but* extra input arguments +%! vopt = odeset; +%! vsol = ode78 (@fpol, [0 2], [2 0], vopt, 12, 13, 'KL'); +%! assert ([vsol.x(end), vsol.y(end,:)], [2, fref], 1e-3); +%!error %# strange OdePkg structure +%! vopt = struct ('foo', 1); +%! vsol = ode78 (@fpol, [0 2], [2 0], vopt); +%!test %# AbsTol option +%! vopt = odeset ('AbsTol', 1e-5); +%! vsol = ode78 (@fpol, [0 2], [2 0], vopt); +%! assert ([vsol.x(end), vsol.y(end,:)], [2, fref], 1e-3); +%!test %# AbsTol and RelTol option +%! vopt = odeset ('AbsTol', 1e-8, 'RelTol', 1e-8); +%! vsol = ode78 (@fpol, [0 2], [2 0], vopt); +%! assert ([vsol.x(end), vsol.y(end,:)], [2, fref], 1e-3); +%!test %# RelTol and NormControl option -- higher accuracy +%! vopt = odeset ('RelTol', 1e-8, 'NormControl', 'on'); +%! vsol = ode78 (@fpol, [0 2], [2 0], vopt); +%! assert ([vsol.x(end), vsol.y(end,:)], [2, fref], 1e-6); +%!test %# Keeps initial values while integrating +%! vopt = odeset ('NonNegative', 2); +%! vsol = ode78 (@fpol, [0 2], [2 0], vopt); +%! assert ([vsol.x(end), vsol.y(end,:)], [2, 2, 0], 0.5); +%!test %# Details of OutputSel and Refine can't be tested +%! vopt = odeset ('OutputFcn', @fout, 'OutputSel', 1, 'Refine', 5); +%! vsol = ode78 (@fpol, [0 2], [2 0], vopt); +%!test %# Stats must add further elements in vsol +%! vopt = odeset ('Stats', 'on'); +%! vsol = ode78 (@fpol, [0 2], [2 0], vopt); +%! assert (isfield (vsol, 'stats')); +%! assert (isfield (vsol.stats, 'nsteps')); +%!test %# InitialStep option +%! vopt = odeset ('InitialStep', 1e-8); +%! vsol = ode78 (@fpol, [0 0.2], [2 0], vopt); +%! assert ([vsol.x(2)-vsol.x(1)], [1e-8], 1e-9); +%!test %# MaxStep option +%! vopt = odeset ('MaxStep', 1e-2); +%! vsol = ode78 (@fpol, [0 0.2], [2 0], vopt); +%! assert ([vsol.x(5)-vsol.x(4)], [1e-2], 1e-3); +%!test %# Events option add further elements in vsol +%! vopt = odeset ('Events', @feve); +%! vsol = ode78 (@fpol, [0 10], [2 0], vopt); +%! assert (isfield (vsol, 'ie')); +%! assert (vsol.ie(1), 2); +%! assert (isfield (vsol, 'xe')); +%! assert (isfield (vsol, 'ye')); +%!test %# Events option, now stop integration +%! vopt = odeset ('Events', @fevn, 'NormControl', 'on'); +%! vsol = ode78 (@fpol, [0 10], [2 0], vopt); +%! assert ([vsol.ie, vsol.xe, vsol.ye], ... +%! [2.0, 2.496110, -0.830550, -2.677589], 1e-1); +%!test %# Events option, five output arguments +%! vopt = odeset ('Events', @fevn, 'NormControl', 'on'); +%! [vt, vy, vxe, vye, vie] = ode78 (@fpol, [0 10], [2 0], vopt); +%! assert ([vie, vxe, vye], ... +%! [2.0, 2.496110, -0.830550, -2.677589], 1e-1); +%!test %# Jacobian option +%! vopt = odeset ('Jacobian', @fjac); +%! vsol = ode78 (@fpol, [0 2], [2 0], vopt); +%! assert ([vsol.x(end), vsol.y(end,:)], [2, fref], 1e-3); +%!test %# Jacobian option and sparse return value +%! vopt = odeset ('Jacobian', @fjcc); +%! vsol = ode78 (@fpol, [0 2], [2 0], vopt); +%! assert ([vsol.x(end), vsol.y(end,:)], [2, fref], 1e-3); %! -%! plot (vx, vy(:,1), '-ob;y, x2;', vx, vy(:,2), '-or;x1;', ... -%! vx, ones(length(vx),1)*5, '-og;u;'); +%! %# test for JPattern option is missing +%! %# test for Vectorized option is missing %! -%! % --------------------------------------------------------------------- -%! % The figure window shows the state variables x1, x2 as well as the -%! % input signal u and the output signal y(=x2) of a second order lag -%! % implementation (cf. the control theory). The function ode78 was -%! % called with an option argument A that has been set before with the -%! % command "odeset" and with further parameters "5, 2, 0.02, 0.1" that -%! % are passed to the set of ordinary differential equations. +%!test %# Mass option as function +%! vopt = odeset ('Mass', @fmas); +%! vsol = ode78 (@fpol, [0 2], [2 0], vopt); +%! assert ([vsol.x(end), vsol.y(end,:)], [2, fref], 1e-3); +%!test %# Mass option as matrix +%! vopt = odeset ('Mass', eye (2,2)); +%! vsol = ode78 (@fpol, [0 2], [2 0], vopt); +%! assert ([vsol.x(end), vsol.y(end,:)], [2, fref], 1e-3); +%!test %# Mass option as sparse matrix +%! vopt = odeset ('Mass', sparse (eye (2,2))); +%! vsol = ode78 (@fpol, [0 2], [2 0], vopt); +%! assert ([vsol.x(end), vsol.y(end,:)], [2, fref], 1e-3); +%!test %# Mass option as function and sparse matrix +%! vopt = odeset ('Mass', @fmsa); +%! vsol = ode78 (@fpol, [0 2], [2 0], vopt); +%! assert ([vsol.x(end), vsol.y(end,:)], [2, fref], 1e-3); +%!test %# Mass option as function and MStateDependence +%! vopt = odeset ('Mass', @fmas, 'MStateDependence', 'strong'); +%! vsol = ode78 (@fpol, [0 2], [2 0], vopt); +%! warning ('on', 'OdePkg:InvalidOption'); +%! assert ([vsol.x(end), vsol.y(end,:)], [2, fref], 1e-3); +%! +%! %# test for MvPattern option is missing +%! %# test for InitialSlope option is missing +%! %# test for MaxOrder option is missing +%! %# test for BDF option is missing %# Local Variables: *** %# mode: octave *** This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <tr...@us...> - 2008-03-09 21:29:07
|
Revision: 4707 http://octave.svn.sourceforge.net/octave/?rev=4707&view=rev Author: treichl Date: 2008-03-09 14:29:01 -0700 (Sun, 09 Mar 2008) Log Message: ----------- Minor changes. Modified Paths: -------------- trunk/octave-forge/main/odepkg/inst/ode45.m trunk/octave-forge/main/odepkg/inst/ode54.m trunk/octave-forge/main/odepkg/inst/ode78.m Modified: trunk/octave-forge/main/odepkg/inst/ode45.m =================================================================== --- trunk/octave-forge/main/odepkg/inst/ode45.m 2008-03-09 21:28:33 UTC (rev 4706) +++ trunk/octave-forge/main/odepkg/inst/ode45.m 2008-03-09 21:29:01 UTC (rev 4707) @@ -66,7 +66,7 @@ error ('OdePkg:InvalidArgument', ... 'Second input argument must be a valid vector'); - elseif (~isnumeric (vinit)) + elseif (~isvector (vinit) || ~isnumeric (vinit)) error ('OdePkg:InvalidArgument', ... 'Third input argument must be a valid numerical value'); @@ -434,11 +434,12 @@ ' vminstepsize. Try to reduce the value of "InitialStep" and/or', ... ' "MaxStep" with the command "odeset".\n'], vtimestamp, vtimestop); else - warning (['Solver has been stopped by a call of "break" in', ... - ' the main iteration loop at time t = %f before endpoint at', ... - ' tend = %f was reached. This may happen because the @odeplot', ... - ' function returned "true" or the @event function returned "true".'], ... - vtimestamp, vtimestop); + warning ('OdePkg:HideWarning', ... + ['Solver has been stopped by a call of "break" in', ... + ' the main iteration loop at time t = %f before endpoint at', ... + ' tend = %f was reached. This may happen because the @odeplot', ... + ' function returned "true" or the @event function returned "true".'], ... + vtimestamp, vtimestop); end end @@ -615,6 +616,7 @@ %! assert (isfield (vsol, 'xe')); %! assert (isfield (vsol, 'ye')); %!test %# Events option, now stop integration +%! warning ('off', 'OdePkg:HideWarning'); %! vopt = odeset ('Events', @fevn, 'NormControl', 'on'); %! vsol = ode45 (@fpol, [0 10], [2 0], vopt); %! assert ([vsol.ie, vsol.xe, vsol.ye], ... @@ -624,6 +626,7 @@ %! [vt, vy, vxe, vye, vie] = ode45 (@fpol, [0 10], [2 0], vopt); %! assert ([vie, vxe, vye], ... %! [2.0, 2.496110, -0.830550, -2.677589], .5e-1); +%! warning ('on', 'OdePkg:HideWarning'); %!test %# Jacobian option %! vopt = odeset ('Jacobian', @fjac); %! vsol = ode45 (@fpol, [0 2], [2 0], vopt); Modified: trunk/octave-forge/main/odepkg/inst/ode54.m =================================================================== --- trunk/octave-forge/main/odepkg/inst/ode54.m 2008-03-09 21:28:33 UTC (rev 4706) +++ trunk/octave-forge/main/odepkg/inst/ode54.m 2008-03-09 21:29:01 UTC (rev 4707) @@ -67,7 +67,7 @@ error ('OdePkg:InvalidArgument', ... 'Second input argument must be a valid vector'); - elseif (~isnumeric (vinit)) + elseif (~isvector (vinit) || ~isnumeric (vinit)) error ('OdePkg:InvalidArgument', ... 'Third input argument must be a valid numerical value'); @@ -436,11 +436,12 @@ ' vminstepsize. Try to reduce the value of "InitialStep" and/or', ... ' "MaxStep" with the command "odeset".\n'], vtimestamp, vtimestop); else - warning (['Solver has been stopped by a call of "break" in', ... - ' the main iteration loop at time t = %f before endpoint at', ... - ' tend = %f was reached. This may happen because the @odeplot', ... - ' function returned "true" or the @event function returned "true".'], ... - vtimestamp, vtimestop); + warning ('OdePkg:HideWarning', ... + ['Solver has been stopped by a call of "break" in', ... + ' the main iteration loop at time t = %f before endpoint at', ... + ' tend = %f was reached. This may happen because the @odeplot', ... + ' function returned "true" or the @event function returned "true".'], ... + vtimestamp, vtimestop); end end @@ -617,6 +618,7 @@ %! assert (isfield (vsol, 'xe')); %! assert (isfield (vsol, 'ye')); %!test %# Events option, now stop integration +%! warning ('off', 'OdePkg:HideWarning'); %! vopt = odeset ('Events', @fevn, 'NormControl', 'on'); %! vsol = ode54 (@fpol, [0 10], [2 0], vopt); %! assert ([vsol.ie, vsol.xe, vsol.ye], ... @@ -626,6 +628,7 @@ %! [vt, vy, vxe, vye, vie] = ode54 (@fpol, [0 10], [2 0], vopt); %! assert ([vie, vxe, vye], ... %! [2.0, 2.496110, -0.830550, -2.677589], .5e-1); +%! warning ('on', 'OdePkg:HideWarning'); %!test %# Jacobian option %! vopt = odeset ('Jacobian', @fjac); %! vsol = ode54 (@fpol, [0 2], [2 0], vopt); Modified: trunk/octave-forge/main/odepkg/inst/ode78.m =================================================================== --- trunk/octave-forge/main/odepkg/inst/ode78.m 2008-03-09 21:28:33 UTC (rev 4706) +++ trunk/octave-forge/main/odepkg/inst/ode78.m 2008-03-09 21:29:01 UTC (rev 4707) @@ -67,7 +67,7 @@ error ('OdePkg:InvalidArgument', ... 'Second input argument must be a valid vector'); - elseif (~isnumeric (vinit)) + elseif (~isvector (vinit) || ~isnumeric (vinit)) error ('OdePkg:InvalidArgument', ... 'Third input argument must be a valid numerical value'); @@ -456,11 +456,12 @@ ' vminstepsize. Try to reduce the value of "InitialStep" and/or', ... ' "MaxStep" with the command "odeset".\n'], vtimestamp, vtimestop); else - warning (['Solver has been stopped by a call of "break" in', ... - ' the main iteration loop at time t = %f before endpoint at', ... - ' tend = %f was reached. This may happen because the @odeplot', ... - ' function returned "true" or the @event function returned "true".'], ... - vtimestamp, vtimestop); + warning ('OdePkg:HideWarning', ... + ['Solver has been stopped by a call of "break" in', ... + ' the main iteration loop at time t = %f before endpoint at', ... + ' tend = %f was reached. This may happen because the @odeplot', ... + ' function returned "true" or the @event function returned "true".'], ... + vtimestamp, vtimestop); end end @@ -637,6 +638,7 @@ %! assert (isfield (vsol, 'xe')); %! assert (isfield (vsol, 'ye')); %!test %# Events option, now stop integration +%! warning ('off', 'OdePkg:HideWarning'); %! vopt = odeset ('Events', @fevn, 'NormControl', 'on'); %! vsol = ode78 (@fpol, [0 10], [2 0], vopt); %! assert ([vsol.ie, vsol.xe, vsol.ye], ... @@ -646,6 +648,7 @@ %! [vt, vy, vxe, vye, vie] = ode78 (@fpol, [0 10], [2 0], vopt); %! assert ([vie, vxe, vye], ... %! [2.0, 2.496110, -0.830550, -2.677589], 1e-1); +%! warning ('on', 'OdePkg:HideWarning'); %!test %# Jacobian option %! vopt = odeset ('Jacobian', @fjac); %! vsol = ode78 (@fpol, [0 2], [2 0], vopt); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <tr...@us...> - 2008-03-11 16:46:04
|
Revision: 4712 http://octave.svn.sourceforge.net/octave/?rev=4712&view=rev Author: treichl Date: 2008-03-11 09:46:07 -0700 (Tue, 11 Mar 2008) Log Message: ----------- Update in demo section. Modified Paths: -------------- trunk/octave-forge/main/odepkg/inst/odeget.m trunk/octave-forge/main/odepkg/inst/odeset.m Modified: trunk/octave-forge/main/odepkg/inst/odeget.m =================================================================== --- trunk/octave-forge/main/odepkg/inst/odeget.m 2008-03-11 16:45:10 UTC (rev 4711) +++ trunk/octave-forge/main/odepkg/inst/odeget.m 2008-03-11 16:46:07 UTC (rev 4712) @@ -93,21 +93,19 @@ %!test odeget (odeset, {'RelTol', 'AbsTol'}, {10 20}); %!demo +%! # Return the manually changed value RelTol of the OdePkg options +%! # strutcure A. If RelTol wouldn't have been changed then an +%! # empty matrix value would have been returned. %! %! A = odeset ('RelTol', 1e-1, 'AbsTol', 1e-2); %! odeget (A, 'RelTol', []) -%! %---------------------------------------------------------------- -%! % Returns the manually changed value RelTol of the odepkg options -%! % strutcure A. If RelTol wouldn't have been changed then [] would -%! % be returned. %!demo +%! # Return the manually changed value of RelTol and the value 1e-4 +%! # for AbsTol of the OdePkg options structure A. %! %! A = odeset ('RelTol', 1e-1); -%! odeget (A, {'RelTol', 'AbsTol'}, {1e-2 1e-4}) -%! %---------------------------------------------------------------- -%! % Returns the manually changed value of RelTol and the value 1e-4 -%! % for AbsTol of the odepkg options strutcure A. +%! odeget (A, {'RelTol', 'AbsTol'}, {1e-2, 1e-4}) %# Local Variables: *** %# mode: octave *** Modified: trunk/octave-forge/main/odepkg/inst/odeset.m =================================================================== --- trunk/octave-forge/main/odepkg/inst/odeset.m 2008-03-11 16:45:10 UTC (rev 4711) +++ trunk/octave-forge/main/odepkg/inst/odeset.m 2008-03-11 16:46:07 UTC (rev 4712) @@ -28,7 +28,7 @@ %# %# If this function is called with two input argumnets @var{oldstruct} and @var{newstruct} of type structure array then overwrite all values in the fields from the structure @var{oldstruct} with new values of the fields from the structure @var{newstruct}. Empty values of @var{newstruct} will not overwrite values in @var{oldstruct}. %# -%# For a detailed explanation about valid fields and field values in an OdePkg structure aaray have a look at the @file{odepkg.pdf}, Section 'ODE/DAE/IDE options' or run the command @command{doc odepkg} to open the tutorial. +%# For a detailed explanation about valid fields and field values in an OdePkg structure aaray have a look at the @file{odepkg.pdf}, Section 'ODE/DAE/IDE/DDE options' or run the command @command{doc odepkg} to open the tutorial. %# %# Run examples with the command %# @example @@ -38,32 +38,6 @@ %# %# @seealso{odepkg} -%# The OdePkg options structure may contain the following fields and default values if calling @command{odeset} -%# -%# @itemize @var -%# @item "RelTol" must be a positive scalar (default 1e-3) -%# @item "AbsTol" must be a positive scalar (default 1e-6) -%# @item "NormControl" must be "on" or "off" (default "off") -%# @item "NonNegative" must be a vector of integers (default []) -%# @item "OutputFcn" must be a function handle (default []) -%# @item "OutputSel" must be a vector of integers (default []) -%# @item "Refine" must be a positive integer (default 0) -%# @item "Stats" must be "on" or "off" (default "off") -%# @item "InitialStep" must be a positive scalar (default []) -%# @item "MaxStep" must be a positive scalar (default []) -%# @item "Events" must be a function handle (default []) -%# @item "Jacobian" must be a function handle or a matrix (default []) -%# @item "JPattern" must be a sparse matrix (default []) -%# @item "Vectorized" must be "on" or "off" (default "off") -%# @item "Mass" must be a function handle or a matrix (default []) -%# @item "MStateDependence" must be "none", "weak" or "strong" (default "weak") -%# @item "MvPattern" must be a sparse matrix (default []) -%# @item "MassSingular" must be "yes", "no" or "maybe" (default "maybe") -%# @item "InitialSlope" must be a vector (default []) -%# @item "MaxOrder" must be an integer between 1 and 5 (default 5) -%# @item "BDF" must be "on" or "off" (default "off") -%# @end itemize - function [vret] = odeset (varargin) %# Create a template OdePkg structure @@ -186,35 +160,22 @@ %! odeoptD = odeset (odeoptC, odeoptB); %!demo +%! # A new OdePkg options structure with default values is created. %! %! odeoptA = odeset (); %! -%! %------------------------------------------------------------------ -%! % a new ode options structure has been created and saved in odeoptA %!demo +%! # A new OdePkg options structure with manually set options +%! # "AbsTol" and "RelTol" is created. %! %! odeoptB = odeset ('AbsTol', 1e-2, 'RelTol', 1e-1); %! -%! %------------------------------------------------------------------- -%! % a new ode options structure with new Options "AbsTol" and "RelTol" -%! % has been created and saved in odeoptB %!demo +%! # A new OdePkg options structure from odeoptB is created with +%! # a modified value for option "NormControl". %! %! odeoptB = odeset ('AbsTol', 1e-2, 'RelTol', 1e-1); %! odeoptC = odeset (odeoptB, 'NormControl', 'on'); -%! -%! %------------------------------------------------------------------- -%! % a new ode options structure from odeoptB has been created with new -%! % Option "NormControl" and saved in odeoptC -%!demo -%! -%! odeoptB = odeset ('AbsTol', 1e-2, 'RelTol', 1e-1); -%! odeoptC = odeset (odeoptB, 'NormControl', 'on'); -%! odeoptD = odeset (odeoptC, odeoptB); -%! -%! %------------------------------------------------------------------- -%! % a new ode options structure from odeoptB has been created with new -%! % Option "NormControl" and saved in odeoptC %# Local Variables: *** %# mode: octave *** This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <tr...@us...> - 2008-03-11 16:46:40
|
Revision: 4713 http://octave.svn.sourceforge.net/octave/?rev=4713&view=rev Author: treichl Date: 2008-03-11 09:46:46 -0700 (Tue, 11 Mar 2008) Log Message: ----------- Moved demos from demo section into help section. Modified Paths: -------------- trunk/octave-forge/main/odepkg/inst/odephas2.m trunk/octave-forge/main/odepkg/inst/odephas3.m trunk/octave-forge/main/odepkg/inst/odeplot.m trunk/octave-forge/main/odepkg/inst/odeprint.m Modified: trunk/octave-forge/main/odepkg/inst/odephas2.m =================================================================== --- trunk/octave-forge/main/odepkg/inst/odephas2.m 2008-03-11 16:46:07 UTC (rev 4712) +++ trunk/octave-forge/main/odepkg/inst/odephas2.m 2008-03-11 16:46:46 UTC (rev 4713) @@ -29,9 +29,12 @@ %# %# This function is called by a OdePkg solver function if it was specified in an OdePkg options structure with the @command{odeset}. This function is an OdePkg internal helper function therefore it should never be necessary that this function is called directly by a user. There is only little error detection implemented in this function file to achieve the highest performance. %# -%# Run examples with the command +%# For example, solve an anonymous implementation of the "Van der Pol" equation and display the results while solving in a 2D plane %# @example -%# demo odephas2 +%# fvdb = @@(vt,vy) [vy(2); (1 - vy(1)^2) * vy(2) - vy(1)]; +%# +%# vopt = odeset ('OutputFcn', @@odephas2, 'RelTol', 1e-6); +%# vsol = ode45 (fvdb, [0 20], [2 0], vopt); %# @end example %# @end deftypefn %# @@ -62,25 +65,6 @@ end -%!demo -%! -%! A = odeset ('OutputFcn', @odephas2, 'RelTol', 1e-3); -%! [vx, vy] = ode54 (@odepkg_equations_vanderpol, [0 20], [2 0], A); -%! -%! % -------------------------------------------------------------------------- -%! % The output of the integration is ploted with odephas2 because the OuputFcn -%! % property has been set with odeset. The figure shows the state x1 as a -%! % function of the state x2 from the Van der Pol implementation. -%!demo -%! -%! A = odeset ('OutputFcn', @odephas2, 'RelTol', 1e-7); -%! [vx, vy] = ode45 (@odepkg_equations_secondorderlag, [0 1.5], [0 0], A); -%! -%! % -------------------------------------------------------------------------- -%! % The output of the integration is ploted with odephas2 because the OuputFcn -%! % property has been set with odeset. The figure shows the state x1 as a -%! % function of the state x2 from the second order lag implementation. - %# Local Variables: *** %# mode: octave *** %# End: *** Modified: trunk/octave-forge/main/odepkg/inst/odephas3.m =================================================================== --- trunk/octave-forge/main/odepkg/inst/odephas3.m 2008-03-11 16:46:07 UTC (rev 4712) +++ trunk/octave-forge/main/odepkg/inst/odephas3.m 2008-03-11 16:46:46 UTC (rev 4713) @@ -29,9 +29,16 @@ %# %# This function is called by a OdePkg solver function if it was specified in an OdePkg options structure with the @command{odeset}. This function is an OdePkg internal helper function therefore it should never be necessary that this function is called directly by a user. There is only little error detection implemented in this function file to achieve the highest performance. %# -%# Run examples with the command +%# For example, solve the "Lorenz attractor" and display the results while solving in a 3D plane %# @example -%# demo odephas3 +%# function vyd = florenz (vt, vx) +%# vyd = [10 * (vx(2) - vx(1)); +%# vx(1) * (28 - vx(3)); +%# vx(1) * vx(2) - 8/3 * vx(3)]; +%# endfunction +%# +%# vopt = odeset ('OutputFcn', @@odephas3); +%# vsol = ode23 (@@florenz, [0:0.01:7.5], [3 15 1], vopt); %# @end example %# @end deftypefn %# @@ -64,16 +71,6 @@ end -%!demo -%! -%! A = odeset ('InitialStep', 1e-3, 'MaxStep', 1e-1, 'OutputFcn', @odephas3); -%! [t,y] = ode78 (@odepkg_equations_lorenz, [0 25], [3 15 1], A); -%! -%! % -------------------------------------------------------------------------- -%! % The output of the integration is ploted with odephas3 because the OuputFcn -%! % property has been set with odeset. The figure shows the state x1 as a -%! % function of the state x2 from the Van der Pol implementation. - %# Local Variables: *** %# mode: octave *** %# End: *** Modified: trunk/octave-forge/main/odepkg/inst/odeplot.m =================================================================== --- trunk/octave-forge/main/odepkg/inst/odeplot.m 2008-03-11 16:46:07 UTC (rev 4712) +++ trunk/octave-forge/main/odepkg/inst/odeplot.m 2008-03-11 16:46:46 UTC (rev 4713) @@ -29,9 +29,12 @@ %# %# This function is called by a OdePkg solver function if it was specified in an OdePkg options structure with the @command{odeset}. This function is an OdePkg internal helper function therefore it should never be necessary that this function is called directly by a user. There is only little error detection implemented in this function file to achieve the highest performance. %# -%# Run examples with the command +%# For example, solve an anonymous implementation of the "Van der Pol" equation and display the results while solving %# @example -%# demo odeplot +%# fvdb = @@(vt,vy) [vy(2); (1 - vy(1)^2) * vy(2) - vy(1)]; +%# +%# vopt = odeset ('OutputFcn', @@odeplot, 'RelTol', 1e-6); +%# vsol = ode45 (fvdb, [0 20], [2 0], vopt); %# @end example %# @end deftypefn %# @@ -65,23 +68,6 @@ end -%!demo -%! -%! A = odeset ('MaxStep', 1.5/30, 'Refine', 3); -%! ode45 (@odepkg_equations_secondorderlag, [0 1.5], [0 0], A); -%! -%! % ---------------------------------------------------------------- -%! % The output of the integration is ploted automatically with -%! % odeplot because nargout == 0 when calling ode2f. -%!demo -%! -%! A = odeset ('OutputFcn', @odeplot, 'Refine', 0); -%! [vx, vy] = ode45 (@odepkg_equations_secondorderlag, [0 1.5], [0 0], A); -%! -%! % --------------------------------------------------------------------------- -%! % The output of the integration is ploted with odeplot because the OuputFcn -%! % property has been set with odeset. - %# Local Variables: *** %# mode: octave *** %# End: *** \ No newline at end of file Modified: trunk/octave-forge/main/odepkg/inst/odeprint.m =================================================================== --- trunk/octave-forge/main/odepkg/inst/odeprint.m 2008-03-11 16:46:07 UTC (rev 4712) +++ trunk/octave-forge/main/odepkg/inst/odeprint.m 2008-03-11 16:46:46 UTC (rev 4713) @@ -29,9 +29,12 @@ %# %# This function is called by a OdePkg solver function if it was specified in an OdePkg options structure with the @command{odeset}. This function is an OdePkg internal helper function therefore it should never be necessary that this function is called directly by a user. There is only little error detection implemented in this function file to achieve the highest performance. %# -%# Run examples with the command +%# For example, solve an anonymous implementation of the "Van der Pol" equation and print the results while solving %# @example -%# demo odeprint +%# fvdb = @@(vt,vy) [vy(2); (1 - vy(1)^2) * vy(2) - vy(1)]; +%# +%# vopt = odeset ('OutputFcn', @@odeprint, 'RelTol', 1e-6); +%# vsol = ode45 (fvdb, [0 20], [2 0], vopt); %# @end example %# @end deftypefn %# @@ -57,15 +60,6 @@ end -%!demo -%! -%! A = odeset ('OutputFcn', @odeprint); -%! [vx, vy] = ode78 (@odepkg_equations_secondorderlag, [0 1.5], [0 0], A); -%! -%! % --------------------------------------------------------------------- -%! % The output of the integration is ploted with odeprint because the -%! % OuputFcn property has been set with odeset. - %# Local Variables: *** %# mode: octave *** %# End: *** \ No newline at end of file This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <tr...@us...> - 2008-03-11 16:47:35
|
Revision: 4714 http://octave.svn.sourceforge.net/octave/?rev=4714&view=rev Author: treichl Date: 2008-03-11 09:47:41 -0700 (Tue, 11 Mar 2008) Log Message: ----------- Minor updates in demo section. Modified Paths: -------------- trunk/octave-forge/main/odepkg/inst/odepkg_testsuite_calcmescd.m trunk/octave-forge/main/odepkg/inst/odepkg_testsuite_calcscd.m Modified: trunk/octave-forge/main/odepkg/inst/odepkg_testsuite_calcmescd.m =================================================================== --- trunk/octave-forge/main/odepkg/inst/odepkg_testsuite_calcmescd.m 2008-03-11 16:46:46 UTC (rev 4713) +++ trunk/octave-forge/main/odepkg/inst/odepkg_testsuite_calcmescd.m 2008-03-11 16:47:41 UTC (rev 4714) @@ -34,21 +34,18 @@ vmescd = -log10 (norm (vtmp, inf)); %!demo +%! # Display the value for the mimum number of correct digits in the vector +%! # sol = [1, 2, 2.9] compared to the reference vector ref = [1, 2, 3]. %! %! odepkg_testsuite_calcmescd ([1, 2, 2.9], [1, 2, 3], 1e-3, 1e-6) -%! -%! % --------------------------------------------------------------------------- -%! % Displays the value for the mimum number of correct digits in the vector -%! % sol = [1, 2, 2.9] compared to the reference vector ref = [1, 2, 3]. +%! %!demo +%! # Display the value for the mimum number of correct digits in the vector +%! # sol = [1 + 1e10, 2 + 1e10, 3 + 1e10] compared to the reference vector +%! # ref = [1, 2, 3]. %! %! odepkg_testsuite_calcmescd ([1 + 1e10, 2 + 1e10, 3 + 1e10], [1, 2, 3], ... %! [1e-3, 1e-4, 1e-5], [1e-6, 1e-6, 1e-6]) -%! -%! % --------------------------------------------------------------------------- -%! % Displays the value for the mimum number of correct digits in the vector -%! % sol = [1 + 1e10, 2 + 1e10, 3 + 1e10] compared to the reference vector -%! % ref = [1, 2, 3]. %!assert (odepkg_testsuite_calcmescd ([1, 2, 3], [1, 2, 3], NaN, NaN), NaN); %!assert (odepkg_testsuite_calcmescd ([1, 2, 3], [1, 2, 3], 1, 1), Inf); Modified: trunk/octave-forge/main/odepkg/inst/odepkg_testsuite_calcscd.m =================================================================== --- trunk/octave-forge/main/odepkg/inst/odepkg_testsuite_calcscd.m 2008-03-11 16:46:46 UTC (rev 4713) +++ trunk/octave-forge/main/odepkg/inst/odepkg_testsuite_calcscd.m 2008-03-11 16:47:41 UTC (rev 4714) @@ -33,19 +33,19 @@ vscd = -log10 (norm (vrel, inf)); %!demo +%! # Displays the value for the mimum number of correct digits in +%! # the vector sol = [1, 2, 2.9] compared to the reference vector +%! # ref = [1, 2, 3]. %! %! odepkg_testsuite_calcscd ([1, 2, 2.9], [1, 2, 3], NaN, NaN) %! -%! % --------------------------------------------------------------------------- -%! % Displays the value for the mimum number of correct digits in the -%! % vector sol = [1, 2, 2.9] compared to the reference vector ref = [1, 2, 3]. %!demo +%! # Displays the value for the mimum number of correct digits in +%! # the vector sol = [1, 2, 2.9] compared to the reference vector +%! # ref = [1, 2, 3]. %! -%! odepkg_testsuite_calcscd ([1 + 1e10, 2 + 1e10, 3 + 1e10], [1, 2, 3], NaN, NaN) -%! -%! % --------------------------------------------------------------------------- -%! % Displays the value for the mimum number of correct digits in the -%! % vector sol = [1, 2, 2.9] compared to the reference vector ref = [1, 2, 3]. +%! odepkg_testsuite_calcscd ([1 + 1e10, 2 + 1e10, 3 + 1e10], ... +%! [1, 2, 3], NaN, NaN) %!assert (odepkg_testsuite_calcscd ([1, 2, 3], [1, 2, 3], NaN, NaN), Inf); %!assert (odepkg_testsuite_calcscd ([1, 2, 3], [1, 2.1, 3], 1, 1), 1.5, 0.2); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <tr...@us...> - 2008-03-11 16:50:05
|
Revision: 4715 http://octave.svn.sourceforge.net/octave/?rev=4715&view=rev Author: treichl Date: 2008-03-11 09:50:08 -0700 (Tue, 11 Mar 2008) Log Message: ----------- Changes in help section, tests section and demos section. Modified Paths: -------------- trunk/octave-forge/main/odepkg/inst/odepkg.m trunk/octave-forge/main/odepkg/inst/odepkg_event_handle.m trunk/octave-forge/main/odepkg/inst/odepkg_structure_check.m Modified: trunk/octave-forge/main/odepkg/inst/odepkg.m =================================================================== --- trunk/octave-forge/main/odepkg/inst/odepkg.m 2008-03-11 16:47:41 UTC (rev 4714) +++ trunk/octave-forge/main/odepkg/inst/odepkg.m 2008-03-11 16:50:08 UTC (rev 4715) @@ -17,7 +17,7 @@ %# -*- texinfo -*- %# @deftypefn {Function File} {[@var{}] =} odepkg () %# -%# OdePkg is part of the GNU Octave Repository (resp. the Octave--Forge project). The package includes commands for setting up various options, output functions etc. before solving a set of differential equations with the solver functions that are also included. At this time OdePkg is under development with the main target to make a package that is mostly compatible to proprietary solver products. +%# OdePkg is part of the GNU Octave Repository (the Octave--Forge project). The package includes commands for setting up various options, output functions etc. before solving a set of differential equations with the solver functions that are also included. At this time OdePkg is under development with the main target to make a package that is mostly compatible to proprietary solver products. %# %# If this function is called without any input argument then open the OdePkg tutorial in the Octave window. The tutorial can also be opened with the following command %# @@ -32,7 +32,7 @@ if (nargin == 0) doc ('odepkg'); elseif (nargin > 1) - error ('Number of input arguments must at most be one'); + error ('Number of input arguments must be zero or one'); elseif (ischar (vstr)) feval (vstr); else @@ -45,10 +45,11 @@ %# octave --quiet --eval "odepkg ('odepkg_validate_mfiles')" vfun = {'ode23', 'ode45', 'ode54', 'ode78', ... - 'odeget', 'odeset', ... + 'ode23d', 'ode45d', 'ode54d', 'ode78d', ... + 'odeget', 'odeset', 'odeplot', 'odephas2', 'odephas3', 'odeprint', ... 'odepkg_structure_check', 'odepkg_event_handle', ... - 'odeplot', 'odephas2', 'odephas3', 'odeprint', ... 'odepkg_testsuite_calcscd', 'odepkg_testsuite_calcmescd'}; + %# vfun = sort (vfun); for vcnt=1:length(vfun) printf ('Testing function %s ... ', vfun{vcnt}); @@ -60,11 +61,10 @@ %# From command line in the 'src' directory do something like this: %# octave --quiet --eval "odepkg ('odepkg_validate_ccfiles')" - vfile = {'odepkg_octsolver_mebdfdae.cc', 'odepkg_octsolver_mebdfi.cc', ... - 'odepkg_octsolver_ddaskr.cc', ... + vfile = {'odepkg_octsolver_mebdfdae.cc', 'odepkg_octsolver_mebdfi.cc', ... %#'odepkg_octsolver_ddaskr.cc', ... 'odepkg_octsolver_radau.cc', 'odepkg_octsolver_radau5.cc', ... 'odepkg_octsolver_rodas.cc', 'odepkg_octsolver_seulex.cc'}; - vsolv = {'odebda', 'odebdi', 'odekdi', ... + vsolv = {'odebda', 'odebdi', ...#'odekdi', ... 'ode2r', 'ode5r', 'oders', 'odesx'}; for vcnt=1:length(vfile) @@ -75,16 +75,18 @@ function [] = odepkg_internal_mhelpextract () - vfun = {'odepkg', 'ode23d', 'ode45d', 'ode54d', 'ode78d', ... + vfun = {'odepkg', 'odeget', 'odeset', ... 'ode23', 'ode45', 'ode54', 'ode78', ... - 'odeget', 'odeset', ... + 'ode23d', 'ode45d', 'ode54d', 'ode78d', ... 'odeplot', 'odephas2', 'odephas3', 'odeprint', ... 'odepkg_structure_check', 'odepkg_event_handle', ... 'odepkg_testsuite_calcscd', 'odepkg_testsuite_calcmescd', ... - 'odepkg_testsuite_chemakzo', 'odepkg_testsuite_hires', ... + 'odepkg_testsuite_oregonator', 'odepkg_testsuite_pollution', ... + 'odepkg_testsuite_hires', ... + 'odepkg_testsuite_robertson', 'odepkg_testsuite_chemakzo', ... + 'odepkg_testsuite_transistor', ... 'odepkg_testsuite_implrober', 'odepkg_testsuite_implakzo', ... - 'odepkg_testsuite_oregonator', 'odepkg_testsuite_pollution', ... - 'odepkg_testsuite_robertson', 'odepkg_testsuite_transistor', ... + 'odepkg_testsuite_imptrans', ... }; vfun = sort (vfun); @@ -206,8 +208,8 @@ % test ('ode45', 'verbose'); clear ('all'); % test ('ode23', 'verbose'); clear ('all'); - demo ('odeget.m'); - demo ('odeset.m'); + demo ('odeget.m'); clear ('all'); + demo ('odeset.m'); clear ('all'); demo ('odepkg_structure_check.m'); clear ('all'); demo ('odepkg_event_handle.m', 'verbose'); clear ('all'); Modified: trunk/octave-forge/main/odepkg/inst/odepkg_event_handle.m =================================================================== --- trunk/octave-forge/main/odepkg/inst/odepkg_event_handle.m 2008-03-11 16:47:41 UTC (rev 4714) +++ trunk/octave-forge/main/odepkg/inst/odepkg_event_handle.m 2008-03-11 16:50:08 UTC (rev 4715) @@ -17,7 +17,7 @@ %# -*- texinfo -*- %# @deftypefn {Function File} {[@var{sol}] =} odepkg_event_handle (@var{@@fun}, @var{time}, @var{y}, @var{flag}, [@var{par1}, @var{par2}, @dots{}]) %# -%# Return the solution of the event function that is specified as the first input argument @var{@@fun} in form of a function handle. The second input argument @var{time} is of type double scalar and specifies the time of the event evaluation, the third input argument @var{y} is of type double column vector and specifies the solutions, the third input argument @var{flag} is of type string and can be of the form +%# Return the solution of the event function that is specified as the first input argument @var{@@fun} in form of a function handle. The second input argument @var{time} is of type double scalar and specifies the time of the event evaluation, the third input argument @var{y} either is of type double column vector (for ODEs and DAEs) and specifies the solutions or is of type cell array (for IDEs and DDEs) and specifies the derivatives or the history values, the third input argument @var{flag} is of type string and can be of the form %# @table @option %# @item @code{"init"} %# then initialize internal persistent variables of the function @command{odepkg_event_handle} and return an empty cell array of size 4, @@ -58,89 +58,106 @@ %# a value for veveold if (strcmp (vflag, 'init')) - if (isempty (varargin)) - [veveold, vterm, vdir] = feval (vevefun, vt, vy); + if (~iscell (vy)) + vinpargs = {vevefun, vt, vy}; else - [veveold, vterm, vdir] = feval (vevefun, vt, vy, varargin); + vinpargs = {vevefun, vt, vy{1}, vy{2}}; + vy = vy{1}; %# Delete cell element 2 end + if (nargin > 4) + vinpargs = {vinpargs{:}, varargin{:}}; + end + [veveold, vterm, vdir] = feval (vinpargs{:}); - %# My first implementation was to return row vectors from the event - %# functions but this is faulty if we use LabMat events. So this has - %# changed 20060928 and by now these return vectors must be column - %# vectors. The not so nice implementation then is: + %# We assume that all return values must be column vectors veveold = veveold(:)'; vterm = vterm(:)'; vdir = vdir(:)'; + vtold = vt; vyold = vy; vevecnt = 1; vretcell = cell (1,4); - vtold = vt; %# veveold has been set in the code lines before - for vcnt = 1:4, vretcell{vcnt} = []; end - vyold = vy; vevecnt = 1; - %# Process the event, find the zero crossings either for a rising %# or for a falling edge elseif (isempty (vflag)) - %# Call the event function if an event function has been defined to - %# to get the value(s) veve - if (isempty (varargin)) - [veve, vterm, vdir] = feval (vevefun, vt, vy); + if (~iscell (vy)) + vinpargs = {vevefun, vt, vy}; else - [veve, vterm, vdir] = feval (vevefun, vt, vy, varargin); + vinpargs = {vevefun, vt, vy{1}, vy{2}}; + vy = vy{1}; %# Delete cell element 2 end + if (nargin > 4) + vinpargs = {vinpargs{:}, varargin{:}}; + end + [veve, vterm, vdir] = feval (vinpargs{:}); + + %# We assume that all return values must be column vectors veve = veve(:)'; vterm = vterm(:)'; vdir = vdir(:)'; - %# Check if one or more signs of the event function results changed + %# Check if one or more signs of the event has changed vsignum = (sign (veveold) ~= sign (veve)); if (any (vsignum)) %# One or more values have changed vindex = find (vsignum); %# Get the index of the changed values - if (any (vdir(vindex) == 0)) %# Rising or falling (both are possible) + if (any (vdir(vindex) == 0)) + %# Rising or falling (both are possible) %# Don't change anything, keep the index elseif (any (vdir(vindex) == sign (veve(vindex)))) %# Detected rising or falling, need a new index vindex = find (vdir == sign (veve)); else - %# Found a zero crossing that will not be notified + %# Found a zero crossing but must not be notified vindex = []; end - %# We create a new output values if we found a valid index + %# Create new output values if a valid index has been found if (~isempty (vindex)) %# Change the persistent result cell array vretcell{1} = any (vterm(vindex)); %# Stop integration or not - vretcell{2}(vevecnt,1) = vindex(1,1); %# Take first event that occurs + vretcell{2}(vevecnt,1) = vindex(1,1); %# Take first event found %# Calculate the time stamp when the event function returned 0 and %# calculate new values for the integration results, we do both by %# a linear interpolation vtnew = vt - veve(1,vindex) * (vt - vtold) / (veve(1,vindex) - veveold(1,vindex)); - vynew = (vy - (vt - vtnew) * (vy - vyold) / (vt - vtold)); + vynew = (vy - (vt - vtnew) * (vy - vyold) / (vt - vtold))'; vretcell{3}(vevecnt,1) = vtnew; - vretcell{4}(vevecnt,:) = vynew'; + vretcell{4}(vevecnt,:) = vynew; vevecnt = vevecnt + 1; - end + end %# if (~isempty (vindex)) - end %# Check if one or more signs ... - veveold = veve; vtold = vt; - vretval = vretcell; vyold = vy; + end %# Check for one or more signs ... + veveold = veve; vtold = vt; vretval = vretcell; vyold = vy; - %# Reset this event handling function - elseif (strcmp (vflag, 'done')) + elseif (strcmp (vflag, 'done')) %# Clear this event handling function clear ('veveold', 'vtold', 'vretcell', 'vyold', 'vevecnt'); - for vcnt = 1:4, vretcell{vcnt} = []; end + vretcell = cell (1,4); - end %# if (strcmp (vflag, ...) == true) + end -%!function [veve, vterm, vdir] = feve (vt, vy, varargin) -%! veve = vy(1); %# Which event component should be tread +%!function [veve, vterm, vdir] = feveode (vt, vy, varargin) +%! veve = vy(1); %# Which event component should be treaded %! vterm = 1; %# Terminate if an event is found %! vdir = -1; %# In which direction, -1 for falling -%!test -%! odepkg_event_handle (@feve, 0.0, [0 1 2 3], 'init', 123, 456); -%!test -%! A = odepkg_event_handle (@feve, 2.0, [0 0 3 2], '', 123, 456); -%! if ~(iscell (A) && isempty (A{1})), error; end -%! A = odepkg_event_handle (@feve, 3.0, [-1 0 3 2], '', 123, 456); -%! if ~(iscell (A) && A{1} == 1), error; end -%!test -%! odepkg_event_handle (@feve, 4.0, [0 1 2 3], 'done', 123, 456); +%!function [veve, vterm, vdir] = feveide (vt, vy, vyd, varargin) +%! veve = vy(1); %# Which event component should be treaded +%! vterm = 1; %# Terminate if an event is found +%! vdir = -1; %# In which direction, -1 for falling +%! +%!test %# First call to initialize the odepkg_event_handle function +%! odepkg_event_handle (@feveode, 0.0, [0 1 2 3], 'init', 123, 456); +%!test %# Two calls to find the event that may occur with ODE/DAE syntax +%! A = odepkg_event_handle (@feveode, 2.0, [ 0 0 3 2], '', 123, 456); +%! B = odepkg_event_handle (@feveode, 3.0, [-1 0 3 2], '', 123, 456); +%! assert (A{:}, {[], [], [], []}); +%! assert (B{:}, {1, 1, 2, [0 0 3 2]}); +%!test %# Last call to cleanup the odepkg_event_handle function +%! odepkg_event_handle (@feveode, 4.0, [0 1 2 3], 'done', 123, 456); +%!test %# First call to initialize the odepkg_event_handle function +%! odepkg_event_handle (@feveide, 0.0, {[0 1 2 3], [0 1 2 3]}, 'init', 123, 456); +%!test %# Two calls to find the event that may occur with IDE/DDE syntax +%! A = odepkg_event_handle (@feveide, 2.0, {[0 0 3 2], [0 0 3 2]}, '', 123, 456); +%! B = odepkg_event_handle (@feveide, 3.0, {[-1 0 3 2], [0 0 3 2]}, '', 123, 456); +%! assert (A{:}, {[], [], [], []}); +%! assert (B{:}, {1, 1, 2, [0 0 3 2]}); +%!test %# Last call to cleanup the odepkg_event_handle function +%! odepkg_event_handle (@feveide, 4.0, {[0 1 2 3], [0 1 2 3]}, 'done', 123, 456); %# Local Variables: *** %# mode: octave *** Modified: trunk/octave-forge/main/odepkg/inst/odepkg_structure_check.m =================================================================== --- trunk/octave-forge/main/odepkg/inst/odepkg_structure_check.m 2008-03-11 16:47:41 UTC (rev 4714) +++ trunk/octave-forge/main/odepkg/inst/odepkg_structure_check.m 2008-03-11 16:50:08 UTC (rev 4715) @@ -64,16 +64,17 @@ vfld{vcntarg}); end - switch (vsol) - case {'ode23', 'ode45', 'ode54', 'ode78'} - if (~isscalar (vret.(vfld{vcntarg})) && ... - ~isempty (vret.(vfld{vcntarg}))) + switch (vsol) + case {'ode23', 'ode45', 'ode54', 'ode78', ... + 'ode23d', 'ode45d', 'ode54d', 'ode78d',} + if (~isscalar (vret.(vfld{vcntarg})) && ... + ~isempty (vret.(vfld{vcntarg}))) error ('OdePkg:InvalidParameter', ... - 'Value of option "RelTol" must be a scalar for solver "ode23"'); - end - otherwise + 'Value of option "RelTol" must be a scalar'); + end + otherwise - end + end case 'AbsTol' if (isnumeric (vret.(vfld{vcntarg})) && ... @@ -124,7 +125,7 @@ case 'Refine' if (isscalar (vret.(vfld{vcntarg})) && ... - mod (vret.(vfld{vcntarg}), 1) == 0 && ... + mod (vret.(vfld{vcntarg}), 1) == 0 && ... vret.(vfld{vcntarg}) >= 0 && ... vret.(vfld{vcntarg}) <= 5) else @@ -145,7 +146,7 @@ case 'InitialStep' if (isempty (vret.(vfld{vcntarg})) || ... (isscalar (vret.(vfld{vcntarg})) && ... - isreal (vret.(vfld{vcntarg})) && ... + isreal (vret.(vfld{vcntarg})) && ... vret.(vfld{vcntarg}) > 0) ) else error ('OdePkg:InvalidParameter', ... @@ -174,18 +175,19 @@ case 'Jacobian' if (isempty (vret.(vfld{vcntarg})) || ... - ismatrix (vret.(vfld{vcntarg})) || ... - isa (vret.(vfld{vcntarg}), 'function_handle') || ... - iscell (vret.(vfld{vcntarg}))) + ismatrix (vret.(vfld{vcntarg})) || ... + isa (vret.(vfld{vcntarg}), 'function_handle') || ... + iscell (vret.(vfld{vcntarg}))) else error ('OdePkg:InvalidParameter', ... - 'Unknown parameter name "%s" or not valid parameter value', ... - vfld{vcntarg}); + 'Unknown parameter name "%s" or not valid parameter value', ... + vfld{vcntarg}); end case 'JPattern' if (isempty (vret.(vfld{vcntarg})) || ... - issparse (vret.(vfld{vcntarg}))) + isvector (vret.(vfld{vcntarg}) || ... + ismatrix (vret.(vfld{vcntarg})))) else error ('OdePkg:InvalidParameter', ... 'Unknown parameter name "%s" or not valid parameter value', ... @@ -223,7 +225,8 @@ case 'MvPattern' if (isempty (vret.(vfld{vcntarg})) || ... - issparse (vret.(vfld{vcntarg}))) + isvector (vret.(vfld{vcntarg}) || ... + ismatrix (vret.(vfld{vcntarg})))) else error ('OdePkg:InvalidParameter', ... 'Unknown parameter name "%s" or not valid parameter value', ... @@ -333,10 +336,10 @@ %!test A = odeset ('Jacobian', [1, 2; 3, 4]); %!test A = odeset ('Jacobian', []); %!error A = odeset ('Jacobian', '12'); -%#!test A = odeset ('JPattern', ); -%#!test A = odeset ('JPattern', ); -%#!error A = odeset ('JPattern', ); -%#!error A = odeset ('JPattern', ); +%!test A = odeset ('JPattern', []); +%!test A = odeset ('JPattern', [1, 2, 4]); +%!test A = odeset ('JPattern', [1, 2; 3, 4]); +%!error A = odeset ('JPattern', 12); %!test A = odeset ('Vectorized', 'on'); %!test A = odeset ('Vectorized', 'off'); %!error A = odeset ('Vectorized', []); @@ -351,10 +354,10 @@ %!error A = odeset ('MStateDependence', [1, 2; 3, 4]); %!error A = odeset ('MStateDependence', []); %!error A = odeset ('MStateDependence', '12'); -%#!test A = odeset ('MvPattern', ); -%#!test A = odeset ('MvPattern', ); -%#!error A = odeset ('MvPattern', ); -%#!error A = odeset ('MvPattern', ); +%!test A = odeset ('MvPattern', []); +%!test A = odeset ('MvPattern', [1, 2, 3 ]); +%!test A = odeset ('MvPattern', [1, 2; 3, 4]); +%!error A = odeset ('MvPattern', 12); %!test A = odeset ('MassSingular', 'yes'); %!test A = odeset ('MassSingular', 'no'); %!test A = odeset ('MassSingular', 'maybe'); @@ -375,18 +378,18 @@ %!error A = odeset ('BDF', []); %!demo +%! # Return the checked OdePkg options structure that is created by +%! # the command odeset. %! %! odepkg_structure_check (odeset); %! -%! %---------------------------------------------------------------- -%! % Returns the checked OdePkg options structure created by odeset. %!demo +%! # Create the OdePkg options structure A with odeset and check it +%! # with odepkg_structure_check. This actually is unnecessary +%! # because odeset automtically calls odepkg_structure_check before +%! # returning. %! %! A = odeset (); odepkg_structure_check (A); -%! -%! %---------------------------------------------------------------- -%! % Create the OdePkg options structure A with odeset and check it -%! % with odepkg_structure_check. %# Local Variables: *** %# mode: octave *** This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <tr...@us...> - 2008-03-11 16:50:38
|
Revision: 4716 http://octave.svn.sourceforge.net/octave/?rev=4716&view=rev Author: treichl Date: 2008-03-11 09:50:41 -0700 (Tue, 11 Mar 2008) Log Message: ----------- Files have been moved to odeexamples.m and others... Removed Paths: ------------- trunk/octave-forge/main/odepkg/inst/odepkg_equations_ilorenz.m trunk/octave-forge/main/odepkg/inst/odepkg_equations_lorenz.m trunk/octave-forge/main/odepkg/inst/odepkg_equations_pendulous.m trunk/octave-forge/main/odepkg/inst/odepkg_equations_roessler.m trunk/octave-forge/main/odepkg/inst/odepkg_equations_secondorderlag.m trunk/octave-forge/main/odepkg/inst/odepkg_equations_vanderpol.m Deleted: trunk/octave-forge/main/odepkg/inst/odepkg_equations_ilorenz.m =================================================================== --- trunk/octave-forge/main/odepkg/inst/odepkg_equations_ilorenz.m 2008-03-11 16:50:08 UTC (rev 4715) +++ trunk/octave-forge/main/odepkg/inst/odepkg_equations_ilorenz.m 2008-03-11 16:50:41 UTC (rev 4716) @@ -1,70 +0,0 @@ -%# Copyright (C) 2007-2008, Thomas Treichl <tr...@us...> -%# OdePkg - A package for solving differential equations with GNU Octave -%# -%# This program is free software; you can redistribute it and/or modify -%# it under the terms of the GNU General Public License as published by -%# the Free Software Foundation; either version 2 of the License, or -%# (at your option) any later version. -%# -%# This program is distributed in the hope that it will be useful, -%# but WITHOUT ANY WARRANTY; without even the implied warranty of -%# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -%# GNU General Public License for more details. -%# -%# You should have received a copy of the GNU General Public License -%# along with this program; If not, see <http://www.gnu.org/licenses/>. - -%# -*- texinfo -*- -%# @deftypefn {Function File} {[@var{res}] =} odepkg_equations_ilorenz (@var{t}, @var{y}, var{yd}) -%# -%# Return three residuals of the implicit ordinary differential equations (IDEs) from the "Lorenz attractor" implementation, cf. @url{http://en.wikipedia.org/wiki/Lorenz_equation} for further details. The output argument @var{res} is a column vector and contains the residuals, @var{y} is a column vector that contains the integration results from the previous integration step, @var{yd} is a column vector that contains the derivatives of the last integration step and @var{t} is a scalar value with the actual time stamp. There is no error handling implemented in this function to achieve the highest performance available. -%# -%# Run examples with the command -%# @example -%# demo odepkg_equations_ilorenz -%# @end example -%# @end deftypefn -%# -%# @seealso{odepkg} - -function res = odepkg_equations_ilorenz (t, y, yd) - %# No Jacobian needed - %# y0 = [3 15 1]' - %# yd0 = [120 81 42.333333]' - %# odebdi (@odepkg_equations_ilorenz, [0, 25], [3 15 1]', [120 81 42.333333]') - res = [10 * (y(2) - y(1)) - yd(1); - y(1) * (28 - y(3)) - yd(2); - y(1) * y(2) - 8/3 * y(3) - yd(3)]; - -%!test -%! if (!strcmp (which ("odebdi"), "")) -%! warning ("off", "OdePkg:InvalidOption"); -%! A = odeset ('InitialStep', 1e-3, 'MaxStep', 1e-1); -%! [vt, vy] = odebdi (@odepkg_equations_ilorenz, [0 25], -%! [3 15 1], [120 81 42.333333], A); -%! warning ("on", "OdePkg:InvalidOption"); -%! endif - -%!demo -%! -%! A = odeset ('InitialStep', 1e-3, 'MaxStep', 1e-1); -%! [t, y] = odebdi (@odepkg_equations_ilorenz, [0 25], -%! [3 15 1], [120 81 42.333333], A); -%! -%! subplot (2, 2, 1); grid ('on'); plot (t, y(:,1), '-b;f_x(t);', ... -%! t, y(:,2), '-g;f_y(t);', t, y(:,3), '-r;f_z(t);'); -%! subplot (2, 2, 2); grid ('on'); plot (y(:,1), y(:,2), '-b;f_{xyz}(x, y);'); -%! subplot (2, 2, 3); grid ('on'); plot (y(:,2), y(:,3), '-b;f_{xyz}(y, z);'); -%! subplot (2, 2, 4); grid ('on'); plot3 (y(:,1), y(:,2), y(:,3), ... -%! '-b;f_{xyz}(x, y, z);'); -%! -%! % ------------------------------------------------------------------------- -%! % The upper left subfigure shows the three results of the integration over -%! % time. The upper right subfigure shows the force f in a two dimensional -%! % (x,y) plane as well as the lower left subfigure shows the force in the -%! % (y,z) plane. The three dimensional force is plotted in the lower right -%! % subfigure. - -%# Local Variables: *** -%# mode: octave *** -%# End: *** Deleted: trunk/octave-forge/main/odepkg/inst/odepkg_equations_lorenz.m =================================================================== --- trunk/octave-forge/main/odepkg/inst/odepkg_equations_lorenz.m 2008-03-11 16:50:08 UTC (rev 4715) +++ trunk/octave-forge/main/odepkg/inst/odepkg_equations_lorenz.m 2008-03-11 16:50:41 UTC (rev 4716) @@ -1,61 +0,0 @@ -%# Copyright (C) 2006-2008, Thomas Treichl <tr...@us...> -%# OdePkg - A package for solving differential equations with GNU Octave -%# -%# This program is free software; you can redistribute it and/or modify -%# it under the terms of the GNU General Public License as published by -%# the Free Software Foundation; either version 2 of the License, or -%# (at your option) any later version. -%# -%# This program is distributed in the hope that it will be useful, -%# but WITHOUT ANY WARRANTY; without even the implied warranty of -%# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -%# GNU General Public License for more details. -%# -%# You should have received a copy of the GNU General Public License -%# along with this program; If not, see <http://www.gnu.org/licenses/>. - -%# -*- texinfo -*- -%# @deftypefn {Function File} {[@var{ydot}] =} odepkg_equations_lorenz (@var{t}, @var{y}) -%# -%# Return three derivatives of the non--stiff ordinary differential equations (non--stiff ODEs) from the "Lorenz attractor" implementation, cf. @url{http://en.wikipedia.org/wiki/Lorenz_equation} for further details. The output argument @var{ydot} is a column vector and contains the derivatives, the input argument @var{y} also is a column vector that contains the integration results from the previous integration step and @var{t} is a double scalar that keeps the actual time stamp. There is no error handling implemented in this function to achieve the highest performance available. -%# -%# Run examples with the command -%# @example -%# demo odepkg_equations_lorenz -%# @end example -%# @end deftypefn -%# -%# @seealso{odepkg} - -function y = odepkg_equations_lorenz (t, x) - y = [10 * (x(2) - x(1)); - x(1) * (28 - x(3)); - x(1) * x(2) - 8/3 * x(3)]; - -%!test -%! warning ("off", "OdePkg:InvalidOption"); -%! A = odeset ('InitialStep', 1e-3, 'MaxStep', 1e-1); -%! [t,y] = ode78 (@odepkg_equations_lorenz, [0 25], [3 15 1], A); - -%!demo -%! -%! A = odeset ('InitialStep', 1e-3, 'MaxStep', 1e-1); -%! [t, y] = ode78 (@odepkg_equations_lorenz, [0 25], [3 15 1], A); -%! -%! subplot (2, 2, 1); grid ('on'); plot (t, y(:,1), '-b;f_x(t);', ... -%! t, y(:,2), '-g;f_y(t);', t, y(:,3), '-r;f_z(t);'); -%! subplot (2, 2, 2); grid ('on'); plot (y(:,1), y(:,2), '-b;f_{xyz}(x, y);'); -%! subplot (2, 2, 3); grid ('on'); plot (y(:,2), y(:,3), '-b;f_{xyz}(y, z);'); -%! subplot (2, 2, 4); grid ('on'); plot3 (y(:,1), y(:,2), y(:,3), ... -%! '-b;f_{xyz}(x, y, z);'); -%! -%! % ------------------------------------------------------------------------- -%! % The upper left subfigure shows the three results of the integration over -%! % time. The upper right subfigure shows the force f in a two dimensional -%! % (x,y) plane as well as the lower left subfigure shows the force in the -%! % (y,z) plane. The three dimensional force is plotted in the lower right -%! % subfigure. - -%# Local Variables: *** -%# mode: octave *** -%# End: *** Deleted: trunk/octave-forge/main/odepkg/inst/odepkg_equations_pendulous.m =================================================================== --- trunk/octave-forge/main/odepkg/inst/odepkg_equations_pendulous.m 2008-03-11 16:50:08 UTC (rev 4715) +++ trunk/octave-forge/main/odepkg/inst/odepkg_equations_pendulous.m 2008-03-11 16:50:41 UTC (rev 4716) @@ -1,64 +0,0 @@ -%# Copyright (C) 2006-2008, Thomas Treichl <tr...@us...> -%# OdePkg - A package for solving differential equations with GNU Octave -%# -%# This program is free software; you can redistribute it and/or modify -%# it under the terms of the GNU General Public License as published by -%# the Free Software Foundation; either version 2 of the License, or -%# (at your option) any later version. -%# -%# This program is distributed in the hope that it will be useful, -%# but WITHOUT ANY WARRANTY; without even the implied warranty of -%# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -%# GNU General Public License for more details. -%# -%# You should have received a copy of the GNU General Public License -%# along with this program; If not, see <http://www.gnu.org/licenses/>. - -%# -*- texinfo -*- -%# @deftypefn {Function File} {[@var{ydot}] =} odepkg_equations_pendulous (@var{t}, @var{y}) -%# -%# Return two derivatives of the non--stiff ordinary differential equations (non--stiff ODEs) from a pendulum implementation, ie. the motion of a simple pendulum with damping, cf. @url{http://en.wikipedia.org/wiki/Pendulum} for further details. The output argument @var{ydot} is a column vector and contains the derivatives, the input argument @var{y} also is a column vector that contains the integration results from the previous integration step and @var{t} is a double scalar that keeps the actual time stamp. There is no error handling implemented in this function to achieve the highest performance available. -%# -%# Run examples with the command -%# @example -%# demo odepkg_equations_pendulous -%# @end example -%# @end deftypefn -%# -%# @seealso{odepkg} - -function ydot = odepkg_equations_pendulous (tvar, xvar) - m = 1; %# The pendulum mass in kg - g = 9.81; %# The gravity in m/s^2 - l = 1; %# The pendulum length in m - b = 0.7; %# The damping factor in kgm^2/s - - ydot = [xvar(2,1); ... - 1 / (1/3 * m * l^2) * (-b * xvar(2,1) - m * g * l/2 * sin (xvar(1,1)))]; - -%!test -%! warning ("off", "OdePkg:InvalidOption"); -%! [t,y] = ode45 (@odepkg_equations_pendulous, [0 5], [30*pi/180, 0]); - -%!demo -%! -%! A = odeset ('RelTol', 1e-8); -%! [t,y] = ode45 (@odepkg_equations_pendulous, [0 5], [30*pi/180, 0], A); -%! -%! axis ([0 5]); -%! plot (t, y(:,1), '-or;position;', t, y(:,2), '-ob;velocity;'); -%! % --------------------------------------------------------------------------- -%! % The figure window shows the state variables y1 and y2 of the pendulum -%! % implementation, i.e. the angular position and the velocity. The math -%! % equation for this ordinary differential equation implementation is -%! % -%! % m*l^2 * (d^2theta/dt^2) + b * (dtheta/dt) + m*g*l * sin (theta) = 0 -%! % -%! % with m = 1 kg, g = 9.81 m/s^2, l = 1 m, b = 0.7 kgm^2/s. The angular -%! % position reaches steady state at 0 rad caused by the gravity term -%! % -m*g*l/2*sin(x(1)). Velocity reaches a steady state of zero because of the -%! % damping term, -b*x(2). - -%# Local Variables: *** -%# mode: octave *** -%# End: *** Deleted: trunk/octave-forge/main/odepkg/inst/odepkg_equations_roessler.m =================================================================== --- trunk/octave-forge/main/odepkg/inst/odepkg_equations_roessler.m 2008-03-11 16:50:08 UTC (rev 4715) +++ trunk/octave-forge/main/odepkg/inst/odepkg_equations_roessler.m 2008-03-11 16:50:41 UTC (rev 4716) @@ -1,60 +0,0 @@ -%# Copyright (C) 2006-2008, Thomas Treichl <tr...@us...> -%# OdePkg - A package for solving differential equations with GNU Octave -%# -%# This program is free software; you can redistribute it and/or modify -%# it under the terms of the GNU General Public License as published by -%# the Free Software Foundation; either version 2 of the License, or -%# (at your option) any later version. -%# -%# This program is distributed in the hope that it will be useful, -%# but WITHOUT ANY WARRANTY; without even the implied warranty of -%# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -%# GNU General Public License for more details. -%# -%# You should have received a copy of the GNU General Public License -%# along with this program; If not, see <http://www.gnu.org/licenses/>. - -%# -*- texinfo -*- -%# @deftypefn {Function File} {[@var{ydot}] =} odepkg_equations_roessler (@var{t}, @var{y}) -%# -%# Return the three derivatives of the non--stiff ordinary differential equations (non--stiff ODEs) from the Roessler attractor implementation, cf. @url{http://en.wikipedia.org/wiki/R%C3%B6ssler_attractor} for further details. The output argument @var{ydot} is a column vector and contains the derivatives, the input argument @var{y} also is a column vector that contains the integration results from the previous integration step and @var{t} is a double scalar that keeps the actual time stamp. There is no error handling implemented in this function to achieve the highest performance available. -%# -%# Run examples with the command -%# @example -%# demo odepkg_equations_roessler -%# @end example -%# @end deftypefn -%# -%# @seealso{odepkg} - -function y = odepkg_equations_roessler (t, x) - y = [- ( x(2) + x(3) ); - x(1) + 0.2 * x(2); - 0.2 + x(1) * x(3) - 5.7 * x(3)]; - -%!test -%! warning ("off", "OdePkg:InvalidOption"); -%! A = odeset ('MaxStep', 1e-1); -%! [t, y] = ode78 (@odepkg_equations_roessler, [0 70], [0.1 0.3 0.1], A); - -%!demo -%! -%! A = odeset ('MaxStep', 1e-1); -%! [t, y] = ode78 (@odepkg_equations_roessler, [0 70], [0.1 0.3 0.1], A); -%! -%! subplot (2, 2, 1); grid ('on'); plot (t, y(:,1), '-b;f_x(t);', ... -%! t, y(:,2), '-g;f_y(t);', t, y(:,3), '-r;f_z(t);'); -%! subplot (2, 2, 2); grid ('on'); plot (y(:,1), y(:,2), '-b;f_{xyz}(x, y);'); -%! subplot (2, 2, 3); grid ('on'); plot (y(:,2), y(:,3), '-b;f_{xyz}(y, z);'); -%! subplot (2, 2, 4); grid ('on'); plot3 (y(:,1), y(:,2), y(:,3), ... -%! '-b;f_{xyz}(x, y, z);'); -%! -%! % ---------------------------------------------------------------------------- -%! % The upper left subfigure shows the three results of the integration over -%! % time. The upper right subfigure shows the force f in a two dimensional (x,y) -%! % plane as well as the lower left subfigure shows the force in the (y,z) -%! % plane. The three dimensional force is plotted in the lower right subfigure. - -%# Local Variables: *** -%# mode: octave *** -%# End: *** Deleted: trunk/octave-forge/main/odepkg/inst/odepkg_equations_secondorderlag.m =================================================================== --- trunk/octave-forge/main/odepkg/inst/odepkg_equations_secondorderlag.m 2008-03-11 16:50:08 UTC (rev 4715) +++ trunk/octave-forge/main/odepkg/inst/odepkg_equations_secondorderlag.m 2008-03-11 16:50:41 UTC (rev 4716) @@ -1,114 +0,0 @@ -%# Copyright (C) 2006-2008, Thomas Treichl <tr...@us...> -%# OdePkg - A package for solving differential equations with GNU Octave -%# -%# This program is free software; you can redistribute it and/or modify -%# it under the terms of the GNU General Public License as published by -%# the Free Software Foundation; either version 2 of the License, or -%# (at your option) any later version. -%# -%# This program is distributed in the hope that it will be useful, -%# but WITHOUT ANY WARRANTY; without even the implied warranty of -%# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -%# GNU General Public License for more details. -%# -%# You should have received a copy of the GNU General Public License -%# along with this program; If not, see <http://www.gnu.org/licenses/>. - -%# -*- texinfo -*- -%# @deftypefn {Function File} {[@var{ydot}] =} odepkg_equations_secondorderlag (@var{t}, @var{y}, [@var{u}, @var{K}, @var{T1}, @var{T2}]) -%# -%# Return two derivatives of the non-stiff ordinary differential equations (non-stiff ODEs) from the second order lag implementation, cf. @url{http://en.wikipedia.org/wiki/Category:Control_theory} for further details. The output argument @var{ydot} is a column vector and contains the derivatives, the input argument @var{y} also is a column vector that contains the integration results from the previous integration step and @var{t} is a double scalar that keeps the actual time stamp. There is no error handling implemented in this function to achieve the highest performance available. -%# -%# Run examples with the command -%# @example -%# demo odepkg_equations_secondorderlag -%# @end example -%# @end deftypefn -%# -%# @seealso{odepkg} - -function ydot = odepkg_equations_secondorderlag (tvar, yvar, varargin) - - %# odepkg_equations_vanderpol is a demo function. Therefore some - %# error handling is done. If you would write your own function you - %# would not add any error handling to achieve highest performance. - - if (nargin == 0) - help ('odepkg_equations_secondorderlag'); - vmsg = sprintf ('Number of input arguments must be greater than zero'); - error (vmsg); - - elseif (nargin <= 1) - vmsg = sprintf ('Number of input arguments must be greater or equal than 2'); - error (vmsg); - - elseif (isnumeric (tvar) == false || isnumeric (yvar) == false) - vmsg = sprintf ('First and second input argument must be valid numeric values'); - error (vmsg); - - elseif (isvector (yvar) == false || length (yvar) ~= 2) - vmsg = sprintf ('Second input argument must be a vector of length 2'); - error (vmsg); - end - - %# yvar and ydot must be column vectors - %# Check if varargin arguments are given - if (length (varargin) > 0) - if (length (varargin) ~= 4) - vmsg = sprintf ('If parametrizing arguments are given then number of these arguments must match 4'); - error (vmsg); - end - vu = varargin{1}; %# vu is the input signal of the control system - vK = varargin{2}; %# vK is the amplification of the control system - vT1 = varargin{3}; %# vT1 is the smaller time constant that is indominant - vT2 = varargin{4}; %# vT2 is the greater time constant that is dominant - else - vu = 10; vK = 1; vT1 = 0.01; vT2 = 0.1; - end - - ydot(1,1) = yvar(2,1); - ydot(2,1) = 1/vT1 * (- yvar(1,1) - vT2*yvar(2,1) + vK*vu); - -%!test -%! warning ("off", "OdePkg:InvalidOption"); -%! [vt, vy] = ode45 (@odepkg_equations_secondorderlag, [0 1], [0 0]); -%!test -%! [vt, vy] = ode45 (@odepkg_equations_secondorderlag, [0 1], [3 2]); - -%!demo -%! -%! A = odeset ('RelTol', 1e-3); -%! [vt, vy] = ode45 (@odepkg_equations_secondorderlag, [0 1.4], [0 0], A); -%! -%! axis ([0 1.4]); -%! plot(vt, 10 * ones (length (vy(:,1)),1), "-or;in (t);", ... -%! vt, vy(:,1), "-ob;out (t);"); -%! -%! % --------------------------------------------------------------------------- -%! % The figure window shows the input signal and the output signal of the -%! % "Second Order Lag" implementation. The mathematical describtion for this -%! % differential equation is -%! % -%! % y + T2 * dy/dt + T1 * d^2y/dt^2 = K * u. -%! % -%! % If not manually parametrized then u = 10, K = 1, T1 = 0.01s and T2 = 0.1s^2 -%! % and then accumulated value (t->inf) is y = K * u = 10. -%!demo -%! -%! A = odeset ('RelTol', 2e-2, 'NormControl', 'on'); -%! [vt, vy] = ode45 (@odepkg_equations_secondorderlag, ... -%! [0 12], [0 0], A, 5, 1, 0.01, 0.01); -%! -%! axis ([0 12]); -%! plot(vt, 5 * ones (length (vy(:,1)),1), "-or;in (t);", ... -%! vt, vy(:,1), "-ob;out (t);"); -%! -%! % --------------------------------------------------------------------------- -%! % The figure window shows the input signal and the output signal of a -%! % parametrized "Second Order Lag" implementation. The parameters for this -%! % example are u = 5, K = 1, T1 = 0.01, T2 = 0.01. The accumulated value -%! % (t->inf) is y = K * u = 5. - -%# Local Variables: *** -%# mode: octave *** -%# End: *** Deleted: trunk/octave-forge/main/odepkg/inst/odepkg_equations_vanderpol.m =================================================================== --- trunk/octave-forge/main/odepkg/inst/odepkg_equations_vanderpol.m 2008-03-11 16:50:08 UTC (rev 4715) +++ trunk/octave-forge/main/odepkg/inst/odepkg_equations_vanderpol.m 2008-03-11 16:50:41 UTC (rev 4716) @@ -1,104 +0,0 @@ -%# Copyright (C) 2006-2008, Thomas Treichl <tr...@us...> -%# OdePkg - A package for solving differential equations with GNU Octave -%# -%# This program is free software; you can redistribute it and/or modify -%# it under the terms of the GNU General Public License as published by -%# the Free Software Foundation; either version 2 of the License, or -%# (at your option) any later version. -%# -%# This program is distributed in the hope that it will be useful, -%# but WITHOUT ANY WARRANTY; without even the implied warranty of -%# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -%# GNU General Public License for more details. -%# -%# You should have received a copy of the GNU General Public License -%# along with this program; If not, see <http://www.gnu.org/licenses/>. - -%# -*- texinfo -*- -%# @deftypefn {Function File} {[@var{ydot}] =} odepkg_equations_vanderpol (@var{t}, @var{y}, [@var{mu}]) -%# -%# Return the two derivatives of the non-stiff ordinary differential equations (non-stiff ODEs) from the "Van der Pol" implementation, cf. @url{http://en.wikipedia.org/wiki/Van_der_Pol_oscillator} for further details. The output argument @var{ydot} is a column vector and contains the derivatives, the input argument @var{y} also is a column vector that contains the integration results from the previous integration step and @var{t} is a double scalar that keeps the actual time stamp. There is no error handling implemented in this function to achieve the highest performance available. -%# -%# Run examples with the command -%# @example -%# demo odepkg_equations_vanderpol -%# @end example -%# @end deftypefn -%# -%# @seealso{odepkg} - -function ydot = odepkg_equations_vanderpol (tvar, yvar, varargin) - - %# odepkg_equations_vanderpol is a demo function. Therefore some - %# error handling is done. If you would write your own function you - %# would not add any error handling to achieve highest performance. - - if (nargin == 0) - help ('odepkg_equations_vanderpol'); - vmsg = sprintf ('Number of input arguments must be greater than zero'); - error (vmsg); - - elseif (nargin < 2 || nargin > 3) - vmsg = sprintf ('Number of input arguments must be greater 1 and lower 4'); - error (vmsg); - - elseif (isnumeric (tvar) == false || isnumeric (yvar) == false) - vmsg = sprintf ('First and second input argument must be valid numeric values'); - error (vmsg); - - elseif (isvector (yvar) == false || length (yvar) ~= 2) - vmsg = sprintf ('Second input argument must be a vector of length 2'); - error (vmsg); - end - - if (length (varargin) == 1) %# Check if parameter mu is given - if (isscalar (varargin{1}) == true) - mu = varargin{1}; - else - vmsg = sprintf ('Third input argument must be a valid scalar'); - error (vmsg); - end - else, mu = 1; end - - %# yvar and ydot must be column vectors - ydot = [yvar(2); ... - mu * (1 - yvar(1)^2) * yvar(2) - yvar(1)]; - -%#! A stiff ode euqation test preocedure is -%#! A = odeset ('RelTol', 1e-1, 'AbsTol', 1, 'InitialStep', 1e-2, ... -%#! 'NormControl', 'on', 'Stats', 'on', 'OutputFcn', @odeprint); -%#! [x, y] = ode78 (@odepkg_equations_vanderpol, [0 300], [2 0], A, 100); - -%!test -%! warning ("off", "OdePkg:InvalidOption"); -%! [vt, vy] = ode78 (@odepkg_equations_vanderpol, [0 1], [2 0]); - -%!demo -%! -%! [vt, vy] = ode78 (@odepkg_equations_vanderpol, [0 20], [2 0]); -%! -%! axis ([0, 20]); -%! plot (vt, vy(:,1), '-or;x1(t);', vt, vy(:,2), '-ob;x2(t);'); -%! -%! % --------------------------------------------------------------------------- -%! % The figure window shows the two states of the "Van Der Pol" implementation -%! % example. The math equation for this differential equation is -%! % -%! % d^2y/dt^2 - mu*(1-y^2)*dy/dt + y = 0. -%! % -%! % If not manually parametrized then mu = 1. -%!demo -%! -%! A = odeset ('NormControl', 'on', 'InitialStep', 1e-3); -%! [vt, vy] = ode78 (@odepkg_equations_vanderpol, [0 40], [2 0], A, 20); -%! -%! axis ([0, 40]); -%! plot (vt, vy(:,1), '-or;x1(t);', vt, vy(:,2), '-ob;x2(t);'); -%! -%! % --------------------------------------------------------------------------- -%! % The figure window shows the two integrated states of the "Van Der Pol" -%! % implementation. The parameter mu = 20 was set manually for this demo. - -%# Local Variables: *** -%# mode: octave *** -%# End: *** \ No newline at end of file This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <tr...@us...> - 2008-03-11 16:51:22
|
Revision: 4717 http://octave.svn.sourceforge.net/octave/?rev=4717&view=rev Author: treichl Date: 2008-03-11 09:51:23 -0700 (Tue, 11 Mar 2008) Log Message: ----------- Initially added new examples to the OdePkg. Added Paths: ----------- trunk/octave-forge/main/odepkg/inst/odeexamples.m trunk/octave-forge/main/odepkg/inst/odepkg_examples_dae.m trunk/octave-forge/main/odepkg/inst/odepkg_examples_dde.m trunk/octave-forge/main/odepkg/inst/odepkg_examples_ide.m trunk/octave-forge/main/odepkg/inst/odepkg_examples_ode.m Added: trunk/octave-forge/main/odepkg/inst/odeexamples.m =================================================================== --- trunk/octave-forge/main/odepkg/inst/odeexamples.m (rev 0) +++ trunk/octave-forge/main/odepkg/inst/odeexamples.m 2008-03-11 16:51:23 UTC (rev 4717) @@ -0,0 +1,53 @@ +%# Copyright (C) 2007-2008, Thomas Treichl <tr...@us...> +%# OdePkg - A package for solving differential equations with GNU Octave +%# +%# This program is free software; you can redistribute it and/or modify +%# it under the terms of the GNU General Public License as published by +%# the Free Software Foundation; either version 2 of the License, or +%# (at your option) any later version. +%# +%# This program is distributed in the hope that it will be useful, +%# but WITHOUT ANY WARRANTY; without even the implied warranty of +%# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +%# GNU General Public License for more details. +%# +%# You should have received a copy of the GNU General Public License +%# along with this program; if not, write to the Free Software +%# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +%# -*- texinfo -*- +%# @deftypefn {Function File} {[@var{}] =} odepkg_examples_dde (@var{}) +%# Open the differential equations examples menu and allow the user to select a submenu of ODE, DAE, IDE or DDE. +%# @end deftypefn + +function [] = odeexamples (varargin) + + vfam = 1; while (vfam > 0) + clc; + fprintf (1, ... + ['OdePkg examples main menu:\n', ... + '==========================\n', ... + '\n', ... + ' (1) Open the ODE examples menu\n', ... + ' (2) Open the DAE examples menu\n', ... + ' (3) Open the IDE examples menu\n', ... + ' (4) Open the DDE examples menu\n', ... + '\n']); + vfam = input ('Please choose a number from above or press <Enter> to return: '); + switch (vfam) + case 1 + odepkg_examples_ode; + case 2 + odepkg_examples_dae; + case 3 + odepkg_examples_ide; + case 4 + odepkg_examples_dde; + otherwise + %# have nothing to do + end + end + +%# Local Variables: *** +%# mode: octave *** +%# End: *** Added: trunk/octave-forge/main/odepkg/inst/odepkg_examples_dae.m =================================================================== --- trunk/octave-forge/main/odepkg/inst/odepkg_examples_dae.m (rev 0) +++ trunk/octave-forge/main/odepkg/inst/odepkg_examples_dae.m 2008-03-11 16:51:23 UTC (rev 4717) @@ -0,0 +1,85 @@ +%# Copyright (C) 2008, Thomas Treichl <tr...@us...> +%# OdePkg - A package for solving differential equations with GNU Octave +%# +%# This program is free software; you can redistribute it and/or modify +%# it under the terms of the GNU General Public License as published by +%# the Free Software Foundation; either version 2 of the License, or +%# (at your option) any later version. +%# +%# This program is distributed in the hope that it will be useful, +%# but WITHOUT ANY WARRANTY; without even the implied warranty of +%# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +%# GNU General Public License for more details. +%# +%# You should have received a copy of the GNU General Public License +%# along with this program; If not, see <http://www.gnu.org/licenses/>. + +%# -*- texinfo -*- +%# @deftypefn {Function File} {[@var{}] =} odepkg_examples_dae (@var{}) +%# Open the DAE examples menu and allow the user to select a demo that will be evaluated. +%# @end deftypefn + +function [] = odepkg_examples_dae () + + vode = 1; while (vode > 0) + clc; + fprintf (1, ... + ['DAE examples menu:\n', ... + '==================\n', ... + '\n', ... + ' (1) Solve the "Robertson problem" with solver "ode2r"\n', ... + ' (2) Solve another "Robertson implementation" with solver "ode5r"\n', ... + '\n', ... + ' Note: There are further DAE examples available with the OdePkg\n', ... + ' testsuite functions.\n', ... + '\n', ... + ' If you have another interesting DAE example that you would like\n', ... + ' to share then please modify this file, create a patch and send\n', ... + ' your patch with your added example to the OdePkg developer team.\n', ... + '\n' ]); + vode = input ('Please choose a number from above or press <Enter> to return: '); + clc; if (vode > 0 && vode < 3) + %# We can't use the function 'demo' directly here because it does + %# not allow to run other functions within a demo. + vexa = example (mfilename (), vode); + disp (vexa); eval (vexa); + input ('Press <Enter> to continue: '); + end %# if (vode > 0) + end %# while (vode > 0) + +%!demo +%! # Solve the "Robertson problem" with a Mass function that is given by +%! # a function handle. +%! +%! function [vyd] = frobertson (vt, vy, varargin) +%! vyd(1,1) = -0.04 * vy(1) + 1e4 * vy(2) * vy(3); +%! vyd(2,1) = 0.04 * vy(1) - 1e4 * vy(2) * vy(3) - 3e7 * vy(2)^2; +%! vyd(3,1) = vy(1) + vy(2) + vy(3) - 1; +%! endfunction +%! +%! function [vmass] = fmass (vt, vy, varargin) +%! vmass = [1, 0, 0; 0, 1, 0; 0, 0, 0]; +%! endfunction +%! +%! vopt = odeset ('Mass', @fmass, 'NormControl', 'on'); +%! vsol = ode2r (@frobertson, [0, 1e11], [1, 0, 0], vopt); +%! plot (vsol.x, vsol.y); + +%!demo +%! # Solve the "Robertson problem" with a Mass function that is given by +%! # a constant mass matrix. +%! +%! function [vyd] = frobertson (vt, vy, varargin) +%! vyd(1,1) = -0.04 * vy(1) + 1e4 * vy(2) * vy(3); +%! vyd(2,1) = 0.04 * vy(1) - 1e4 * vy(2) * vy(3) - 3e7 * vy(2)^2; +%! vyd(3,1) = vy(1) + vy(2) + vy(3) - 1; +%! endfunction +%! +%! vopt = odeset ('Mass', [1, 0, 0; 0, 1, 0; 0, 0, 0], ... +%! 'NormControl', 'on'); +%! vsol = ode5r (@frobertson, [0, 1e11], [1, 0, 0], vopt); +%! plot (vsol.x, vsol.y); + +%# Local Variables: *** +%# mode: octave *** +%# End: *** Added: trunk/octave-forge/main/odepkg/inst/odepkg_examples_dde.m =================================================================== --- trunk/octave-forge/main/odepkg/inst/odepkg_examples_dde.m (rev 0) +++ trunk/octave-forge/main/odepkg/inst/odepkg_examples_dde.m 2008-03-11 16:51:23 UTC (rev 4717) @@ -0,0 +1,132 @@ +%# Copyright (C) 2008, Thomas Treichl <tr...@us...> +%# OdePkg - A package for solving differential equations with GNU Octave +%# +%# This program is free software; you can redistribute it and/or modify +%# it under the terms of the GNU General Public License as published by +%# the Free Software Foundation; either version 2 of the License, or +%# (at your option) any later version. +%# +%# This program is distributed in the hope that it will be useful, +%# but WITHOUT ANY WARRANTY; without even the implied warranty of +%# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +%# GNU General Public License for more details. +%# +%# You should have received a copy of the GNU General Public License +%# along with this program; If not, see <http://www.gnu.org/licenses/>. + +%# -*- texinfo -*- +%# @deftypefn {Function File} {[@var{}] =} odepkg_examples_dde (@var{}) +%# Open the DDE examples menu and allow the user to select a demo that will be evaluated. +%# @end deftypefn + +function [] = odepkg_examples_dde () + + vode = 1; while (vode > 0) + clc; + fprintf (1, ... + ['DDE examples menu:\n', ... + '==================\n', ... + '\n', ... + ' (1) Solve a simple "exp(...)" example with solver "ode23d"\n', ... + ' (2) Solve an example from Wille and Baker with solver "ode45d"\n', ... + ' (3) Solve an example from Hu and Wang with solver "ode54d"\n', ... + ' (4) Solve the "infectious disease model" with solver "ode78d"\n', ... + '\n', ... + ' Note: There are further DDE examples available with the OdePkg\n', ... + ' testsuite functions.\n', ... + '\n', ... + ' If you have another interesting DDE example that you would like\n', ... + ' to share then please modify this file, create a patch and send\n', ... + ' your patch with your added example to the OdePkg developer team.\n', ... + '\n' ]); + vode = input ('Please choose a number from above or press <Enter> to return: '); + clc; if (vode > 0 && vode < 5) + %# We can't use the function 'demo' directly here because it does + %# not allow to run other functions within a demo. + vexa = example (mfilename (), vode); + disp (vexa); eval (vexa); + input ('Press <Enter> to continue: '); + end %# if (vode > 0) + end %# while (vode > 0) + +%!demo +%! # Solves a simple example where the delay differential equation is +%! # of the form yd = e^(-lambda*t) - y(t-tau). +%! +%! function [vyd] = fexp (vt, vy, vz, varargin) +%! vlambda = varargin{1}; +%! vyd = exp (- vlambda * vt) - vz(1); +%! endfunction +%! +%! vtslot = [0, 15]; vlambda = 1; vinit = 10; +%! vopt = odeset ('NormControl', 'on', 'RelTol', 1e-4, 'AbsTol', 1e-4); +%! vsol = ode23d (@fexp, vtslot, vinit, vlambda, vinit, vopt, vlambda); +%! plot (vsol.x, vsol.y); + +%!demo +%! # Solves the example 3 from the publication 'DELSOL - a numerical +%! # code for the solution of systems of delay-differential equations' +%! # from the authors David Wille and Christopher Baker. +%! +%! function [vyd] = fdelsol (vt, vy, vz, varargin) +%! %# vy is a column vector of size (3,1) +%! %# vz is the history of size (3,2) +%! vyd = [vz(1,1); vz(1,1) + vz(2,2); vy(2,1)]; +%! endfunction +%! +%! vopt = odeset ('NormControl', 'on', 'MaxStep', 0.1, 'InitialStep', 0.01); +%! vsol = ode45d (@fdelsol, [0, 5], [1, 1, 1], [1, 0.2], ones(3,2), vopt); +%! plot (vsol.x, vsol.y); + +%!demo +%! # Solves the examples 2.3.1 and 2.3.2 from the book 'Dynamics of +%! # Controlled Mechanical Systems with Delayed Feedback' from the +%! # authors Haiyan Hu and Zaihua Wang. +%! +%! function [vyd] = fhuwang1 (vt, vy, vz, varargin) +%! %# vy is of size (1,1), vz is of size (1,1) +%! vyd = (vz(1,1) - varargin{1})^(1/3); +%! endfunction +%! +%! function [vyd] = fhuwang2 (vt, vy, vz, varargin) +%! %# vy is of size (1,1), vz is of size (1,1) +%! vyd = (vy - vz)^(1/3); +%! endfunction +%! +%! vtslot = [0, 10]; vK = 1; vinit = 1; vhist = 0; +%! vopt = odeset ('NormControl', 'on', 'RelTol', 1e-6, 'InitialStep', 0.1); +%! +%! vsol = ode54d (@fhuwang1, vtslot, vK, vinit, vhist, vopt, vK); +%! plot (vsol.x, vsol.y, 'ko-', 'markersize', 1); hold; +%! +%! vsol = ode54d (@fhuwang2, vtslot, vK, vinit, vhist, vopt, vK); +%! plot (vsol.x, vsol.y, 'bx-', 'markersize', 1); + +%!demo +%! # Solves the infectious disease model from the book 'Solving Ordinary +%! # Differential Equations 1' from the authors Ernst Hairer and Gerhard +%! # Wanner. +%! +%! function [vyd] = finfect (vx, vy, vz, varargin) +%! %# vy is of size (3,1), vz is of size (3,2) +%! vyd = [ - vy(1) * vz(2,1) + vz(2,2); +%! vy(1) * vz(2,1) - vy(2); +%! vy(2) - vz(2,2) ]; +%! endfunction +%! +%! function [vval, vtrm, vdir] = fevent (vx, vy, vz, varargin) +%! %# vy is of size (3,1), vz is of size (3,2) +%! vfec = finfect (vx, vy, vz); +%! vval = vfec(2:3); %# Have a look at component two + three +%! vtrm = zeros(1,2); %# Don't stop if an event is found +%! vdir = -ones(1,2); %# Check only for falling direction +%! endfunction +%! +%! vopt = odeset ('InitialStep', 1e-3, 'Events', @fevent); +%! vsol = ode78d (@finfect, [0, 40], [5, 0.1, 1], [1, 10], ... +%! [5, 5; 0.1, 0.1; 1, 1], vopt); +%! plot (vsol.x, vsol.y, 'k-', vsol.xe, vsol.ye, 'ro'); + +%# Local Variables: *** +%# mode: octave *** +%# End: *** Added: trunk/octave-forge/main/odepkg/inst/odepkg_examples_ide.m =================================================================== --- trunk/octave-forge/main/odepkg/inst/odepkg_examples_ide.m (rev 0) +++ trunk/octave-forge/main/odepkg/inst/odepkg_examples_ide.m 2008-03-11 16:51:23 UTC (rev 4717) @@ -0,0 +1,80 @@ +%# Copyright (C) 2008, Thomas Treichl <tr...@us...> +%# OdePkg - A package for solving differential equations with GNU Octave +%# +%# This program is free software; you can redistribute it and/or modify +%# it under the terms of the GNU General Public License as published by +%# the Free Software Foundation; either version 2 of the License, or +%# (at your option) any later version. +%# +%# This program is distributed in the hope that it will be useful, +%# but WITHOUT ANY WARRANTY; without even the implied warranty of +%# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +%# GNU General Public License for more details. +%# +%# You should have received a copy of the GNU General Public License +%# along with this program; If not, see <http://www.gnu.org/licenses/>. + +%# -*- texinfo -*- +%# @deftypefn {Function File} {[@var{}] =} odepkg_examples_ide (@var{}) +%# Open the IDE examples menu and allow the user to select a demo that will be evaluated. +%# @end deftypefn + +function [] = odepkg_examples_ide () + + vode = 1; while (vode > 0) + clc; + fprintf (1, ... + ['IDE examples menu:\n', ... + '==================\n', ... + '\n', ... + ' (1) Solve the "Robertson problem" with solver "odebdi"\n', ... + ' (2) Solve another "Robertson implementation" with solver "odekdi"\n', ... + '\n', ... + ' Note: There are further IDE examples available with the OdePkg\n', ... + ' testsuite functions.\n', ... + '\n', ... + ' If you have another interesting IDE example that you would like\n', ... + ' to share then please modify this file, create a patch and send\n', ... + ' your patch to the OdePkg developer team.\n', ... + '\n' ]); + vode = input ('Please choose a number from above or press <Enter> to return: '); + clc; if (vode > 0 && vode < 3) + %# We can't use the function 'demo' directly here because it does + %# not allow to run other functions within a demo. + vexa = example (mfilename (), vode); + disp (vexa); eval (vexa); + input ('Press <Enter> to continue: '); + end %# if (vode > 0) + end %# while (vode > 0) + +%!demo +%! # Solve the "Robertson problem" that is given as a function handle +%! # to an implicite differential equation implementation. +%! +%! function [vres] = firobertson (vt, vy, vyd, varargin) +%! vres(1,1) = -0.04*vy(1) + 1e4*vy(2)*vy(3) - vyd(1); +%! vres(2,1) = 0.04*vy(1) - 1e4*vy(2)*vy(3) - 3e7*vy(2)^2-vyd(2); +%! vres(3,1) = vy(1) + vy(2) + vy(3) - 1; +%! endfunction +%! +%! vopt = odeset ('NormControl', 'on'); +%! vsol = odebdi (@firobertson, [0, 1e11], [1, 0, 0], [-4e-2, 4e-2, 0], vopt); +%! plot (vsol.x, vsol.y); + +%!demo +%! # Solve the "Robertson problem" that is given as a function handle +%! # to an implicite differential equation implementation. +%! +%! function [vres] = firobertson (vt, vy, vyd, varargin) +%! vres(1,1) = -0.04*vy(1) + 1e4*vy(2)*vy(3) - vyd(1); +%! vres(2,1) = 0.04*vy(1) - 1e4*vy(2)*vy(3) - 3e7*vy(2)^2-vyd(2); +%! vres(3,1) = vy(1) + vy(2) + vy(3) - 1; +%! endfunction +%! +%! vopt = odeset ('NormControl', 'on'); +%! vsol = odekdi (@firobertson, [0, 1e11], [1, 0, 0], [-4e-2, 4e-2, 0], vopt); +%! plot (vsol.x, vsol.y); + +%# Local Variables: *** +%# mode: octave *** +%# End: *** Added: trunk/octave-forge/main/odepkg/inst/odepkg_examples_ode.m =================================================================== --- trunk/octave-forge/main/odepkg/inst/odepkg_examples_ode.m (rev 0) +++ trunk/octave-forge/main/odepkg/inst/odepkg_examples_ode.m 2008-03-11 16:51:23 UTC (rev 4717) @@ -0,0 +1,151 @@ +%# Copyright (C) 2008, Thomas Treichl <tr...@us...> +%# OdePkg - A package for solving differential equations with GNU Octave +%# +%# This program is free software; you can redistribute it and/or modify +%# it under the terms of the GNU General Public License as published by +%# the Free Software Foundation; either version 2 of the License, or +%# (at your option) any later version. +%# +%# This program is distributed in the hope that it will be useful, +%# but WITHOUT ANY WARRANTY; without even the implied warranty of +%# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +%# GNU General Public License for more details. +%# +%# You should have received a copy of the GNU General Public License +%# along with this program; If not, see <http://www.gnu.org/licenses/>. + +%# -*- texinfo -*- +%# @deftypefn {Function File} {[@var{}] =} odepkg_examples_ode (@var{}) +%# Open the ODE examples menu and allow the user to select a demo that will be evaluated. +%# @end deftypefn + +function [] = odepkg_examples_ode () + + vode = 1; while (vode > 0) + clc; + fprintf (1, ... + ['ODE examples menu:\n', ... + '==================\n', ... + '\n', ... + ' (1) Solve a non-stiff "Vanderpol" example with solver "ode78"\n', ... + ' (2) Solve a "Pendulous" example with solver "ode45"\n', ... + ' (3) Solve the "Lorenz attractor" with solver "ode54"\n', ... + ' (4) Solve the "Roessler equation" with solver "ode78"\n', ... + '\n', ... + ' Note: There are further ODE examples available with the OdePkg\n', ... + ' testsuite functions.\n', ... + '\n', ... + ' If you have another interesting ODE example that you would like\n', ... + ' to share then please modify this file, create a patch and send\n', ... + ' your patch with your added example to the OdePkg developer team.\n', ... + '\n' ]); + vode = input ('Please choose a number from above or press <Enter> to return: '); + clc; if (vode > 0 & vode < 5) + %# We can't use the function 'demo' directly here because it does + %# not allow to run other functions within a demo. + vexa = example (mfilename (), vode); + disp (vexa); eval (vexa); + input ('Press <Enter> to continue: '); + end %# if (vode > 0) + end %# while (vode > 0) + +%!demo +%! # In this example the non-stiff "Van der Pol" equation (mu = 1) is +%! # solved and the results are displayed in a figure while solving. +%! # Read about the Van der Pol oscillator at +%! # http://en.wikipedia.org/wiki/Van_der_Pol_oscillator. +%! +%! function [vyd] = fvanderpol (vt, vy, varargin) +%! mu = varargin{1}; +%! vyd = [vy(2); mu * (1 - vy(1)^2) * vy(2) - vy(1)]; +%! endfunction +%! +%! vopt = odeset ('RelTol', 1e-8); +%! ode78 (@fvanderpol, [0 20], [2 0], vopt, 1); + +%!demo +%! # In this example a simple "pendulum with damping" is solved and the +%! # results are displayed in a figure while solving. Read about the +%! # pendulum with damping at +%! # http://en.wikipedia.org/wiki/Pendulum +%! +%! function [vyd] = fpendulum (vt, vy) +%! m = 1; %# The pendulum mass in kg +%! g = 9.81; %# The gravity in m/s^2 +%! l = 1; %# The pendulum length in m +%! b = 0.7; %# The damping factor in kgm^2/s +%! vyd = [vy(2,1); ... +%! 1 / (1/3 * m * l^2) * (-b * vy(2,1) - m * g * l/2 * sin (vy(1,1)))]; +%! endfunction +%! +%! vopt = odeset ('RelTol', 1e-3, 'OutputFcn', @odeplot); +%! ode45 (@fpendulum, [0 5], [30*pi/180, 0], vopt); + +%!demo +%! # In this example the "Lorenz attractor" implementation is solved +%! # and the results are plot in a figure after solving. Read about +%! # the Lorenz attractor at +%! # http://en.wikipedia.org/wiki/Lorenz_equation +%! # +%! # The upper left subfigure shows the three results of the integration +%! # over time. The upper right subfigure shows the force f in a two +%! # dimensional (x,y) plane as well as the lower left subfigure shows +%! # the force in the (y,z) plane. The three dimensional force is plot +%! # in the lower right subfigure. +%! +%! function [vyd] = florenz (vt, vy) +%! vyd = [10 * (vy(2) - vy(1)); +%! vy(1) * (28 - vy(3)); +%! vy(1) * vy(2) - 8/3 * vy(3)]; +%! endfunction +%! +%! A = odeset ('InitialStep', 1e-3, 'MaxStep', 1e-1); +%! [t, y] = ode54 (@florenz, [0 25], [3 15 1], A); +%! +%! subplot (2, 2, 1); grid ('on'); +%! plot (t, y(:,1), '-b', t, y(:,2), '-g', t, y(:,3), '-r'); +%! legend ('f_x(t)', 'f_y(t)', 'f_z(t)'); +%! subplot (2, 2, 2); grid ('on'); +%! plot (y(:,1), y(:,2), '-b'); +%! legend ('f_{xyz}(x, y)'); +%! subplot (2, 2, 3); grid ('on'); +%! plot (y(:,2), y(:,3), '-b'); +%! legend ('f_{xyz}(y, z)'); +%! subplot (2, 2, 4); grid ('on'); +%! plot3 (y(:,1), y(:,2), y(:,3), '-b'); +%! legend ('f_{xyz}(x, y, z)'); + +%!demo +%! # In this example the "Roessler attractor" implementation is solved +%! # and the results are plot in a figure after solving. Read about +%! # the Roessler attractor at +%! # http://en.wikipedia.org/wiki/R%C3%B6ssler_attractor +%! # +%! # The upper left subfigure shows the three results of the integration +%! # over time. The upper right subfigure shows the force f in a two +%! # dimensional (x,y) plane as well as the lower left subfigure shows +%! # the force in the (y,z) plane. The three dimensional force is plot +%! # in the lower right subfigure. +%! +%! function [vyd] = froessler (vt, vx) +%! vyd = [- ( vx(2) + vx(3) ); +%! vx(1) + 0.2 * vx(2); +%! 0.2 + vx(1) * vx(3) - 5.7 * vx(3)]; +%! endfunction +%! +%! A = odeset ('MaxStep', 1e-1); +%! [t, y] = ode78 (@froessler, [0 70], [0.1 0.3 0.1], A); +%! +%! subplot (2, 2, 1); grid ('on'); +%! plot (t, y(:,1), '-b;f_x(t);', t, y(:,2), '-g;f_y(t);', \ +%! t, y(:,3), '-r;f_z(t);'); +%! subplot (2, 2, 2); grid ('on'); +%! plot (y(:,1), y(:,2), '-b;f_{xyz}(x, y);'); +%! subplot (2, 2, 3); grid ('on'); +%! plot (y(:,2), y(:,3), '-b;f_{xyz}(y, z);'); +%! subplot (2, 2, 4); grid ('on'); +%! plot3 (y(:,1), y(:,2), y(:,3), '-b;f_{xyz}(x, y, z);'); + +%# Local Variables: *** +%# mode: octave *** +%# End: *** This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <tr...@us...> - 2008-03-11 20:26:50
|
Revision: 4719 http://octave.svn.sourceforge.net/octave/?rev=4719&view=rev Author: treichl Date: 2008-03-11 13:26:46 -0700 (Tue, 11 Mar 2008) Log Message: ----------- Minor changes. Modified Paths: -------------- trunk/octave-forge/main/odepkg/inst/odepkg_event_handle.m trunk/octave-forge/main/odepkg/inst/odepkg_structure_check.m Modified: trunk/octave-forge/main/odepkg/inst/odepkg_event_handle.m =================================================================== --- trunk/octave-forge/main/odepkg/inst/odepkg_event_handle.m 2008-03-11 16:52:44 UTC (rev 4718) +++ trunk/octave-forge/main/odepkg/inst/odepkg_event_handle.m 2008-03-11 20:26:46 UTC (rev 4719) @@ -145,8 +145,8 @@ %!test %# Two calls to find the event that may occur with ODE/DAE syntax %! A = odepkg_event_handle (@feveode, 2.0, [ 0 0 3 2], '', 123, 456); %! B = odepkg_event_handle (@feveode, 3.0, [-1 0 3 2], '', 123, 456); -%! assert (A{:}, {[], [], [], []}); -%! assert (B{:}, {1, 1, 2, [0 0 3 2]}); +%! assert (A, {[], [], [], []}); +%! assert (B{4}, [0 0 3 2]); %!test %# Last call to cleanup the odepkg_event_handle function %! odepkg_event_handle (@feveode, 4.0, [0 1 2 3], 'done', 123, 456); %!test %# First call to initialize the odepkg_event_handle function @@ -154,8 +154,8 @@ %!test %# Two calls to find the event that may occur with IDE/DDE syntax %! A = odepkg_event_handle (@feveide, 2.0, {[0 0 3 2], [0 0 3 2]}, '', 123, 456); %! B = odepkg_event_handle (@feveide, 3.0, {[-1 0 3 2], [0 0 3 2]}, '', 123, 456); -%! assert (A{:}, {[], [], [], []}); -%! assert (B{:}, {1, 1, 2, [0 0 3 2]}); +%! assert (A, {[], [], [], []}); +%! assert (B{4}, [0 0 3 2]); %!test %# Last call to cleanup the odepkg_event_handle function %! odepkg_event_handle (@feveide, 4.0, {[0 1 2 3], [0 1 2 3]}, 'done', 123, 456); Modified: trunk/octave-forge/main/odepkg/inst/odepkg_structure_check.m =================================================================== --- trunk/octave-forge/main/odepkg/inst/odepkg_structure_check.m 2008-03-11 16:52:44 UTC (rev 4718) +++ trunk/octave-forge/main/odepkg/inst/odepkg_structure_check.m 2008-03-11 20:26:46 UTC (rev 4719) @@ -186,8 +186,8 @@ case 'JPattern' if (isempty (vret.(vfld{vcntarg})) || ... - isvector (vret.(vfld{vcntarg}) || ... - ismatrix (vret.(vfld{vcntarg})))) + isvector (vret.(vfld{vcntarg})) || ... + ismatrix (vret.(vfld{vcntarg}))) else error ('OdePkg:InvalidParameter', ... 'Unknown parameter name "%s" or not valid parameter value', ... @@ -225,8 +225,8 @@ case 'MvPattern' if (isempty (vret.(vfld{vcntarg})) || ... - isvector (vret.(vfld{vcntarg}) || ... - ismatrix (vret.(vfld{vcntarg})))) + isvector (vret.(vfld{vcntarg})) || ... + ismatrix (vret.(vfld{vcntarg}))) else error ('OdePkg:InvalidParameter', ... 'Unknown parameter name "%s" or not valid parameter value', ... @@ -339,7 +339,7 @@ %!test A = odeset ('JPattern', []); %!test A = odeset ('JPattern', [1, 2, 4]); %!test A = odeset ('JPattern', [1, 2; 3, 4]); -%!error A = odeset ('JPattern', 12); +%!test A = odeset ('JPattern', 1); %!test A = odeset ('Vectorized', 'on'); %!test A = odeset ('Vectorized', 'off'); %!error A = odeset ('Vectorized', []); @@ -357,7 +357,7 @@ %!test A = odeset ('MvPattern', []); %!test A = odeset ('MvPattern', [1, 2, 3 ]); %!test A = odeset ('MvPattern', [1, 2; 3, 4]); -%!error A = odeset ('MvPattern', 12); +%!test A = odeset ('MvPattern', 1); %!test A = odeset ('MassSingular', 'yes'); %!test A = odeset ('MassSingular', 'no'); %!test A = odeset ('MassSingular', 'maybe'); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <tr...@us...> - 2008-03-12 21:25:28
|
Revision: 4724 http://octave.svn.sourceforge.net/octave/?rev=4724&view=rev Author: treichl Date: 2008-03-12 13:22:21 -0700 (Wed, 12 Mar 2008) Log Message: ----------- Fixed one test. Modified Paths: -------------- trunk/octave-forge/main/odepkg/inst/ode23.m trunk/octave-forge/main/odepkg/inst/ode45.m trunk/octave-forge/main/odepkg/inst/ode54.m trunk/octave-forge/main/odepkg/inst/ode78.m Modified: trunk/octave-forge/main/odepkg/inst/ode23.m =================================================================== --- trunk/octave-forge/main/odepkg/inst/ode23.m 2008-03-12 20:06:49 UTC (rev 4723) +++ trunk/octave-forge/main/odepkg/inst/ode23.m 2008-03-12 20:22:21 UTC (rev 4724) @@ -545,7 +545,7 @@ %!error %# input argument number two %! B = ode23 (@fpol, 1, [3 15 1]); %!error %# input argument number three -%! B = ode2r (@flor, [0 25], 1); +%! B = ode23 (@flor, [0 25], 1); %!test %# one output argument %! vsol = ode23 (@fpol, [0 2], [2 0]); %! assert ([vsol.x(end), vsol.y(end,:)], [2, fref], 1e-3); Modified: trunk/octave-forge/main/odepkg/inst/ode45.m =================================================================== --- trunk/octave-forge/main/odepkg/inst/ode45.m 2008-03-12 20:06:49 UTC (rev 4723) +++ trunk/octave-forge/main/odepkg/inst/ode45.m 2008-03-12 20:22:21 UTC (rev 4724) @@ -549,7 +549,7 @@ %!error %# input argument number two %! B = ode45 (@fpol, 1, [3 15 1]); %!error %# input argument number three -%! B = ode2r (@flor, [0 25], 1); +%! B = ode45 (@flor, [0 25], 1); %!test %# one output argument %! vsol = ode45 (@fpol, [0 2], [2 0]); %! assert ([vsol.x(end), vsol.y(end,:)], [2, fref], 1e-3); Modified: trunk/octave-forge/main/odepkg/inst/ode54.m =================================================================== --- trunk/octave-forge/main/odepkg/inst/ode54.m 2008-03-12 20:06:49 UTC (rev 4723) +++ trunk/octave-forge/main/odepkg/inst/ode54.m 2008-03-12 20:22:21 UTC (rev 4724) @@ -551,7 +551,7 @@ %!error %# input argument number two %! B = ode54 (@fpol, 1, [3 15 1]); %!error %# input argument number three -%! B = ode2r (@flor, [0 25], 1); +%! B = ode54 (@flor, [0 25], 1); %!test %# one output argument %! vsol = ode54 (@fpol, [0 2], [2 0]); %! assert ([vsol.x(end), vsol.y(end,:)], [2, fref], 1e-3); Modified: trunk/octave-forge/main/odepkg/inst/ode78.m =================================================================== --- trunk/octave-forge/main/odepkg/inst/ode78.m 2008-03-12 20:06:49 UTC (rev 4723) +++ trunk/octave-forge/main/odepkg/inst/ode78.m 2008-03-12 20:22:21 UTC (rev 4724) @@ -571,7 +571,7 @@ %!error %# input argument number two %! B = ode78 (@fpol, 1, [3 15 1]); %!error %# input argument number three -%! B = ode2r (@flor, [0 25], 1); +%! B = ode78 (@flor, [0 25], 1); %!test %# one output argument %! vsol = ode78 (@fpol, [0 2], [2 0]); %! assert ([vsol.x(end), vsol.y(end,:)], [2, fref], 1e-3); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <tr...@us...> - 2008-03-12 21:37:42
|
Revision: 4726 http://octave.svn.sourceforge.net/octave/?rev=4726&view=rev Author: treichl Date: 2008-03-12 14:37:16 -0700 (Wed, 12 Mar 2008) Log Message: ----------- Added test functions for DDE solvers. Modified Paths: -------------- trunk/octave-forge/main/odepkg/inst/ode23d.m trunk/octave-forge/main/odepkg/inst/ode45d.m trunk/octave-forge/main/odepkg/inst/ode54d.m trunk/octave-forge/main/odepkg/inst/ode78d.m Modified: trunk/octave-forge/main/odepkg/inst/ode23d.m =================================================================== --- trunk/octave-forge/main/odepkg/inst/ode23d.m 2008-03-12 21:36:40 UTC (rev 4725) +++ trunk/octave-forge/main/odepkg/inst/ode23d.m 2008-03-12 21:37:16 UTC (rev 4726) @@ -556,6 +556,159 @@ %# else nothing will be returned, varargout{1} undefined end +%! # We are using a "pseudo-DDE" implementation for all tests that +%! # are done for this function. We also define an Events and a +%! # pseudo-Mass implementation. For further tests we also define a +%! # reference solution (computed at high accuracy) and an OutputFcn. +%!function [vyd] = fexp (vt, vy, vz, varargin) +%! vyd(1,1) = exp (- vt) - vz(1); %# The DDEs that are +%! vyd(2,1) = vy(1) - vz(2); %# used for all examples +%!function [vval, vtrm, vdir] = feve (vt, vy, vz, varargin) +%! vval = fexp (vt, vy, vz); %# We use the derivatives +%! vtrm = zeros (2,1); %# don't stop solving here +%! vdir = ones (2,1); %# in positive direction +%!function [vval, vtrm, vdir] = fevn (vt, vy, vz, varargin) +%! vval = fexp (vt, vy, vz); %# We use the derivatives +%! vtrm = ones (2,1); %# stop solving here +%! vdir = ones (2,1); %# in positive direction +%!function [vmas] = fmas (vt, vy, vz, varargin) +%! vmas = [1, 0; 0, 1]; %# Dummy mass matrix for tests +%!function [vmas] = fmsa (vt, vy, vz, varargin) +%! vmas = sparse ([1, 0; 0, 1]); %# A dummy sparse matrix +%!function [vref] = fref () %# The reference solution +%! vref = [0.12194462133618, 0.01652432423938]; +%!function [vout] = fout (vt, vy, vflag, varargin) +%! if (regexp (char (vflag), 'init') == 1) +%! if (any (size (vt) ~= [2, 1])) error ('"fout" step "init"'); end +%! elseif (isempty (vflag)) +%! if (any (size (vt) ~= [1, 1])) error ('"fout" step "calc"'); end +%! vout = false; +%! elseif (regexp (char (vflag), 'done') == 1) +%! if (any (size (vt) ~= [1, 1])) error ('"fout" step "done"'); end +%! else error ('"fout" invalid vflag'); +%! end +%! +%! %# Turn off output of warning messages for all tests, turn them on +%! %# again if the last test is called +%!error %# input argument number one +%! warning ('off', 'OdePkg:InvalidOption'); +%! B = ode23d (1, [0 5], [1; 0], 1, [1; 0]); +%!error %# input argument number two +%! B = ode23d (@fexp, 1, [1; 0], 1, [1; 0]); +%!error %# input argument number three +%! B = ode23d (@fexp, [0 5], 1, 1, [1; 0]); +%!error %# input argument number four +%! B = ode23d (@fexp, [0 5], [1; 0], [1; 1], [1; 0]); +%!error %# input argument number five +%! B = ode23d (@fexp, [0 5], [1; 0], 1, 1); +%!test %# one output argument +%! vsol = ode23d (@fexp, [0 5], [1; 0], 1, [1; 0]); +%! assert ([vsol.x(end), vsol.y(end,:)], [5, fref], 1e-1); +%! assert (isfield (vsol, 'solver')); +%! assert (vsol.solver, 'ode23d'); +%!test %# two output arguments +%! [vt, vy] = ode23d (@fexp, [0 5], [1; 0], 1, [1; 0]); +%! assert ([vt(end), vy(end,:)], [5, fref], 1e-1); +%!test %# five output arguments and no Events +%! [vt, vy, vxe, vye, vie] = ode23d (@fexp, [0 5], [1; 0], 1, [1; 0]); +%! assert ([vt(end), vy(end,:)], [5, fref], 1e-1); +%! assert ([vie, vxe, vye], []); +%!test %# anonymous function instead of real function +%! faym = @(vt, vy, vz) [exp(-vt) - vz(1); vy(1) - vz(2)]; +%! vsol = ode23d (faym, [0 5], [1; 0], 1, [1; 0]); +%! assert ([vsol.x(end), vsol.y(end,:)], [5, fref], 1e-1); +%!test %# extra input arguments passed trhough +%! vsol = ode23d (@fexp, [0 5], [1; 0], 1, [1; 0], 'KL'); +%! assert ([vsol.x(end), vsol.y(end,:)], [5, fref], 1e-1); +%!test %# empty OdePkg structure *but* extra input arguments +%! vopt = odeset; +%! vsol = ode23d (@fexp, [0 5], [1; 0], 1, [1; 0], vopt, 12, 13, 'KL'); +%! assert ([vsol.x(end), vsol.y(end,:)], [5, fref], 1e-1); +%!error %# strange OdePkg structure +%! vopt = struct ('foo', 1); +%! vsol = ode23d (@fexp, [0 5], [1; 0], 1, [1; 0], vopt); +%!test %# AbsTol option +%! vopt = odeset ('AbsTol', 1e-5); +%! vsol = ode23d (@fexp, [0 5], [1; 0], 1, [1; 0], vopt); +%! assert ([vsol.x(end), vsol.y(end,:)], [5, fref], 1e-1); +%!test %# AbsTol and RelTol option +%! vopt = odeset ('AbsTol', 1e-7, 'RelTol', 1e-7); +%! vsol = ode23d (@fexp, [0 5], [1; 0], 1, [1; 0], vopt); +%! assert ([vsol.x(end), vsol.y(end,:)], [5, fref], 1e-1); +%!test %# RelTol and NormControl option +%! vopt = odeset ('AbsTol', 1e-7, 'NormControl', 'on'); +%! vsol = ode23d (@fexp, [0 5], [1; 0], 1, [1; 0], vopt); +%! assert ([vsol.x(end), vsol.y(end,:)], [5, fref], .5e-1); +%!test %# NonNegative for second component +%! vopt = odeset ('NonNegative', 1); +%! vsol = ode23d (@fexp, [0 2.5], [1; 0], 1, [1; 0], vopt); +%! assert ([vsol.x(end), vsol.y(end,:)], [2.5, 0.001, 0.237], 1e-1); +%!test %# Details of OutputSel and Refine can't be tested +%! vopt = odeset ('OutputFcn', @fout, 'OutputSel', 1, 'Refine', 5); +%! vsol = ode23d (@fexp, [0 2.5], [1; 0], 1, [1; 0], vopt); +%!test %# Stats must add further elements in vsol +%! vopt = odeset ('Stats', 'on'); +%! vsol = ode23d (@fexp, [0 2.5], [1; 0], 1, [1; 0], vopt); +%! assert (isfield (vsol, 'stats')); +%! assert (isfield (vsol.stats, 'nsteps')); +%!test %# InitialStep option +%! vopt = odeset ('InitialStep', 1e-8); +%! vsol = ode23d (@fexp, [0 5], [1; 0], 1, [1; 0], vopt); +%! assert ([vsol.x(end), vsol.y(end,:)], [5, fref], 1e-1); +%!test %# MaxStep option +%! vopt = odeset ('MaxStep', 1e-2); +%! vsol = ode23d (@fexp, [0 5], [1; 0], 1, [1; 0], vopt); +%! assert ([vsol.x(end), vsol.y(end,:)], [5, fref], 1e-1); +%!test %# Events option add further elements in vsol +%! vopt = odeset ('Events', @feve); +%! vsol = ode23d (@fexp, [0 5], [1; 0], 1, [1; 0], vopt); +%! assert (isfield (vsol, 'ie')); +%! assert (vsol.ie, [1; 1]); +%! assert (isfield (vsol, 'xe')); +%! assert (isfield (vsol, 'ye')); +%!test %# Events option, now stop integration +%! warning ('off', 'OdePkg:HideWarning'); +%! vopt = odeset ('Events', @fevn, 'NormControl', 'on'); +%! vsol = ode23d (@fexp, [0 5], [1; 0], 1, [1; 0], vopt); +%! assert ([vsol.ie, vsol.xe, vsol.ye], ... +%! [1.0000, 2.9219, -0.2127, -0.2671], 1e-1); +%!test %# Events option, five output arguments +%! vopt = odeset ('Events', @fevn, 'NormControl', 'on'); +%! [vt, vy, vxe, vye, vie] = ode23d (@fexp, [0 5], [1; 0], 1, [1; 0], vopt); +%! assert ([vie, vxe, vye], ... +%! [1.0000, 2.9219, -0.2127, -0.2671], 1e-1); +%! +%! %# test for Jacobian option is missing +%! %# test for Jacobian (being a sparse matrix) is missing +%! %# test for JPattern option is missing +%! %# test for Vectorized option is missing +%! +%!test %# Mass option as function +%! vopt = odeset ('Mass', eye (2,2)); +%! vsol = ode23d (@fexp, [0 5], [1; 0], 1, [1; 0], vopt); +%! assert ([vsol.x(end), vsol.y(end,:)], [5, fref], 1e-1); +%!test %# Mass option as matrix +%! vopt = odeset ('Mass', eye (2,2)); +%! vsol = ode23d (@fexp, [0 5], [1; 0], 1, [1; 0], vopt); +%! assert ([vsol.x(end), vsol.y(end,:)], [5, fref], 1e-1); +%!test %# Mass option as sparse matrix +%! vopt = odeset ('Mass', sparse (eye (2,2))); +%! vsol = ode23d (@fexp, [0 5], [1; 0], 1, [1; 0], vopt); +%! assert ([vsol.x(end), vsol.y(end,:)], [5, fref], 1e-1); +%!test %# Mass option as function and sparse matrix +%! vopt = odeset ('Mass', @fmsa); +%! vsol = ode23d (@fexp, [0 5], [1; 0], 1, [1; 0], vopt); +%! assert ([vsol.x(end), vsol.y(end,:)], [5, fref], 1e-1); +%!test %# Mass option as function and MStateDependence +%! vopt = odeset ('Mass', @fmas, 'MStateDependence', 'strong'); +%! vsol = ode23d (@fexp, [0 5], [1; 0], 1, [1; 0], vopt); +%! assert ([vsol.x(end), vsol.y(end,:)], [5, fref], 1e-1); +%! +%! %# test for MvPattern option is missing +%! %# test for InitialSlope option is missing +%! %# test for MaxOrder option is missing +%! %# test for BDF option is missing + %# Local Variables: *** %# mode: octave *** %# End: *** Modified: trunk/octave-forge/main/odepkg/inst/ode45d.m =================================================================== --- trunk/octave-forge/main/odepkg/inst/ode45d.m 2008-03-12 21:36:40 UTC (rev 4725) +++ trunk/octave-forge/main/odepkg/inst/ode45d.m 2008-03-12 21:37:16 UTC (rev 4726) @@ -560,6 +560,159 @@ %# else nothing will be returned, varargout{1} undefined end +%! # We are using a "pseudo-DDE" implementation for all tests that +%! # are done for this function. We also define an Events and a +%! # pseudo-Mass implementation. For further tests we also define a +%! # reference solution (computed at high accuracy) and an OutputFcn. +%!function [vyd] = fexp (vt, vy, vz, varargin) +%! vyd(1,1) = exp (- vt) - vz(1); %# The DDEs that are +%! vyd(2,1) = vy(1) - vz(2); %# used for all examples +%!function [vval, vtrm, vdir] = feve (vt, vy, vz, varargin) +%! vval = fexp (vt, vy, vz); %# We use the derivatives +%! vtrm = zeros (2,1); %# don't stop solving here +%! vdir = ones (2,1); %# in positive direction +%!function [vval, vtrm, vdir] = fevn (vt, vy, vz, varargin) +%! vval = fexp (vt, vy, vz); %# We use the derivatives +%! vtrm = ones (2,1); %# stop solving here +%! vdir = ones (2,1); %# in positive direction +%!function [vmas] = fmas (vt, vy, vz, varargin) +%! vmas = [1, 0; 0, 1]; %# Dummy mass matrix for tests +%!function [vmas] = fmsa (vt, vy, vz, varargin) +%! vmas = sparse ([1, 0; 0, 1]); %# A dummy sparse matrix +%!function [vref] = fref () %# The reference solution +%! vref = [0.12194462133618, 0.01652432423938]; +%!function [vout] = fout (vt, vy, vflag, varargin) +%! if (regexp (char (vflag), 'init') == 1) +%! if (any (size (vt) ~= [2, 1])) error ('"fout" step "init"'); end +%! elseif (isempty (vflag)) +%! if (any (size (vt) ~= [1, 1])) error ('"fout" step "calc"'); end +%! vout = false; +%! elseif (regexp (char (vflag), 'done') == 1) +%! if (any (size (vt) ~= [1, 1])) error ('"fout" step "done"'); end +%! else error ('"fout" invalid vflag'); +%! end +%! +%! %# Turn off output of warning messages for all tests, turn them on +%! %# again if the last test is called +%!error %# input argument number one +%! warning ('off', 'OdePkg:InvalidOption'); +%! B = ode45d (1, [0 5], [1; 0], 1, [1; 0]); +%!error %# input argument number two +%! B = ode45d (@fexp, 1, [1; 0], 1, [1; 0]); +%!error %# input argument number three +%! B = ode45d (@fexp, [0 5], 1, 1, [1; 0]); +%!error %# input argument number four +%! B = ode45d (@fexp, [0 5], [1; 0], [1; 1], [1; 0]); +%!error %# input argument number five +%! B = ode45d (@fexp, [0 5], [1; 0], 1, 1); +%!test %# one output argument +%! vsol = ode45d (@fexp, [0 5], [1; 0], 1, [1; 0]); +%! assert ([vsol.x(end), vsol.y(end,:)], [5, fref], 0.5); +%! assert (isfield (vsol, 'solver')); +%! assert (vsol.solver, 'ode45d'); +%!test %# two output arguments +%! [vt, vy] = ode45d (@fexp, [0 5], [1; 0], 1, [1; 0]); +%! assert ([vt(end), vy(end,:)], [5, fref], 0.5); +%!test %# five output arguments and no Events +%! [vt, vy, vxe, vye, vie] = ode45d (@fexp, [0 5], [1; 0], 1, [1; 0]); +%! assert ([vt(end), vy(end,:)], [5, fref], 0.5); +%! assert ([vie, vxe, vye], []); +%!test %# anonymous function instead of real function +%! faym = @(vt, vy, vz) [exp(-vt) - vz(1); vy(1) - vz(2)]; +%! vsol = ode45d (faym, [0 5], [1; 0], 1, [1; 0]); +%! assert ([vsol.x(end), vsol.y(end,:)], [5, fref], 0.5); +%!test %# extra input arguments passed trhough +%! vsol = ode45d (@fexp, [0 5], [1; 0], 1, [1; 0], 'KL'); +%! assert ([vsol.x(end), vsol.y(end,:)], [5, fref], 0.5); +%!test %# empty OdePkg structure *but* extra input arguments +%! vopt = odeset; +%! vsol = ode45d (@fexp, [0 5], [1; 0], 1, [1; 0], vopt, 12, 13, 'KL'); +%! assert ([vsol.x(end), vsol.y(end,:)], [5, fref], 0.5); +%!error %# strange OdePkg structure +%! vopt = struct ('foo', 1); +%! vsol = ode45d (@fexp, [0 5], [1; 0], 1, [1; 0], vopt); +%!test %# AbsTol option +%! vopt = odeset ('AbsTol', 1e-5); +%! vsol = ode45d (@fexp, [0 5], [1; 0], 1, [1; 0], vopt); +%! assert ([vsol.x(end), vsol.y(end,:)], [5, fref], 0.5); +%!test %# AbsTol and RelTol option +%! vopt = odeset ('AbsTol', 1e-7, 'RelTol', 1e-7); +%! vsol = ode45d (@fexp, [0 5], [1; 0], 1, [1; 0], vopt); +%! assert ([vsol.x(end), vsol.y(end,:)], [5, fref], 0.5); +%!test %# RelTol and NormControl option +%! vopt = odeset ('AbsTol', 1e-7, 'NormControl', 'on'); +%! vsol = ode45d (@fexp, [0 5], [1; 0], 1, [1; 0], vopt); +%! assert ([vsol.x(end), vsol.y(end,:)], [5, fref], .5e-1); +%!test %# NonNegative for second component +%! vopt = odeset ('NonNegative', 1); +%! vsol = ode45d (@fexp, [0 2.5], [1; 0], 1, [1; 0], vopt); +%! assert ([vsol.x(end), vsol.y(end,:)], [2.5, 0.001, 0.237], 0.5); +%!test %# Details of OutputSel and Refine can't be tested +%! vopt = odeset ('OutputFcn', @fout, 'OutputSel', 1, 'Refine', 5); +%! vsol = ode45d (@fexp, [0 2.5], [1; 0], 1, [1; 0], vopt); +%!test %# Stats must add further elements in vsol +%! vopt = odeset ('Stats', 'on'); +%! vsol = ode45d (@fexp, [0 2.5], [1; 0], 1, [1; 0], vopt); +%! assert (isfield (vsol, 'stats')); +%! assert (isfield (vsol.stats, 'nsteps')); +%!test %# InitialStep option +%! vopt = odeset ('InitialStep', 1e-8); +%! vsol = ode45d (@fexp, [0 5], [1; 0], 1, [1; 0], vopt); +%! assert ([vsol.x(end), vsol.y(end,:)], [5, fref], 0.5); +%!test %# MaxStep option +%! vopt = odeset ('MaxStep', 1e-2); +%! vsol = ode45d (@fexp, [0 5], [1; 0], 1, [1; 0], vopt); +%! assert ([vsol.x(end), vsol.y(end,:)], [5, fref], 0.5); +%!test %# Events option add further elements in vsol +%! vopt = odeset ('Events', @feve); +%! vsol = ode45d (@fexp, [0 5], [1; 0], 1, [1; 0], vopt); +%! assert (isfield (vsol, 'ie')); +%! assert (vsol.ie, [1; 1]); +%! assert (isfield (vsol, 'xe')); +%! assert (isfield (vsol, 'ye')); +%!test %# Events option, now stop integration +%! warning ('off', 'OdePkg:HideWarning'); +%! vopt = odeset ('Events', @fevn, 'NormControl', 'on'); +%! vsol = ode45d (@fexp, [0 5], [1; 0], 1, [1; 0], vopt); +%! assert ([vsol.ie, vsol.xe, vsol.ye], ... +%! [1.0000, 2.9219, -0.2127, -0.2671], 0.5); +%!test %# Events option, five output arguments +%! vopt = odeset ('Events', @fevn, 'NormControl', 'on'); +%! [vt, vy, vxe, vye, vie] = ode45d (@fexp, [0 5], [1; 0], 1, [1; 0], vopt); +%! assert ([vie, vxe, vye], ... +%! [1.0000, 2.9219, -0.2127, -0.2671], 0.5); +%! +%! %# test for Jacobian option is missing +%! %# test for Jacobian (being a sparse matrix) is missing +%! %# test for JPattern option is missing +%! %# test for Vectorized option is missing +%! +%!test %# Mass option as function +%! vopt = odeset ('Mass', eye (2,2)); +%! vsol = ode45d (@fexp, [0 5], [1; 0], 1, [1; 0], vopt); +%! assert ([vsol.x(end), vsol.y(end,:)], [5, fref], 0.5); +%!test %# Mass option as matrix +%! vopt = odeset ('Mass', eye (2,2)); +%! vsol = ode45d (@fexp, [0 5], [1; 0], 1, [1; 0], vopt); +%! assert ([vsol.x(end), vsol.y(end,:)], [5, fref], 0.5); +%!test %# Mass option as sparse matrix +%! vopt = odeset ('Mass', sparse (eye (2,2))); +%! vsol = ode45d (@fexp, [0 5], [1; 0], 1, [1; 0], vopt); +%! assert ([vsol.x(end), vsol.y(end,:)], [5, fref], 0.5); +%!test %# Mass option as function and sparse matrix +%! vopt = odeset ('Mass', @fmsa); +%! vsol = ode45d (@fexp, [0 5], [1; 0], 1, [1; 0], vopt); +%! assert ([vsol.x(end), vsol.y(end,:)], [5, fref], 0.5); +%!test %# Mass option as function and MStateDependence +%! vopt = odeset ('Mass', @fmas, 'MStateDependence', 'strong'); +%! vsol = ode45d (@fexp, [0 5], [1; 0], 1, [1; 0], vopt); +%! assert ([vsol.x(end), vsol.y(end,:)], [5, fref], 0.5); +%! +%! %# test for MvPattern option is missing +%! %# test for InitialSlope option is missing +%! %# test for MaxOrder option is missing +%! %# test for BDF option is missing + %# Local Variables: *** %# mode: octave *** %# End: *** Modified: trunk/octave-forge/main/odepkg/inst/ode54d.m =================================================================== --- trunk/octave-forge/main/odepkg/inst/ode54d.m 2008-03-12 21:36:40 UTC (rev 4725) +++ trunk/octave-forge/main/odepkg/inst/ode54d.m 2008-03-12 21:37:16 UTC (rev 4726) @@ -561,6 +561,159 @@ %# else nothing will be returned, varargout{1} undefined end +%! # We are using a "pseudo-DDE" implementation for all tests that +%! # are done for this function. We also define an Events and a +%! # pseudo-Mass implementation. For further tests we also define a +%! # reference solution (computed at high accuracy) and an OutputFcn. +%!function [vyd] = fexp (vt, vy, vz, varargin) +%! vyd(1,1) = exp (- vt) - vz(1); %# The DDEs that are +%! vyd(2,1) = vy(1) - vz(2); %# used for all examples +%!function [vval, vtrm, vdir] = feve (vt, vy, vz, varargin) +%! vval = fexp (vt, vy, vz); %# We use the derivatives +%! vtrm = zeros (2,1); %# don't stop solving here +%! vdir = ones (2,1); %# in positive direction +%!function [vval, vtrm, vdir] = fevn (vt, vy, vz, varargin) +%! vval = fexp (vt, vy, vz); %# We use the derivatives +%! vtrm = ones (2,1); %# stop solving here +%! vdir = ones (2,1); %# in positive direction +%!function [vmas] = fmas (vt, vy, vz, varargin) +%! vmas = [1, 0; 0, 1]; %# Dummy mass matrix for tests +%!function [vmas] = fmsa (vt, vy, vz, varargin) +%! vmas = sparse ([1, 0; 0, 1]); %# A dummy sparse matrix +%!function [vref] = fref () %# The reference solution +%! vref = [0.12194462133618, 0.01652432423938]; +%!function [vout] = fout (vt, vy, vflag, varargin) +%! if (regexp (char (vflag), 'init') == 1) +%! if (any (size (vt) ~= [2, 1])) error ('"fout" step "init"'); end +%! elseif (isempty (vflag)) +%! if (any (size (vt) ~= [1, 1])) error ('"fout" step "calc"'); end +%! vout = false; +%! elseif (regexp (char (vflag), 'done') == 1) +%! if (any (size (vt) ~= [1, 1])) error ('"fout" step "done"'); end +%! else error ('"fout" invalid vflag'); +%! end +%! +%! %# Turn off output of warning messages for all tests, turn them on +%! %# again if the last test is called +%!error %# input argument number one +%! warning ('off', 'OdePkg:InvalidOption'); +%! B = ode54d (1, [0 5], [1; 0], 1, [1; 0]); +%!error %# input argument number two +%! B = ode54d (@fexp, 1, [1; 0], 1, [1; 0]); +%!error %# input argument number three +%! B = ode54d (@fexp, [0 5], 1, 1, [1; 0]); +%!error %# input argument number four +%! B = ode54d (@fexp, [0 5], [1; 0], [1; 1], [1; 0]); +%!error %# input argument number five +%! B = ode54d (@fexp, [0 5], [1; 0], 1, 1); +%!test %# one output argument +%! vsol = ode54d (@fexp, [0 5], [1; 0], 1, [1; 0]); +%! assert ([vsol.x(end), vsol.y(end,:)], [5, fref], 1e-1); +%! assert (isfield (vsol, 'solver')); +%! assert (vsol.solver, 'ode54d'); +%!test %# two output arguments +%! [vt, vy] = ode54d (@fexp, [0 5], [1; 0], 1, [1; 0]); +%! assert ([vt(end), vy(end,:)], [5, fref], 1e-1); +%!test %# five output arguments and no Events +%! [vt, vy, vxe, vye, vie] = ode54d (@fexp, [0 5], [1; 0], 1, [1; 0]); +%! assert ([vt(end), vy(end,:)], [5, fref], 1e-1); +%! assert ([vie, vxe, vye], []); +%!test %# anonymous function instead of real function +%! faym = @(vt, vy, vz) [exp(-vt) - vz(1); vy(1) - vz(2)]; +%! vsol = ode54d (faym, [0 5], [1; 0], 1, [1; 0]); +%! assert ([vsol.x(end), vsol.y(end,:)], [5, fref], 1e-1); +%!test %# extra input arguments passed trhough +%! vsol = ode54d (@fexp, [0 5], [1; 0], 1, [1; 0], 'KL'); +%! assert ([vsol.x(end), vsol.y(end,:)], [5, fref], 1e-1); +%!test %# empty OdePkg structure *but* extra input arguments +%! vopt = odeset; +%! vsol = ode54d (@fexp, [0 5], [1; 0], 1, [1; 0], vopt, 12, 13, 'KL'); +%! assert ([vsol.x(end), vsol.y(end,:)], [5, fref], 1e-1); +%!error %# strange OdePkg structure +%! vopt = struct ('foo', 1); +%! vsol = ode54d (@fexp, [0 5], [1; 0], 1, [1; 0], vopt); +%!test %# AbsTol option +%! vopt = odeset ('AbsTol', 1e-5); +%! vsol = ode54d (@fexp, [0 5], [1; 0], 1, [1; 0], vopt); +%! assert ([vsol.x(end), vsol.y(end,:)], [5, fref], 1e-1); +%!test %# AbsTol and RelTol option +%! vopt = odeset ('AbsTol', 1e-7, 'RelTol', 1e-7); +%! vsol = ode54d (@fexp, [0 5], [1; 0], 1, [1; 0], vopt); +%! assert ([vsol.x(end), vsol.y(end,:)], [5, fref], 1e-1); +%!test %# RelTol and NormControl option +%! vopt = odeset ('AbsTol', 1e-7, 'NormControl', 'on'); +%! vsol = ode54d (@fexp, [0 5], [1; 0], 1, [1; 0], vopt); +%! assert ([vsol.x(end), vsol.y(end,:)], [5, fref], .5e-1); +%!test %# NonNegative for second component +%! vopt = odeset ('NonNegative', 1); +%! vsol = ode54d (@fexp, [0 2.5], [1; 0], 1, [1; 0], vopt); +%! assert ([vsol.x(end), vsol.y(end,:)], [2.5, 0.001, 0.237], 1e-1); +%!test %# Details of OutputSel and Refine can't be tested +%! vopt = odeset ('OutputFcn', @fout, 'OutputSel', 1, 'Refine', 5); +%! vsol = ode54d (@fexp, [0 2.5], [1; 0], 1, [1; 0], vopt); +%!test %# Stats must add further elements in vsol +%! vopt = odeset ('Stats', 'on'); +%! vsol = ode54d (@fexp, [0 2.5], [1; 0], 1, [1; 0], vopt); +%! assert (isfield (vsol, 'stats')); +%! assert (isfield (vsol.stats, 'nsteps')); +%!test %# InitialStep option +%! vopt = odeset ('InitialStep', 1e-8); +%! vsol = ode54d (@fexp, [0 5], [1; 0], 1, [1; 0], vopt); +%! assert ([vsol.x(end), vsol.y(end,:)], [5, fref], 1e-1); +%!test %# MaxStep option +%! vopt = odeset ('MaxStep', 1e-2); +%! vsol = ode54d (@fexp, [0 5], [1; 0], 1, [1; 0], vopt); +%! assert ([vsol.x(end), vsol.y(end,:)], [5, fref], 1e-1); +%!test %# Events option add further elements in vsol +%! vopt = odeset ('Events', @feve); +%! vsol = ode54d (@fexp, [0 5], [1; 0], 1, [1; 0], vopt); +%! assert (isfield (vsol, 'ie')); +%! assert (vsol.ie, [1; 1]); +%! assert (isfield (vsol, 'xe')); +%! assert (isfield (vsol, 'ye')); +%!test %# Events option, now stop integration +%! warning ('off', 'OdePkg:HideWarning'); +%! vopt = odeset ('Events', @fevn, 'NormControl', 'on'); +%! vsol = ode54d (@fexp, [0 5], [1; 0], 1, [1; 0], vopt); +%! assert ([vsol.ie, vsol.xe, vsol.ye], ... +%! [1.0000, 2.9219, -0.2127, -0.2671], 1e-1); +%!test %# Events option, five output arguments +%! vopt = odeset ('Events', @fevn, 'NormControl', 'on'); +%! [vt, vy, vxe, vye, vie] = ode54d (@fexp, [0 5], [1; 0], 1, [1; 0], vopt); +%! assert ([vie, vxe, vye], ... +%! [1.0000, 2.9219, -0.2127, -0.2671], 1e-1); +%! +%! %# test for Jacobian option is missing +%! %# test for Jacobian (being a sparse matrix) is missing +%! %# test for JPattern option is missing +%! %# test for Vectorized option is missing +%! +%!test %# Mass option as function +%! vopt = odeset ('Mass', eye (2,2)); +%! vsol = ode54d (@fexp, [0 5], [1; 0], 1, [1; 0], vopt); +%! assert ([vsol.x(end), vsol.y(end,:)], [5, fref], 1e-1); +%!test %# Mass option as matrix +%! vopt = odeset ('Mass', eye (2,2)); +%! vsol = ode54d (@fexp, [0 5], [1; 0], 1, [1; 0], vopt); +%! assert ([vsol.x(end), vsol.y(end,:)], [5, fref], 1e-1); +%!test %# Mass option as sparse matrix +%! vopt = odeset ('Mass', sparse (eye (2,2))); +%! vsol = ode54d (@fexp, [0 5], [1; 0], 1, [1; 0], vopt); +%! assert ([vsol.x(end), vsol.y(end,:)], [5, fref], 1e-1); +%!test %# Mass option as function and sparse matrix +%! vopt = odeset ('Mass', @fmsa); +%! vsol = ode54d (@fexp, [0 5], [1; 0], 1, [1; 0], vopt); +%! assert ([vsol.x(end), vsol.y(end,:)], [5, fref], 1e-1); +%!test %# Mass option as function and MStateDependence +%! vopt = odeset ('Mass', @fmas, 'MStateDependence', 'strong'); +%! vsol = ode54d (@fexp, [0 5], [1; 0], 1, [1; 0], vopt); +%! assert ([vsol.x(end), vsol.y(end,:)], [5, fref], 1e-1); +%! +%! %# test for MvPattern option is missing +%! %# test for InitialSlope option is missing +%! %# test for MaxOrder option is missing +%! %# test for BDF option is missing + %# Local Variables: *** %# mode: octave *** %# End: *** Modified: trunk/octave-forge/main/odepkg/inst/ode78d.m =================================================================== --- trunk/octave-forge/main/odepkg/inst/ode78d.m 2008-03-12 21:36:40 UTC (rev 4725) +++ trunk/octave-forge/main/odepkg/inst/ode78d.m 2008-03-12 21:37:16 UTC (rev 4726) @@ -581,6 +581,159 @@ %# else nothing will be returned, varargout{1} undefined end +%! # We are using a "pseudo-DDE" implementation for all tests that +%! # are done for this function. We also define an Events and a +%! # pseudo-Mass implementation. For further tests we also define a +%! # reference solution (computed at high accuracy) and an OutputFcn. +%!function [vyd] = fexp (vt, vy, vz, varargin) +%! vyd(1,1) = exp (- vt) - vz(1); %# The DDEs that are +%! vyd(2,1) = vy(1) - vz(2); %# used for all examples +%!function [vval, vtrm, vdir] = feve (vt, vy, vz, varargin) +%! vval = fexp (vt, vy, vz); %# We use the derivatives +%! vtrm = zeros (2,1); %# don't stop solving here +%! vdir = ones (2,1); %# in positive direction +%!function [vval, vtrm, vdir] = fevn (vt, vy, vz, varargin) +%! vval = fexp (vt, vy, vz); %# We use the derivatives +%! vtrm = ones (2,1); %# stop solving here +%! vdir = ones (2,1); %# in positive direction +%!function [vmas] = fmas (vt, vy, vz, varargin) +%! vmas = [1, 0; 0, 1]; %# Dummy mass matrix for tests +%!function [vmas] = fmsa (vt, vy, vz, varargin) +%! vmas = sparse ([1, 0; 0, 1]); %# A dummy sparse matrix +%!function [vref] = fref () %# The reference solution +%! vref = [0.12194462133618, 0.01652432423938]; +%!function [vout] = fout (vt, vy, vflag, varargin) +%! if (regexp (char (vflag), 'init') == 1) +%! if (any (size (vt) ~= [2, 1])) error ('"fout" step "init"'); end +%! elseif (isempty (vflag)) +%! if (any (size (vt) ~= [1, 1])) error ('"fout" step "calc"'); end +%! vout = false; +%! elseif (regexp (char (vflag), 'done') == 1) +%! if (any (size (vt) ~= [1, 1])) error ('"fout" step "done"'); end +%! else error ('"fout" invalid vflag'); +%! end +%! +%! %# Turn off output of warning messages for all tests, turn them on +%! %# again if the last test is called +%!error %# input argument number one +%! warning ('off', 'OdePkg:InvalidOption'); +%! B = ode78d (1, [0 5], [1; 0], 1, [1; 0]); +%!error %# input argument number two +%! B = ode78d (@fexp, 1, [1; 0], 1, [1; 0]); +%!error %# input argument number three +%! B = ode78d (@fexp, [0 5], 1, 1, [1; 0]); +%!error %# input argument number four +%! B = ode78d (@fexp, [0 5], [1; 0], [1; 1], [1; 0]); +%!error %# input argument number five +%! B = ode78d (@fexp, [0 5], [1; 0], 1, 1); +%!test %# one output argument +%! vsol = ode78d (@fexp, [0 5], [1; 0], 1, [1; 0]); +%! assert ([vsol.x(end), vsol.y(end,:)], [5, fref], 0.2); +%! assert (isfield (vsol, 'solver')); +%! assert (vsol.solver, 'ode78d'); +%!test %# two output arguments +%! [vt, vy] = ode78d (@fexp, [0 5], [1; 0], 1, [1; 0]); +%! assert ([vt(end), vy(end,:)], [5, fref], 0.2); +%!test %# five output arguments and no Events +%! [vt, vy, vxe, vye, vie] = ode78d (@fexp, [0 5], [1; 0], 1, [1; 0]); +%! assert ([vt(end), vy(end,:)], [5, fref], 0.2); +%! assert ([vie, vxe, vye], []); +%!test %# anonymous function instead of real function +%! faym = @(vt, vy, vz) [exp(-vt) - vz(1); vy(1) - vz(2)]; +%! vsol = ode78d (faym, [0 5], [1; 0], 1, [1; 0]); +%! assert ([vsol.x(end), vsol.y(end,:)], [5, fref], 0.2); +%!test %# extra input arguments passed trhough +%! vsol = ode78d (@fexp, [0 5], [1; 0], 1, [1; 0], 'KL'); +%! assert ([vsol.x(end), vsol.y(end,:)], [5, fref], 0.2); +%!test %# empty OdePkg structure *but* extra input arguments +%! vopt = odeset; +%! vsol = ode78d (@fexp, [0 5], [1; 0], 1, [1; 0], vopt, 12, 13, 'KL'); +%! assert ([vsol.x(end), vsol.y(end,:)], [5, fref], 0.2); +%!error %# strange OdePkg structure +%! vopt = struct ('foo', 1); +%! vsol = ode78d (@fexp, [0 5], [1; 0], 1, [1; 0], vopt); +%!test %# AbsTol option +%! vopt = odeset ('AbsTol', 1e-5); +%! vsol = ode78d (@fexp, [0 5], [1; 0], 1, [1; 0], vopt); +%! assert ([vsol.x(end), vsol.y(end,:)], [5, fref], 0.2); +%!test %# AbsTol and RelTol option +%! vopt = odeset ('AbsTol', 1e-7, 'RelTol', 1e-7); +%! vsol = ode78d (@fexp, [0 5], [1; 0], 1, [1; 0], vopt); +%! assert ([vsol.x(end), vsol.y(end,:)], [5, fref], 0.2); +%!test %# RelTol and NormControl option +%! vopt = odeset ('AbsTol', 1e-7, 'NormControl', 'on'); +%! vsol = ode78d (@fexp, [0 5], [1; 0], 1, [1; 0], vopt); +%! assert ([vsol.x(end), vsol.y(end,:)], [5, fref], 0.2); +%!test %# NonNegative for second component +%! vopt = odeset ('NonNegative', 1); +%! vsol = ode78d (@fexp, [0 2.5], [1; 0], 1, [1; 0], vopt); +%! assert ([vsol.x(end), vsol.y(end,:)], [2.5, 0.001, 0.237], 0.2); +%!test %# Details of OutputSel and Refine can't be tested +%! vopt = odeset ('OutputFcn', @fout, 'OutputSel', 1, 'Refine', 5); +%! vsol = ode78d (@fexp, [0 2.5], [1; 0], 1, [1; 0], vopt); +%!test %# Stats must add further elements in vsol +%! vopt = odeset ('Stats', 'on'); +%! vsol = ode78d (@fexp, [0 2.5], [1; 0], 1, [1; 0], vopt); +%! assert (isfield (vsol, 'stats')); +%! assert (isfield (vsol.stats, 'nsteps')); +%!test %# InitialStep option +%! vopt = odeset ('InitialStep', 1e-8); +%! vsol = ode78d (@fexp, [0 5], [1; 0], 1, [1; 0], vopt); +%! assert ([vsol.x(end), vsol.y(end,:)], [5, fref], 0.2); +%!test %# MaxStep option +%! vopt = odeset ('MaxStep', 1e-2); +%! vsol = ode78d (@fexp, [0 5], [1; 0], 1, [1; 0], vopt); +%! assert ([vsol.x(end), vsol.y(end,:)], [5, fref], 0.2); +%!test %# Events option add further elements in vsol +%! vopt = odeset ('Events', @feve); +%! vsol = ode78d (@fexp, [0 5], [1; 0], 1, [1; 0], vopt); +%! assert (isfield (vsol, 'ie')); +%! assert (vsol.ie, [1; 1]); +%! assert (isfield (vsol, 'xe')); +%! assert (isfield (vsol, 'ye')); +%!test %# Events option, now stop integration +%! warning ('off', 'OdePkg:HideWarning'); +%! vopt = odeset ('Events', @fevn, 'NormControl', 'on'); +%! vsol = ode78d (@fexp, [0 5], [1; 0], 1, [1; 0], vopt); +%! assert ([vsol.ie, vsol.xe, vsol.ye], ... +%! [1.0000, 2.9219, -0.2127, -0.2671], 0.2); +%!test %# Events option, five output arguments +%! vopt = odeset ('Events', @fevn, 'NormControl', 'on'); +%! [vt, vy, vxe, vye, vie] = ode78d (@fexp, [0 5], [1; 0], 1, [1; 0], vopt); +%! assert ([vie, vxe, vye], ... +%! [1.0000, 2.9219, -0.2127, -0.2671], 0.2); +%! +%! %# test for Jacobian option is missing +%! %# test for Jacobian (being a sparse matrix) is missing +%! %# test for JPattern option is missing +%! %# test for Vectorized option is missing +%! +%!test %# Mass option as function +%! vopt = odeset ('Mass', eye (2,2)); +%! vsol = ode78d (@fexp, [0 5], [1; 0], 1, [1; 0], vopt); +%! assert ([vsol.x(end), vsol.y(end,:)], [5, fref], 0.2); +%!test %# Mass option as matrix +%! vopt = odeset ('Mass', eye (2,2)); +%! vsol = ode78d (@fexp, [0 5], [1; 0], 1, [1; 0], vopt); +%! assert ([vsol.x(end), vsol.y(end,:)], [5, fref], 0.2); +%!test %# Mass option as sparse matrix +%! vopt = odeset ('Mass', sparse (eye (2,2))); +%! vsol = ode78d (@fexp, [0 5], [1; 0], 1, [1; 0], vopt); +%! assert ([vsol.x(end), vsol.y(end,:)], [5, fref], 0.2); +%!test %# Mass option as function and sparse matrix +%! vopt = odeset ('Mass', @fmsa); +%! vsol = ode78d (@fexp, [0 5], [1; 0], 1, [1; 0], vopt); +%! assert ([vsol.x(end), vsol.y(end,:)], [5, fref], 0.2); +%!test %# Mass option as function and MStateDependence +%! vopt = odeset ('Mass', @fmas, 'MStateDependence', 'strong'); +%! vsol = ode78d (@fexp, [0 5], [1; 0], 1, [1; 0], vopt); +%! assert ([vsol.x(end), vsol.y(end,:)], [5, fref], 0.2); +%! +%! %# test for MvPattern option is missing +%! %# test for InitialSlope option is missing +%! %# test for MaxOrder option is missing +%! %# test for BDF option is missing + %# Local Variables: *** %# mode: octave *** %# End: *** This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <tr...@us...> - 2008-03-13 20:55:18
|
Revision: 4736 http://octave.svn.sourceforge.net/octave/?rev=4736&view=rev Author: treichl Date: 2008-03-13 13:55:23 -0700 (Thu, 13 Mar 2008) Log Message: ----------- Fixed tests and minor changes. Modified Paths: -------------- trunk/octave-forge/main/odepkg/inst/ode23.m trunk/octave-forge/main/odepkg/inst/ode45.m trunk/octave-forge/main/odepkg/inst/ode54.m trunk/octave-forge/main/odepkg/inst/ode78.m Modified: trunk/octave-forge/main/odepkg/inst/ode23.m =================================================================== --- trunk/octave-forge/main/odepkg/inst/ode23.m 2008-03-13 15:47:14 UTC (rev 4735) +++ trunk/octave-forge/main/odepkg/inst/ode23.m 2008-03-13 20:55:23 UTC (rev 4736) @@ -511,7 +511,7 @@ %!function [vjac] = fjac (vt, vy, varargin) %# its Jacobian %! vjac = [0, 1; -1 - 2 * vy(1) * vy(2), 1 - vy(1)^2]; %!function [vjac] = fjcc (vt, vy, varargin) %# sparse type -%! vjac = [0, 1; -1 - 2 * vy(1) * vy(2), 1 - vy(1)^2]; +%! vjac = sparse ([0, 1; -1 - 2 * vy(1) * vy(2), 1 - vy(1)^2]); %!function [vval, vtrm, vdir] = feve (vt, vy, varargin) %! vval = fpol (vt, vy, varargin); %# We use the derivatives %! vtrm = zeros (2,1); %# that's why component 2 @@ -521,7 +521,7 @@ %! vtrm = ones (2,1); %# that's why component 2 %! vdir = ones (2,1); %# seems to not be exact %!function [vmas] = fmas (vt, vy) -%! vmas = [1, 0; 0, 1]; %# Dummy mass matrix for tests +%! vmas = [1, 0; 0, 1]; %# Dummy mass matrix for tests %!function [vmas] = fmsa (vt, vy) %! vmas = sparse ([1, 0; 0, 1]); %# A sparse dummy matrix %!function [vref] = fref () %# The computed reference solut @@ -560,7 +560,7 @@ %! assert ([vie, vxe, vye], []); %!test %# anonymous function instead of real function %! fvdb = @(vt,vy) [vy(2); (1 - vy(1)^2) * vy(2) - vy(1)]; -%! vsol = ode23 (@fpol, [0 2], [2 0]); +%! vsol = ode23 (fvdb, [0 2], [2 0]); %! assert ([vsol.x(end), vsol.y(end,:)], [2, fref], 1e-3); %!test %# extra input arguments passed trhough %! vsol = ode23 (@fpol, [0 2], [2 0], 12, 13, 'KL'); @@ -654,13 +654,14 @@ %!test %# Mass option as function and MStateDependence %! vopt = odeset ('Mass', @fmas, 'MStateDependence', 'strong'); %! vsol = ode23 (@fpol, [0 2], [2 0], vopt); -%! warning ('on', 'OdePkg:InvalidOption'); %! assert ([vsol.x(end), vsol.y(end,:)], [2, fref], 1e-3); %! %! %# test for MvPattern option is missing %! %# test for InitialSlope option is missing %! %# test for MaxOrder option is missing %! %# test for BDF option is missing +%! +%! warning ('on', 'OdePkg:InvalidOption'); %# Local Variables: *** %# mode: octave *** Modified: trunk/octave-forge/main/odepkg/inst/ode45.m =================================================================== --- trunk/octave-forge/main/odepkg/inst/ode45.m 2008-03-13 15:47:14 UTC (rev 4735) +++ trunk/octave-forge/main/odepkg/inst/ode45.m 2008-03-13 20:55:23 UTC (rev 4736) @@ -515,7 +515,7 @@ %!function [vjac] = fjac (vt, vy, varargin) %# its Jacobian %! vjac = [0, 1; -1 - 2 * vy(1) * vy(2), 1 - vy(1)^2]; %!function [vjac] = fjcc (vt, vy, varargin) %# sparse type -%! vjac = [0, 1; -1 - 2 * vy(1) * vy(2), 1 - vy(1)^2]; +%! vjac = sparse ([0, 1; -1 - 2 * vy(1) * vy(2), 1 - vy(1)^2]); %!function [vval, vtrm, vdir] = feve (vt, vy, varargin) %! vval = fpol (vt, vy, varargin); %# We use the derivatives %! vtrm = zeros (2,1); %# that's why component 2 @@ -564,7 +564,7 @@ %! assert ([vie, vxe, vye], []); %!test %# anonymous function instead of real function %! fvdb = @(vt,vy) [vy(2); (1 - vy(1)^2) * vy(2) - vy(1)]; -%! vsol = ode45 (@fpol, [0 2], [2 0]); +%! vsol = ode45 (fvdb, [0 2], [2 0]); %! assert ([vsol.x(end), vsol.y(end,:)], [2, fref], 1e-3); %!test %# extra input arguments passed trhough %! vsol = ode45 (@fpol, [0 2], [2 0], 12, 13, 'KL'); @@ -658,13 +658,14 @@ %!test %# Mass option as function and MStateDependence %! vopt = odeset ('Mass', @fmas, 'MStateDependence', 'strong'); %! vsol = ode45 (@fpol, [0 2], [2 0], vopt); -%! warning ('on', 'OdePkg:InvalidOption'); %! assert ([vsol.x(end), vsol.y(end,:)], [2, fref], 1e-3); %! %! %# test for MvPattern option is missing %! %# test for InitialSlope option is missing %! %# test for MaxOrder option is missing %! %# test for BDF option is missing +%! +%! warning ('on', 'OdePkg:InvalidOption'); %# Local Variables: *** %# mode: octave *** Modified: trunk/octave-forge/main/odepkg/inst/ode54.m =================================================================== --- trunk/octave-forge/main/odepkg/inst/ode54.m 2008-03-13 15:47:14 UTC (rev 4735) +++ trunk/octave-forge/main/odepkg/inst/ode54.m 2008-03-13 20:55:23 UTC (rev 4736) @@ -517,7 +517,7 @@ %!function [vjac] = fjac (vt, vy, varargin) %# its Jacobian %! vjac = [0, 1; -1 - 2 * vy(1) * vy(2), 1 - vy(1)^2]; %!function [vjac] = fjcc (vt, vy, varargin) %# sparse type -%! vjac = [0, 1; -1 - 2 * vy(1) * vy(2), 1 - vy(1)^2]; +%! vjac = sparse ([0, 1; -1 - 2 * vy(1) * vy(2), 1 - vy(1)^2]); %!function [vval, vtrm, vdir] = feve (vt, vy, varargin) %! vval = fpol (vt, vy, varargin); %# We use the derivatives %! vtrm = zeros (2,1); %# that's why component 2 @@ -566,7 +566,7 @@ %! assert ([vie, vxe, vye], []); %!test %# anonymous function instead of real function %! fvdb = @(vt,vy) [vy(2); (1 - vy(1)^2) * vy(2) - vy(1)]; -%! vsol = ode54 (@fpol, [0 2], [2 0]); +%! vsol = ode54 (fvdb, [0 2], [2 0]); %! assert ([vsol.x(end), vsol.y(end,:)], [2, fref], 1e-3); %!test %# extra input arguments passed trhough %! vsol = ode54 (@fpol, [0 2], [2 0], 12, 13, 'KL'); @@ -660,13 +660,14 @@ %!test %# Mass option as function and MStateDependence %! vopt = odeset ('Mass', @fmas, 'MStateDependence', 'strong'); %! vsol = ode54 (@fpol, [0 2], [2 0], vopt); -%! warning ('on', 'OdePkg:InvalidOption'); %! assert ([vsol.x(end), vsol.y(end,:)], [2, fref], 1e-3); %! %! %# test for MvPattern option is missing %! %# test for InitialSlope option is missing %! %# test for MaxOrder option is missing %! %# test for BDF option is missing +%! +%! warning ('on', 'OdePkg:InvalidOption'); %# Local Variables: *** %# mode: octave *** Modified: trunk/octave-forge/main/odepkg/inst/ode78.m =================================================================== --- trunk/octave-forge/main/odepkg/inst/ode78.m 2008-03-13 15:47:14 UTC (rev 4735) +++ trunk/octave-forge/main/odepkg/inst/ode78.m 2008-03-13 20:55:23 UTC (rev 4736) @@ -537,7 +537,7 @@ %!function [vjac] = fjac (vt, vy, varargin) %# its Jacobian %! vjac = [0, 1; -1 - 2 * vy(1) * vy(2), 1 - vy(1)^2]; %!function [vjac] = fjcc (vt, vy, varargin) %# sparse type -%! vjac = [0, 1; -1 - 2 * vy(1) * vy(2), 1 - vy(1)^2]; +%! vjac = sparse ([0, 1; -1 - 2 * vy(1) * vy(2), 1 - vy(1)^2]); %!function [vval, vtrm, vdir] = feve (vt, vy, varargin) %! vval = fpol (vt, vy, varargin); %# We use the derivatives %! vtrm = zeros (2,1); %# that's why component 2 @@ -586,7 +586,7 @@ %! assert ([vie, vxe, vye], []); %!test %# anonymous function instead of real function %! fvdb = @(vt,vy) [vy(2); (1 - vy(1)^2) * vy(2) - vy(1)]; -%! vsol = ode78 (@fpol, [0 2], [2 0]); +%! vsol = ode78 (fvdb, [0 2], [2 0]); %! assert ([vsol.x(end), vsol.y(end,:)], [2, fref], 1e-3); %!test %# extra input arguments passed trhough %! vsol = ode78 (@fpol, [0 2], [2 0], 12, 13, 'KL'); @@ -680,13 +680,14 @@ %!test %# Mass option as function and MStateDependence %! vopt = odeset ('Mass', @fmas, 'MStateDependence', 'strong'); %! vsol = ode78 (@fpol, [0 2], [2 0], vopt); -%! warning ('on', 'OdePkg:InvalidOption'); %! assert ([vsol.x(end), vsol.y(end,:)], [2, fref], 1e-3); %! %! %# test for MvPattern option is missing %! %# test for InitialSlope option is missing %! %# test for MaxOrder option is missing %! %# test for BDF option is missing +%! +%! warning ('on', 'OdePkg:InvalidOption'); %# Local Variables: *** %# mode: octave *** This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <tr...@us...> - 2008-03-13 20:56:59
|
Revision: 4737 http://octave.svn.sourceforge.net/octave/?rev=4737&view=rev Author: treichl Date: 2008-03-13 13:57:00 -0700 (Thu, 13 Mar 2008) Log Message: ----------- Fixed some tests, help texts and further minor changes. Modified Paths: -------------- trunk/octave-forge/main/odepkg/inst/ode23d.m trunk/octave-forge/main/odepkg/inst/ode45d.m trunk/octave-forge/main/odepkg/inst/ode54d.m trunk/octave-forge/main/odepkg/inst/ode78d.m trunk/octave-forge/main/odepkg/inst/odeexamples.m trunk/octave-forge/main/odepkg/inst/odepkg.m trunk/octave-forge/main/odepkg/inst/odepkg_examples_ide.m trunk/octave-forge/main/odepkg/inst/odepkg_examples_ode.m trunk/octave-forge/main/odepkg/inst/odepkg_testsuite_chemakzo.m trunk/octave-forge/main/odepkg/inst/odepkg_testsuite_implakzo.m trunk/octave-forge/main/odepkg/inst/odepkg_testsuite_implrober.m trunk/octave-forge/main/odepkg/inst/odepkg_testsuite_pollution.m Modified: trunk/octave-forge/main/odepkg/inst/ode23d.m =================================================================== --- trunk/octave-forge/main/odepkg/inst/ode23d.m 2008-03-13 20:55:23 UTC (rev 4736) +++ trunk/octave-forge/main/odepkg/inst/ode23d.m 2008-03-13 20:57:00 UTC (rev 4737) @@ -708,6 +708,8 @@ %! %# test for InitialSlope option is missing %! %# test for MaxOrder option is missing %! %# test for BDF option is missing +%! +%! warning ('on', 'OdePkg:InvalidOption'); %# Local Variables: *** %# mode: octave *** Modified: trunk/octave-forge/main/odepkg/inst/ode45d.m =================================================================== --- trunk/octave-forge/main/odepkg/inst/ode45d.m 2008-03-13 20:55:23 UTC (rev 4736) +++ trunk/octave-forge/main/odepkg/inst/ode45d.m 2008-03-13 20:57:00 UTC (rev 4737) @@ -712,6 +712,8 @@ %! %# test for InitialSlope option is missing %! %# test for MaxOrder option is missing %! %# test for BDF option is missing +%! +%! warning ('on', 'OdePkg:InvalidOption'); %# Local Variables: *** %# mode: octave *** Modified: trunk/octave-forge/main/odepkg/inst/ode54d.m =================================================================== --- trunk/octave-forge/main/odepkg/inst/ode54d.m 2008-03-13 20:55:23 UTC (rev 4736) +++ trunk/octave-forge/main/odepkg/inst/ode54d.m 2008-03-13 20:57:00 UTC (rev 4737) @@ -713,6 +713,8 @@ %! %# test for InitialSlope option is missing %! %# test for MaxOrder option is missing %! %# test for BDF option is missing +%! +%! warning ('on', 'OdePkg:InvalidOption'); %# Local Variables: *** %# mode: octave *** Modified: trunk/octave-forge/main/odepkg/inst/ode78d.m =================================================================== --- trunk/octave-forge/main/odepkg/inst/ode78d.m 2008-03-13 20:55:23 UTC (rev 4736) +++ trunk/octave-forge/main/odepkg/inst/ode78d.m 2008-03-13 20:57:00 UTC (rev 4737) @@ -733,6 +733,8 @@ %! %# test for InitialSlope option is missing %! %# test for MaxOrder option is missing %! %# test for BDF option is missing +%! +%! warning ('on', 'OdePkg:InvalidOption'); %# Local Variables: *** %# mode: octave *** Modified: trunk/octave-forge/main/odepkg/inst/odeexamples.m =================================================================== --- trunk/octave-forge/main/odepkg/inst/odeexamples.m 2008-03-13 20:55:23 UTC (rev 4736) +++ trunk/octave-forge/main/odepkg/inst/odeexamples.m 2008-03-13 20:57:00 UTC (rev 4737) @@ -16,8 +16,8 @@ %# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA %# -*- texinfo -*- -%# @deftypefn {Function File} {[@var{}] =} odepkg_examples_dde (@var{}) -%# Open the differential equations examples menu and allow the user to select a submenu of ODE, DAE, IDE or DDE. +%# @deftypefn {Function File} {[@var{}] =} odeexamples (@var{}) +%# Open the differential equations examples menu and allow the user to select a submenu of ODE, DAE, IDE or DDE examples. %# @end deftypefn function [] = odeexamples (varargin) @@ -36,15 +36,15 @@ vfam = input ('Please choose a number from above or press <Enter> to return: '); switch (vfam) case 1 - odepkg_examples_ode; + odepkg_examples_ode; case 2 - odepkg_examples_dae; + odepkg_examples_dae; case 3 - odepkg_examples_ide; + odepkg_examples_ide; case 4 - odepkg_examples_dde; + odepkg_examples_dde; otherwise - %# have nothing to do + %# have nothing to do end end Modified: trunk/octave-forge/main/odepkg/inst/odepkg.m =================================================================== --- trunk/octave-forge/main/odepkg/inst/odepkg.m 2008-03-13 20:55:23 UTC (rev 4736) +++ trunk/octave-forge/main/odepkg/inst/odepkg.m 2008-03-13 20:57:00 UTC (rev 4737) @@ -77,17 +77,18 @@ vfun = {'odepkg', 'odeget', 'odeset', ... 'ode23', 'ode45', 'ode54', 'ode78', ... - 'ode23d', 'ode45d', 'ode54d', 'ode78d', ... + 'ode23d', 'ode45d', 'ode54d', 'ode78d', ... 'odeplot', 'odephas2', 'odephas3', 'odeprint', ... 'odepkg_structure_check', 'odepkg_event_handle', ... 'odepkg_testsuite_calcscd', 'odepkg_testsuite_calcmescd', ... 'odepkg_testsuite_oregonator', 'odepkg_testsuite_pollution', ... 'odepkg_testsuite_hires', ... 'odepkg_testsuite_robertson', 'odepkg_testsuite_chemakzo', ... - 'odepkg_testsuite_transistor', ... + 'odepkg_testsuite_transistor', ... 'odepkg_testsuite_implrober', 'odepkg_testsuite_implakzo', ... - 'odepkg_testsuite_imptrans', ... - }; + 'odepkg_testsuite_imptrans', ... + 'odeexamples', 'odepkg_examples_ode', 'odepkg_examples_dae', ... + 'odepkg_examples_ide', 'odepkg_examples_dde'}; vfun = sort (vfun); [vout, vmsg] = fopen ('../doc/mfunref.texi', 'w'); @@ -118,9 +119,9 @@ function [] = odepkg_internal_octhelpextract () vfiles = {'../src/odepkg_octsolver_mebdfdae.cc', ... - '../src/odepkg_octsolver_mebdfi.cc', ... + '../src/odepkg_octsolver_mebdfi.cc', ... '../src/odepkg_octsolver_ddaskr.cc', ... - '../src/odepkg_octsolver_radau.cc', ... + '../src/odepkg_octsolver_radau.cc', ... '../src/odepkg_octsolver_radau5.cc', ... '../src/odepkg_octsolver_rodas.cc', ... '../src/odepkg_octsolver_seulex.cc', ... @@ -140,7 +141,9 @@ vlin = ' * '; %# Needed for the first call of while() while (isempty (regexp (vlin, '^(@end deftypefn)')) && ischar (vlin)) vlin = fgets (vfid); - fprintf (vout, '%s', sprintf (regexprep (vlin, '\\n\\', ''))); + vlin = sprintf (regexprep (vlin, '\\n\\', '')); + vlin = regexprep (vlin, '\\"', '"'); + fprintf (vout, '%s', vlin); end fprintf (vout, '\n'); end Modified: trunk/octave-forge/main/odepkg/inst/odepkg_examples_ide.m =================================================================== --- trunk/octave-forge/main/odepkg/inst/odepkg_examples_ide.m 2008-03-13 20:55:23 UTC (rev 4736) +++ trunk/octave-forge/main/odepkg/inst/odepkg_examples_ide.m 2008-03-13 20:57:00 UTC (rev 4737) @@ -29,6 +29,7 @@ '\n', ... ' (1) Solve the "Robertson problem" with solver "odebdi"\n', ... ' (2) Solve another "Robertson implementation" with solver "odekdi"\n', ... + ' (3) Solve an "Van der Pol" implementation with solver "odebdi"\n', ... '\n', ... ' Note: There are further IDE examples available with the OdePkg\n', ... ' testsuite functions.\n', ... @@ -38,7 +39,7 @@ ' your patch to the OdePkg developer team.\n', ... '\n' ]); vode = input ('Please choose a number from above or press <Enter> to return: '); - clc; if (vode > 0 && vode < 3) + clc; if (vode > 0 && vode < 4) %# We can't use the function 'demo' directly here because it does %# not allow to run other functions within a demo. vexa = example (mfilename (), vode); @@ -57,7 +58,7 @@ %! vres(3,1) = vy(1) + vy(2) + vy(3) - 1; %! endfunction %! -%! vopt = odeset ('NormControl', 'on'); +%! vopt = odeset ("NormControl", "on"); %! vsol = odebdi (@firobertson, [0, 1e11], [1, 0, 0], [-4e-2, 4e-2, 0], vopt); %! plot (vsol.x, vsol.y); @@ -71,10 +72,24 @@ %! vres(3,1) = vy(1) + vy(2) + vy(3) - 1; %! endfunction %! -%! vopt = odeset ('NormControl', 'on'); +%! vopt = odeset ("NormControl", "on"); %! vsol = odekdi (@firobertson, [0, 1e11], [1, 0, 0], [-4e-2, 4e-2, 0], vopt); %! plot (vsol.x, vsol.y); +%!demo +%! # Solve the "Van der Pol" problem that is given as a function +%! # handle to an implicite differential equation implementation. +%! +%! function [vres] = fvanderpol (vt, vy, vyd, varargin) +%! mu = varargin{1}; +%! vres = [vy(2) - vyd(1); +%! mu * (1 - vy(1)^2) * vy(2) - vy(1) - vyd(2)]; +%! endfunction +%! +%! vopt = odeset ("NormControl", "on", "RelTol", 1e-8); +%! vsol = odebdi (@fvanderpol, [0, 20], [2; 0], [0; -2], vopt, 10); +%! plot (vsol.x, vsol.y); + %# Local Variables: *** %# mode: octave *** %# End: *** Modified: trunk/octave-forge/main/odepkg/inst/odepkg_examples_ode.m =================================================================== --- trunk/octave-forge/main/odepkg/inst/odepkg_examples_ode.m 2008-03-13 20:55:23 UTC (rev 4736) +++ trunk/octave-forge/main/odepkg/inst/odepkg_examples_ode.m 2008-03-13 20:57:00 UTC (rev 4737) @@ -27,7 +27,7 @@ ['ODE examples menu:\n', ... '==================\n', ... '\n', ... - ' (1) Solve a non-stiff "Vanderpol" example with solver "ode78"\n', ... + ' (1) Solve a non-stiff "Van der Pol" example with solver "ode78"\n', ... ' (2) Solve a "Pendulous" example with solver "ode45"\n', ... ' (3) Solve the "Lorenz attractor" with solver "ode54"\n', ... ' (4) Solve the "Roessler equation" with solver "ode78"\n', ... Modified: trunk/octave-forge/main/odepkg/inst/odepkg_testsuite_chemakzo.m =================================================================== --- trunk/octave-forge/main/odepkg/inst/odepkg_testsuite_chemakzo.m 2008-03-13 20:55:23 UTC (rev 4736) +++ trunk/octave-forge/main/odepkg/inst/odepkg_testsuite_chemakzo.m 2008-03-13 20:57:00 UTC (rev 4737) @@ -32,7 +32,7 @@ if (nargin ~= 2) %# Check number and types of all input arguments help ('odepkg_testsuite_chemakzo'); error ('OdePkg:InvalidArgument', ... - 'Number of input arguments must be exactly two'); + 'Number of input arguments must be exactly two'); elseif (~isa (vhandle, 'function_handle') || ~isscalar (vrtol)) print_usage; end Modified: trunk/octave-forge/main/odepkg/inst/odepkg_testsuite_implakzo.m =================================================================== --- trunk/octave-forge/main/odepkg/inst/odepkg_testsuite_implakzo.m 2008-03-13 20:55:23 UTC (rev 4736) +++ trunk/octave-forge/main/odepkg/inst/odepkg_testsuite_implakzo.m 2008-03-13 20:57:00 UTC (rev 4737) @@ -32,7 +32,7 @@ if (nargin ~= 2) %# Check number and types of all input arguments help ('odepkg_testsuite_implakzo'); error ('OdePkg:InvalidArgument', ... - 'Number of input arguments must be exactly two'); + 'Number of input arguments must be exactly two'); elseif (~isa (vhandle, 'function_handle') || ~isscalar (vrtol)) print_usage; end Modified: trunk/octave-forge/main/odepkg/inst/odepkg_testsuite_implrober.m =================================================================== --- trunk/octave-forge/main/odepkg/inst/odepkg_testsuite_implrober.m 2008-03-13 20:55:23 UTC (rev 4736) +++ trunk/octave-forge/main/odepkg/inst/odepkg_testsuite_implrober.m 2008-03-13 20:57:00 UTC (rev 4737) @@ -33,7 +33,7 @@ if (nargin ~= 2) help ('odepkg_testsuite_implrober'); error ('OdePkg:InvalidArgument', ... - 'Number of input arguments must be exactly two'); + 'Number of input arguments must be exactly two'); elseif (~isa (vhandle, 'function_handle') || ~isscalar (vrtol)) print_usage; end Modified: trunk/octave-forge/main/odepkg/inst/odepkg_testsuite_pollution.m =================================================================== --- trunk/octave-forge/main/odepkg/inst/odepkg_testsuite_pollution.m 2008-03-13 20:55:23 UTC (rev 4736) +++ trunk/octave-forge/main/odepkg/inst/odepkg_testsuite_pollution.m 2008-03-13 20:57:00 UTC (rev 4737) @@ -32,7 +32,7 @@ if (nargin ~= 2) %# Check number and types of all input arguments help ('odepkg_testsuite_pollution'); error ('OdePkg:InvalidArgument', ... - 'Number of input arguments must be exactly two'); + 'Number of input arguments must be exactly two'); elseif (~isa (vhandle, 'function_handle') || ~isscalar (vrtol)) print_usage; end This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |