function [Texp,Lexp]=lyapunov(n,rhs_ext_fcn,fcn_integrator,tstart,stept,tend,ystart,ioutp);
%
% Lyapunov exponent calcullation
for ODE
-system.
%
% The alogrithm employed in this m-file for determining Lyapunov
% exponents was proposed in
%
% A. Wolf, J. B. Swift, H. L. Swinney, and J. A. Vastano,
% "Determining Lyapunov Exponents from a Time Series," Physica D,
% Vol. 16, pp. 285-317, 1985.
%
% For integrating ODE
system can be used any MATLAB ODE
-suite methods.
% This
function is a part of MATDS program
- toolbox
for dynamical
system investigation
% See: http://w...content-available-to-author-only...u.ru/mexmat/kvm/matds/
%
% Input parameters:
% n - number of equation
% rhs_ext_fcn
- handle of
function with right hand side of extended ODE
-system.
% This
function must include RHS of ODE
-system coupled with
% variational equation (n items of linearized systems, see Example).
% fcn_integrator - handle of ODE integrator function, for example: @ode45
% tstart
- start values of independent value
(time t
) % stept - step on t-variable for Gram-Schmidt renormalization procedure.
% tend
- finish value of
time % ystart
- start point of trajectory of ODE
system.
% ioutp - step of print to MATLAB main window. ioutp==0 - no print,
% if ioutp>0 then each ioutp-th point will be print.
%
% Output parameters:
% Lexp
- Lyapunov exponents to each
time value.
%
% Users have to write their own ODE functions for their specified
% systems and use handle of this function as rhs_ext_fcn - parameter.
%
% dx/dt = sigma*(y - x) = f1
% dy/dt = r*x - y - x*z = f2
% dz/dt = x*y - b*z = f3
%
% | -sigma sigma 0 |
% J = | r-z -1 -x |
% | y x -b |
%
% Then, the variational equation has a form:
%
% F = J*Y
% where Y is a square matrix with the same dimension as J.
% Corresponding m-file:
% function f=lorenz_ext(t,X)
% SIGMA = 10; R = 28; BETA = 8/3;
% x=X(1); y=X(2); z=X(3);
%
% Y= [X(4), X(7), X(10);
% X(5), X(8), X(11);
% X(6), X(9), X(12)];
% f=zeros(9,1);
% f(1)=SIGMA*(y-x); f(2)=-x*z+R*x-y; f(3)=x*y-BETA*z;
%
% Jac=[-SIGMA,SIGMA,0; R-z,-1,-x; y, x,-BETA];
%
% f(4:12)=Jac*Y;
%
% Run Lyapunov exponent calculation:
%
% [T,Res]=lyapunov(3,@lorenz_ext,@ode45,0,0.5,200,[0 1 0],10);
%
% See files: lorenz_ext, run_lyap.
%
% --------------------------------------------------------------------
% Copyright (C) 2004, Govorukhin V.N.
% This file is intended for use with MATLAB and was produced for MATDS-program
% http://w...content-available-to-author-only...u.ru/mexmat/kvm/matds/
% lyapunov.
m is
free software.
lyapunov.
m is distributed in the hope that it
% will be useful, but WITHOUT ANY WARRANTY.
%
%
% n=number of nonlinear odes
% n2=n*(n+1)=total number of odes
%
n1=n; n2=n1*(n1+1);
% Number of steps
nit = round((tend-tstart)/stept);
% Memory allocation
y=zeros(n2,1); cum=zeros(n1,1); y0=y;
gsc=cum; znorm=cum;
% Initial values
y(1:n)=ystart(:);
for i=1:n1 y((n1+1)*i)=1.0; end;
t=tstart;
% Main loop
for ITERLYAP=1:nit
% Solutuion of extended ODE
system
[T,Y] = feval(fcn_integrator,rhs_ext_fcn,[t t+stept],y);
t=t+stept;
y=Y(size(Y,1),:);
for i=1:n1
for j=1:n1 y0(n1*i+j)=y(n1*j+i); end;
end;
%
% construct new orthonormal basis by gram-schmidt
%
znorm(1)=0.0;
for j=1:n1 znorm(1)=znorm(1)+y0(n1*j+1)^2; end;
for j=1:n1 y0(n1*j+1)=y0(n1*j+1)/znorm(1); end;
for j=2:n1
for k=1:(j-1)
gsc(k)=0.0;
for l=1:n1 gsc(k)=gsc(k)+y0(n1*l+j)*y0(n1*l+k); end;
end;
for k=1:n1
for l=1:(j-1)
y0(n1*k+j)=y0(n1*k+j)-gsc(l)*y0(n1*k+l);
end;
end;
znorm(j)=0.0;
for k=1:n1 znorm(j)=znorm(j)+y0(n1*k+j)^2; end;
for k=1:n1 y0(n1*k+j)=y0(n1*k+j)/znorm(j); end;
end;
%
% update running vector magnitudes
%
for k
=1:n1 cum
(k
)=cum
(k
)+log(znorm
(k
)); end
;
%
% normalize exponent
%
for k=1:n1
lp(k)=cum(k)/(t-tstart);
end;
% Output modification
if ITERLYAP==1
Lexp=lp;
Texp=t;
else
Lexp=[Lexp; lp];
Texp=[Texp; t];
end;
if (mod(ITERLYAP,ioutp)==0)
for k
=1:n1
fprintf(' %10.6f',lp
(k
)); end
; end;
for i=1:n1
for j=1:n1
y(n1*j+i)=y0(n1*i+j);
end;
end;
end;
ZnVuY3Rpb24gW1RleHAsTGV4cF09bHlhcHVub3YobixyaHNfZXh0X2ZjbixmY25faW50ZWdyYXRvcix0c3RhcnQsc3RlcHQsdGVuZCx5c3RhcnQsaW91dHApOwolCiUgICAgTHlhcHVub3YgZXhwb25lbnQgY2FsY3VsbGF0aW9uIGZvciBPREUtc3lzdGVtLgolCiUgICAgVGhlIGFsb2dyaXRobSBlbXBsb3llZCBpbiB0aGlzIG0tZmlsZSBmb3IgZGV0ZXJtaW5pbmcgTHlhcHVub3YKJSAgICBleHBvbmVudHMgd2FzIHByb3Bvc2VkIGluCiUKJSAgICAgICAgIEEuIFdvbGYsIEouIEIuIFN3aWZ0LCBILiBMLiBTd2lubmV5LCBhbmQgSi4gQS4gVmFzdGFubywKJSAgICAgICAgIkRldGVybWluaW5nIEx5YXB1bm92IEV4cG9uZW50cyBmcm9tIGEgVGltZSBTZXJpZXMsIiBQaHlzaWNhIEQsCiUgICAgICAgIFZvbC4gMTYsIHBwLiAyODUtMzE3LCAxOTg1LgolCiUgICAgRm9yIGludGVncmF0aW5nIE9ERSBzeXN0ZW0gY2FuIGJlIHVzZWQgYW55IE1BVExBQiBPREUtc3VpdGUgbWV0aG9kcy4gCiUgVGhpcyBmdW5jdGlvbiBpcyBhIHBhcnQgb2YgTUFURFMgcHJvZ3JhbSAtIHRvb2xib3ggZm9yIGR5bmFtaWNhbCBzeXN0ZW0gaW52ZXN0aWdhdGlvbgolICAgIFNlZTogICAgaHR0cDovL3cuLi5jb250ZW50LWF2YWlsYWJsZS10by1hdXRob3Itb25seS4uLnUucnUvbWV4bWF0L2t2bS9tYXRkcy8KJQolICAgIElucHV0IHBhcmFtZXRlcnM6CiUgICAgICBuIC0gbnVtYmVyIG9mIGVxdWF0aW9uCiUgICAgICByaHNfZXh0X2ZjbiAtIGhhbmRsZSBvZiBmdW5jdGlvbiB3aXRoIHJpZ2h0IGhhbmQgc2lkZSBvZiBleHRlbmRlZCBPREUtc3lzdGVtLgolICAgICAgICAgICAgICBUaGlzIGZ1bmN0aW9uIG11c3QgaW5jbHVkZSBSSFMgb2YgT0RFLXN5c3RlbSBjb3VwbGVkIHdpdGggCiUgICAgICAgICAgICAgIHZhcmlhdGlvbmFsIGVxdWF0aW9uIChuIGl0ZW1zIG9mIGxpbmVhcml6ZWQgc3lzdGVtcywgc2VlIEV4YW1wbGUpLiAgICAgICAgICAgICAgICAgICAKJSAgICAgIGZjbl9pbnRlZ3JhdG9yIC0gaGFuZGxlIG9mIE9ERSBpbnRlZ3JhdG9yIGZ1bmN0aW9uLCBmb3IgZXhhbXBsZTogQG9kZTQ1ICAgICAgICAgICAgICAgICAgCiUgICAgICB0c3RhcnQgLSBzdGFydCB2YWx1ZXMgb2YgaW5kZXBlbmRlbnQgdmFsdWUgKHRpbWUgdCkKJSAgICAgIHN0ZXB0IC0gc3RlcCBvbiB0LXZhcmlhYmxlIGZvciBHcmFtLVNjaG1pZHQgcmVub3JtYWxpemF0aW9uIHByb2NlZHVyZS4KJSAgICAgIHRlbmQgLSBmaW5pc2ggdmFsdWUgb2YgdGltZQolICAgICAgeXN0YXJ0IC0gc3RhcnQgcG9pbnQgb2YgdHJhamVjdG9yeSBvZiBPREUgc3lzdGVtLgolICAgICAgaW91dHAgLSBzdGVwIG9mIHByaW50IHRvIE1BVExBQiBtYWluIHdpbmRvdy4gaW91dHA9PTAgLSBubyBwcmludCwgCiUgICAgICAgICAgICAgIGlmIGlvdXRwPjAgdGhlbiBlYWNoIGlvdXRwLXRoIHBvaW50IHdpbGwgYmUgcHJpbnQuCiUKJSAgICBPdXRwdXQgcGFyYW1ldGVyczoKJSAgICAgIFRleHAgLSB0aW1lIHZhbHVlcwolICAgICAgTGV4cCAtIEx5YXB1bm92IGV4cG9uZW50cyB0byBlYWNoIHRpbWUgdmFsdWUuCiUKJSAgICBVc2VycyBoYXZlIHRvIHdyaXRlIHRoZWlyIG93biBPREUgZnVuY3Rpb25zIGZvciB0aGVpciBzcGVjaWZpZWQKJSAgICBzeXN0ZW1zIGFuZCB1c2UgaGFuZGxlIG9mIHRoaXMgZnVuY3Rpb24gYXMgcmhzX2V4dF9mY24gLSBwYXJhbWV0ZXIuICAgICAgCiUKJSAgICBFeGFtcGxlLiBMb3Jlbnogc3lzdGVtOgolICAgICAgICAgICAgICAgZHgvZHQgPSBzaWdtYSooeSAtIHgpICAgICA9IGYxCiUgICAgICAgICAgICAgICBkeS9kdCA9IHIqeCAtIHkgLSB4KnogPSBmMgolICAgICAgICAgICAgICAgZHovZHQgPSB4KnkgLSBiKnogICAgID0gZjMKJQolICAgIFRoZSBKYWNvYmlhbiBvZiBzeXN0ZW06IAolICAgICAgICB8IC1zaWdtYSAgc2lnbWEgIDAgfAolICAgIEogPSB8ICAgci16ICAgIC0xICAgLXggfAolICAgICAgICB8ICAgIHkgICAgICB4ICAgLWIgfAolCiUgICAgVGhlbiwgdGhlIHZhcmlhdGlvbmFsIGVxdWF0aW9uIGhhcyBhIGZvcm06CiUgCiUgICAgRiA9IEoqWQolICAgIHdoZXJlIFkgaXMgYSBzcXVhcmUgbWF0cml4IHdpdGggdGhlIHNhbWUgZGltZW5zaW9uIGFzIEouCiUgICAgQ29ycmVzcG9uZGluZyBtLWZpbGU6CiUgICAgICAgIGZ1bmN0aW9uIGY9bG9yZW56X2V4dCh0LFgpCiUgICAgICAgICBTSUdNQSA9IDEwOyBSID0gMjg7IEJFVEEgPSA4LzM7CiUgICAgICAgICB4PVgoMSk7IHk9WCgyKTsgej1YKDMpOwolCiUgICAgICAgICBZPSBbWCg0KSwgWCg3KSwgWCgxMCk7CiUgICAgICAgICAgICAgWCg1KSwgWCg4KSwgWCgxMSk7CiUgICAgICAgICAgICAgWCg2KSwgWCg5KSwgWCgxMildOwolICAgICAgICAgZj16ZXJvcyg5LDEpOwolICAgICAgICAgZigxKT1TSUdNQSooeS14KTsgZigyKT0teCp6K1IqeC15OyBmKDMpPXgqeS1CRVRBKno7CiUKJSAgICAgICAgIEphYz1bLVNJR01BLFNJR01BLDA7IFIteiwtMSwteDsgeSwgeCwtQkVUQV07CiUgIAolICAgICAgICAgZig0OjEyKT1KYWMqWTsKJQolICAgIFJ1biBMeWFwdW5vdiBleHBvbmVudCBjYWxjdWxhdGlvbjoKJSAgICAgCiUgICAgW1QsUmVzXT1seWFwdW5vdigzLEBsb3JlbnpfZXh0LEBvZGU0NSwwLDAuNSwyMDAsWzAgMSAwXSwxMCk7ICAgCiUgICAKJSAgICBTZWUgZmlsZXM6IGxvcmVuel9leHQsIHJ1bl9seWFwLiAgIAolICAKJSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQolIENvcHlyaWdodCAoQykgMjAwNCwgR292b3J1a2hpbiBWLk4uCiUgVGhpcyBmaWxlIGlzIGludGVuZGVkIGZvciB1c2Ugd2l0aCBNQVRMQUIgYW5kIHdhcyBwcm9kdWNlZCBmb3IgTUFURFMtcHJvZ3JhbQolIGh0dHA6Ly93Li4uY29udGVudC1hdmFpbGFibGUtdG8tYXV0aG9yLW9ubHkuLi51LnJ1L21leG1hdC9rdm0vbWF0ZHMvCiUgbHlhcHVub3YubSBpcyBmcmVlIHNvZnR3YXJlLiBseWFwdW5vdi5tIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgCiUgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWS4gCiUKCgoKJQolICAgICAgIG49bnVtYmVyIG9mIG5vbmxpbmVhciBvZGVzCiUgICAgICAgbjI9bioobisxKT10b3RhbCBudW1iZXIgb2Ygb2RlcwolCgpuMT1uOyBuMj1uMSoobjErMSk7CgolICBOdW1iZXIgb2Ygc3RlcHMKCm5pdCA9IHJvdW5kKCh0ZW5kLXRzdGFydCkvc3RlcHQpOwoKJSBNZW1vcnkgYWxsb2NhdGlvbiAKCnk9emVyb3MobjIsMSk7IGN1bT16ZXJvcyhuMSwxKTsgeTA9eTsKZ3NjPWN1bTsgem5vcm09Y3VtOwoKJSBJbml0aWFsIHZhbHVlcwoKeSgxOm4pPXlzdGFydCg6KTsKCmZvciBpPTE6bjEgeSgobjErMSkqaSk9MS4wOyBlbmQ7Cgp0PXRzdGFydDsKCiUgTWFpbiBsb29wCgpmb3IgSVRFUkxZQVA9MTpuaXQKCiUgU29sdXR1aW9uIG9mIGV4dGVuZGVkIE9ERSBzeXN0ZW0gCgogIFtULFldID0gZmV2YWwoZmNuX2ludGVncmF0b3IscmhzX2V4dF9mY24sW3QgdCtzdGVwdF0seSk7ICAKICAKICB0PXQrc3RlcHQ7CiAgeT1ZKHNpemUoWSwxKSw6KTsKCiAgZm9yIGk9MTpuMSAKICAgICAgZm9yIGo9MTpuMSB5MChuMSppK2opPXkobjEqaitpKTsgZW5kOwogIGVuZDsKCiUKJSAgICAgICBjb25zdHJ1Y3QgbmV3IG9ydGhvbm9ybWFsIGJhc2lzIGJ5IGdyYW0tc2NobWlkdAolCgogIHpub3JtKDEpPTAuMDsKICBmb3Igaj0xOm4xIHpub3JtKDEpPXpub3JtKDEpK3kwKG4xKmorMSleMjsgZW5kOwoKICB6bm9ybSgxKT1zcXJ0KHpub3JtKDEpKTsKCiAgZm9yIGo9MTpuMSB5MChuMSpqKzEpPXkwKG4xKmorMSkvem5vcm0oMSk7IGVuZDsKCiAgZm9yIGo9MjpuMQogICAgICBmb3Igaz0xOihqLTEpCiAgICAgICAgICBnc2Moayk9MC4wOwogICAgICAgICAgZm9yIGw9MTpuMSBnc2Moayk9Z3NjKGspK3kwKG4xKmwraikqeTAobjEqbCtrKTsgZW5kOwogICAgICBlbmQ7CiAKICAgICAgZm9yIGs9MTpuMQogICAgICAgICAgZm9yIGw9MTooai0xKQogICAgICAgICAgICAgIHkwKG4xKmsraik9eTAobjEqaytqKS1nc2MobCkqeTAobjEqaytsKTsKICAgICAgICAgIGVuZDsKICAgICAgZW5kOwoKICAgICAgem5vcm0oaik9MC4wOwogICAgICBmb3Igaz0xOm4xIHpub3JtKGopPXpub3JtKGopK3kwKG4xKmsraileMjsgZW5kOwogICAgICB6bm9ybShqKT1zcXJ0KHpub3JtKGopKTsKCiAgICAgIGZvciBrPTE6bjEgeTAobjEqaytqKT15MChuMSprK2opL3pub3JtKGopOyBlbmQ7CiAgZW5kOwoKJQolICAgICAgIHVwZGF0ZSBydW5uaW5nIHZlY3RvciBtYWduaXR1ZGVzCiUKCiAgZm9yIGs9MTpuMSBjdW0oayk9Y3VtKGspK2xvZyh6bm9ybShrKSk7IGVuZDsKCiUKJSAgICAgICBub3JtYWxpemUgZXhwb25lbnQKJQoKICBmb3Igaz0xOm4xIAogICAgICBscChrKT1jdW0oaykvKHQtdHN0YXJ0KTsgCiAgZW5kOwoKJSBPdXRwdXQgbW9kaWZpY2F0aW9uCgogIGlmIElURVJMWUFQPT0xCiAgICAgTGV4cD1scDsKICAgICBUZXhwPXQ7CiAgZWxzZQogICAgIExleHA9W0xleHA7IGxwXTsKICAgICBUZXhwPVtUZXhwOyB0XTsKICBlbmQ7CgogIGlmIChtb2QoSVRFUkxZQVAsaW91dHApPT0wKQogICAgIGZwcmludGYoJ3Q9JTYuNGYnLHQpOwogICAgIGZvciBrPTE6bjEgZnByaW50ZignICUxMC42ZicsbHAoaykpOyBlbmQ7CiAgICAgZnByaW50ZignXG4nKTsKICBlbmQ7CgogIGZvciBpPTE6bjEgCiAgICAgIGZvciBqPTE6bjEKICAgICAgICAgIHkobjEqaitpKT15MChuMSppK2opOwogICAgICBlbmQ7CiAgZW5kOwoKZW5kOw==