二十年前读书时用过的Lyapunov Exponents Toolbox,推荐给做非线性动力学入门的同学们。那个时候不会编写程序,做分支图、算连续或者离散系统的Lyapunov指数,极其困难,还好有这个工具箱,慢慢看源程序学会写一点改进的程序。所以真的很感谢有人愿意分享自己的小工具给大家。
数学中非线性动力学是个经典的领域,每年都会有学生进入到这个领域学习,煎熬的日子也会重演,所以搜集一些小工具给他们也许会很有用。
先去这里看看GUI界面的LET工具箱吧:
https://www.mathworks.com/matlabcentral/fileexchange/233-let?s_tid=srchtitle
Lyapunov指数工具箱(LET)为用户确定连续和离散混沌系统的Lyapunov指数和Lyapunov维数提供了一个图形用户界面。
此工具箱只能在Matlab5或更高版本的MATLAB上运行。它已经在Windows和Unix下测试过,也可以在其他平台上运行。
要运行程序,请在MATLAB命令窗口中输入LET。这个工具箱的详细描述可以在文件README.M中找到。
Cite As:
Steve SIU (2020).
let,MATLAB Central File Exchange. Retrieved May 21, 2020.
https://www.mathworks.com/matlabcentral/fileexchange/233-let.
如果你入门会使用它计算LE后,想自己写代码算一些个性化的系统的LE,你可以看看它的源代码,或者看看下面的纯脚本函数形式的LE计算小包,它是1985年Wolf那篇Phys D上经典文章的算法实现,也是软件包MATDS的一部分,我个人觉得很有参考价值:
Calculation Lyapunov Exponents for ODE:
https://www.mathworks.com/matlabcentral/fileexchange/4628-calculation-lyapunov-exponents-for-ode?s_tid=FX_rc1_behav
本函数包实现ODE系统的Lyapunov指数计算。这个m文件中用于实现Lyapunov指数的算法,该算法来源于A.Wolf、J.B.Swift、H.L.Swinney和J.A.Vastano,Physica D,1985年,第16卷,第285-317页的经典文章。
对于集成ODE系统可以使用任何MATLAB的ODE Suite。
此函数是MATDS动态系统研究工具箱的一部分。感兴趣的读者可参见:
http://www.math.rsu.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:
Texp - time values
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.
样例:
Example.
洛伦兹系统:
Lorenz system:
dx/dt = sigma*(y - x)
dy/dt = r*x - y - x*z
dz/dt = x*y - b*z
雅可比矩阵:
The Jacobian of system:
| -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:
lyapunov.m - algorithm
lorenz_ext - Lorenz system extended rhs
run_lyap - example of calling and result visualization
此函数是MATDS动态系统研究工具箱的一部分。感兴趣的读者可参见:
http://www.math.rsu.ru/mexmat/kvm/matds/
Cite As:
Vasiliy Govorukhin (2020).
Calculation Lyapunov Exponents for ODE,MATLAB Central File Exchange. Retrieved May 21, 2020.
https://www.mathworks.com/matlabcentral/fileexchange/4628-calculation-lyapunov-exponents-for-ode.
同一篇文章的算法实现,你也可以看看下面论文原作者的这个函数怎么写的:
Wolf Lyapunov exponent estimation from a time series.
A Matlab version of the Lyapunov exponent estimation algorithm of Wolf et al. -- Physica 16D, 1985.
by Alan Wolf
https://www.mathworks.com/matlabcentral/fileexchange/48084-wolf-lyapunov-exponent-estimation-from-a-time-series?s_tid=FX_rc2_behav
在Physica 16D(1985)那篇文章中,我们提出了一种通过监测轨道发散来估计一维时间序列的主Lyapunov指数的算法。该算法是作者用Fortran和C语言编写的。现在我们把它转换成了Matlab语言。
上述地址下载的压缩包里包括文档:Physica D文章、名为Lyapunews的pdf文件。该包包含的示例文件是以unix换行符结尾的数据点编写的。这些文件在被各种编辑器显示时可能看起来很奇怪。它可以使用任何可以输出时间序列值的软件创建数据文件,每行一个,以回车和换行结束。现有的代码可以很好地读取这些文件。如果你有问题,请不要在这里发帖,直接发邮件给作者吧。
awolf.physics@gmail.com
Cite As:
Alan Wolf (2020). Wolf Lyapunov exponent estimation from a time series.
https://www.mathworks.com/matlabcentral/fileexchange/48084-wolf-lyapunov-exponent-estimation-from-a-time-series,
MATLAB Central File Exchange. Retrieved May 21, 2020.
其他方法计算LE,可以看看下面的这个Rosenstein方法:
Largest Lyapunov Exponent with Rosenstein's Algorithm
https://www.mathworks.com/matlabcentral/fileexchange/38424-largest-lyapunov-exponent-with-rosenstein-s-algorithm?s_tid=FX_rc3_behav
by mirwais
This code calculates the largest lyapunov exponent of time series with Rosenstein's Algorithm.
基于本代码做图,在图上可以看到临近轨线的发散。如果确定了轨线的线性范围,代码就可以计算出最大的lyapunov指数。代码已经用Rosenstein文章的结果进行了测试。
Cite As:
mirwais (2020). Largest Lyapunov Exponent with Rosenstein's Algorithm
https://www.mathworks.com/matlabcentral/fileexchange/38424-largest-lyapunov-exponent-with-rosenstein-s-algorithm,
MATLAB Central File Exchange. Retrieved May 21, 2020.