ode87.m
来自「关于混沌系统的李氏指数计算等混沌系统中重要参数计算的代码」· M 代码 · 共 223 行
M
223 行
function [tout,xout] = ode87(odefun,tspan,x0,options,varargin)% ODE87 is a realization of explicit Runge-Kutta method. % Integrates a system of ordinary differential equations using% 8-7 th order Dorman and Prince formulas. See P.J. Prince & J.R. Dorman (1981) % High order embedded Runge-Kutta formulae. J.Comp. Appl. Math., Vol. 7. p.67-75.%% This is a 8th-order accurate integrator therefore the local error normally% expected is O(h^9). % This requires 13 function evaluations per integration step.%% Some information about method can be found in% Hairer, Norsett and Wanner (1993): Solving Ordinary Differential Equations. Nonstiff Problems. % 2nd edition. Springer Series in Comput. Math., vol. 8. %% Interface to program based on standart MATLAB ode-suite interface but% with some restriction. % [T,Y] = ODE87(ODEFUN,TSPAN,Y0) with TSPAN = [T0 TFINAL] integrates the% system of differential equations y' = f(t,y) from time T0 to TFINAL with% initial conditions Y0. Function ODEFUN(T,Y) must return a column vector% corresponding to f(t,y). Each row in the solution array Y corresponds to% a time returned in the column vector T. % % [T,Y] = ODE87(ODEFUN,TSPAN,Y0,OPTIONS) solves as above with default% integration properties replaced by values in OPTIONS, an argument created% with the ODESET function. See ODESET for details. Commonly used options % are scalar relative error tolerance 'RelTol' (1e-6 by default).% % [T,Y] = ODE87(ODEFUN,TSPAN,Y0,OPTIONS,P1,P2...) passes the additional% parameters P1,P2,... to the ODE function as ODEFUN(T,Y,P1,P2...), and to% all functions specified in OPTIONS. Use OPTIONS = [] as a place holder if% no options are set. %% Example % [t,y]=ode87(@vdp1,[0 20],[2 0]); % plot(t,y(:,1));% solves the system y' = vdp1(t,y), using the default relative error% tolerance 1e-3 and the default absolute tolerance of 1e-6 for each% component, and plots the first component of the solution. %% --------------------------------------------------------------------% Copyright (C) 2003, Govorukhin V.N.% This file is intended for use with MATLAB and was produced for MATDS-program% http://www.math.rsu.ru/mexmat/kvm/matds/% ODE87 is free software. ODE87 is distributed in the hope that it will be useful, % but WITHOUT ANY WARRANTY. % The coefficients of methodc_i= [ 1/18, 1/12, 1/8, 5/16, 3/8, 59/400, 93/200, 5490023248/9719169821, 13/20, 1201146811/1299019798, 1, 1]';a_i_j = [ 1/18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0; 1/48, 1/16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0; 1/32, 0, 3/32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0; 5/16, 0, -75/64, 75/64, 0, 0, 0, 0, 0, 0, 0, 0, 0; 3/80, 0, 0, 3/16, 3/20, 0, 0, 0, 0, 0, 0, 0, 0; 29443841/614563906, 0, 0, 77736538/692538347, -28693883/1125000000, 23124283/1800000000, 0, 0, 0, 0, 0, 0, 0; 16016141/946692911, 0, 0, 61564180/158732637, 22789713/633445777, 545815736/2771057229, -180193667/1043307555, 0, 0, 0, 0, 0, 0; 39632708/573591083, 0, 0, -433636366/683701615, -421739975/2616292301, 100302831/723423059, 790204164/839813087, 800635310/3783071287, 0, 0, 0, 0, 0; 246121993/1340847787, 0, 0, -37695042795/15268766246, -309121744/1061227803, -12992083/490766935, 6005943493/2108947869, 393006217/1396673457, 123872331/1001029789, 0, 0, 0, 0; -1028468189/846180014, 0, 0, 8478235783/508512852, 1311729495/1432422823, -10304129995/1701304382, -48777925059/3047939560, 15336726248/1032824649, -45442868181/3398467696, 3065993473/597172653, 0, 0, 0; 185892177/718116043, 0, 0, -3185094517/667107341, -477755414/1098053517, -703635378/230739211, 5731566787/1027545527, 5232866602/850066563, -4093664535/808688257, 3962137247/1805957418, 65686358/487910083, 0, 0; 403863854/491063109, 0, 0, -5068492393/434740067, -411421997/543043805, 652783627/914296604, 11173962825/925320556, -13158990841/6184727034, 3936647629/1978049680, -160528059/685178525, 248638103/1413531060, 0, 0]'; b_8 = [ 14005451/335480064, 0, 0, 0, 0, -59238493/1068277825, 181606767/758867731, 561292985/797845732, -1041891430/1371343529, 760417239/1151165299, 118820643/751138087, -528747749/2220607170, 1/4]'; b_7 = [ 13451932/455176623, 0, 0, 0, 0, -808719846/976000145, 1757004468/5645159321, 656045339/265891186, -3867574721/1518517206, 465885868/322736535, 53011238/667516719, 2/45, 0]';pow = 1/8; % power for step control% Check inputsif nargin < 5 varargin={};end;if nargin < 4 options = []; if nargin < 3 error('Not enough input arguments. See ODE87.'); endend;% Maximal step sizehmax=odeget(options,'MaxStep');if isempty(hmax) hmax = (tspan(2) - tspan(1))/2.5;end;% initial step sizeh=odeget(options,'InitialStep');if isempty(h) h = (tspan(2) - tspan(1))/50; if h>0.1 h=0.1 end; if h>hmax h = hmax; end;end;% Output ODEction checking and output parametershaveoutfun = 1;outfun = odeget(options,'OutputFcn',[],'fast');if isempty(outfun) haveoutfun = 0;end;% A relative error tolerance that applies to all components of the solution vector. tol=odeget(options,'RelTol');if isempty(tol) tol = 1.e-6;end;% Initializationnstep = 0;t0 = tspan(1);tfinal = tspan(2);t = t0;% Minimal step sizehmin = 16*eps*abs(t);% Initializationn_reject = 0;% constant for step rejectionreject = 0;t0 = tspan(1);tfinal = tspan(2);t = t0;x = x0(:); % start pointf = x*zeros(1,13); % array f for RHS calculationtout = t;xout = x.';tau = tol * max(norm(x,'inf'), 1); % accuracy% Initial output if haveoutfun feval(outfun,t,x,'init',varargin{:}); end;% The main loop while (t < tfinal) & (h >= hmin) if (t + h) > tfinal h = tfinal - t; end;% nstep=nstep+1;% Compute the RHS for step of method f(:,1) = feval(odefun,t,x, varargin{:}); for j = 1: 12, f(:,j+1) = feval(odefun, t+c_i(j)*h, x+h*f*a_i_j(:,j), varargin{:}); end;% Two solution sol2=x+h*f*b_8; sol1=x+h*f*b_7;% Truncation error error_1 = norm(sol1-sol2);% Estimate the error and the acceptable error Error_step = norm(error_1,'inf'); tau = tol*max(norm(x,'inf'),1.0);% Update the solution only if the error is acceptable if Error_step <= tau t = t + h; x = sol2; tout = [tout; t]; xout = [xout; x.']; if haveoutfun status=feval(outfun,t,x,'',varargin{:}); if status == 1 return; end; else t; x.'; end; reject = reject - 1; else n_reject = n_reject + 1; reject = 1; end;% Step control if Error_step == 0.0 Error_step = eps*10.0; end; h = min(hmax, 0.9*h*(tau/Error_step)^pow); if (abs(h) <= eps) if reject == 0 disp('Warning!!! ode87. Step is very small!!!'); h = eps * 100; return else disp('Error in ode87. Step is too small.'); return; end; end; end; if (t < tfinal) disp('Error in ODE87...') t end; if haveoutfun feval(outfun,t,x,'done',varargin{:}); end;% nstep;
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?