- Lyapunov指数,混沌系统的基本特点就是系统对初始值的极端敏感性,两个相差无几的初值所产生的轨迹,随着时间的推移按指数方式分离。
Lyapunov exponents
最大李雅普诺夫指数
Lorenz系统族模型


matlab
Z=[];
a=10;
c=-5.75;
d0=1e-7;
bs = linspace(0,300,301);
transient = 50;
for b=bs
params = [a,b,c];
lsum=0;
x=1;y=1;z=1;
x1=1;y1=1;z1=1+d0;
for i=1:100
[T1,Y1]=ode45(@(t,X) Lorenz(t,X,params),[0 1],[x;y;z]);
[T2,Y2]=ode45(@(t,X) Lorenz(t,X,params),[0 1],[x1;y1;z1]);
n1=length(Y1);n2=length(Y2);
x=Y1(n1,1);y=Y1(n1,2);z=Y1(n1,3);
x1=Y2(n2,1);y1=Y2(n2,2);z1=Y2(n2,3);
d1=sqrt((x-x1)^2+(y-y1)^2+(z-z1)^2);
x1=x+(d0/d1)*(x1-x);
y1=y+(d0/d1)*(y1-y);
z1=z+(d0/d1)*(z1-z);
if i> transient
lsum=lsum+log(d1/d0);
end
end
Z=[Z lsum/(i-transient)];
end
plot(bs,Z,'-k');
title('')
xlabel('parameter b'),ylabel('Largest Lyapunov Exponents');
grid on;
function dX = Lorenz(t,X,params)
a = params(1);
b = params(2);
c = params(3);
x=X(1);
y=X(2);
z=X(3);
dX = zeros(3,1);
dX(1)=a*(y-x);
dX(2)=-c*y-x*z;
dX(3)=x*y-b;
end

fortran
module Lorenz
implicit none
real,parameter :: h=0.001
integer,parameter :: MaxT=2500000,N=3,M=1,T_trans=2000000
real(kind=8) :: x1(M,N),x2(M,N)
real :: tau(M),b
contains
subroutine fnf(xx,fx,i)
implicit none
real(kind=8) :: xx(N),fx(N)
integer :: t,i,j
real :: a,c
tau=1.0
a=10.0
c=-5.75
fx(1)=tau(i)*a*(xx(2)-xx(1))
fx(2)=tau(i)*(-xx(1)*xx(3)-c*xx(2))
fx(3)=tau(i)*(xx(1)*xx(2)-b)
return
end subroutine fnf
subroutine rk4(x)
implicit none
integer :: i
real(kind=8) :: x(M,N),xx(N),fx(N)
real(kind=8) :: kx1(N),kx2(N),kx3(N),kx4(N)
do i=1,M,1
xx=x(i,:)
call fnf(xx,fx,i)
kx1=h*fx
xx=x(i,:)+0.5*kx1
call fnf(xx,fx,i)
kx2=h*fx
xx=x(i,:)+0.5*kx2
call fnf(xx,fx,i)
kx3=h*fx
xx=x(i,:)+kx3
call fnf(xx,fx,i)
kx4=h*fx
x(i,:)=x(i,:)+(kx1+2.0*kx2+2.0*kx3+kx4)/6.0
end do
return
end subroutine rk4
end module Lorenz
program main
use Lorenz
implicit none
integer :: t,i
real(kind=8) :: d1=0.0,d0,lam,lamda
open(10,file="lamda.txt")
d0=1.0e-7
do i=0,300,1
lam=0.0
lamda=0.0
b=real(i)
x1(1,1)=1.0
x1(1,2)=1.0
x1(1,3)=1.0
x2=x1
x2(1,3)=x1(1,3)+d0
do t=1,MaxT,1
call rk4(x1)
call rk4(x2)
d1=sqrt((x2(1,1)-x1(1,1))**2+(x2(1,2)-x1(1,2))**2+(x2(1,3)-x1(1,3))**2)
x2(1,1)=x1(1,1)+(d0/d1)*(x2(1,1)-x1(1,1))
x2(1,2)=x1(1,2)+(d0/d1)*(x2(1,2)-x1(1,2))
x2(1,3)=x1(1,3)+(d0/d1)*(x2(1,3)-x1(1,3))
if(t>T_trans) then
lam=lam+log(d1/d0)
end if
end do
lamda=lam/((MaxT-T_trans-1))/h
write(10,*) b,lamda
end do
close(10)
end program main

李雅普诺夫指数谱
Rossler系统模型

matlab
clear;
yinit=[1,1,1];
orthmatrix=[1 0 0;
0 1 0;
0 0 1];
a=0.15;
b=0.20;
c=10.0;
y=zeros(12,1);
y(1:3) = yinit;
y(4:12) = orthmatrix;
tstart = 0;
tstep = 1e-3;
wholetimes = 1e5;
steps = 10;
iteratetimes = wholetimes/steps;
mod = zeros(3,1);
lp = zeros(3,1);
Lyapunov1 = zeros(iteratetimes,1);
Lyapunov2 = zeros(iteratetimes,1);
Lyapunov3 = zeros(iteratetimes,1);
for i=1:iteratetimes
tspan = tstart:tstep:(tstart+tstep*steps);
[T,Y] = ode45(@(tspan,y) Rossler_Ly(tspan,y),tspan,y);
y=Y(size(Y,1),:);
tstart = tstart + tstep*steps;
y0=[y(4) y(7) y(10);
y(5) y(8) y(11);
y(6) y(9) y(12)];
y0=ThreeGS(y0);
mod(1) = sqrt(y0(:,1)'*y0(:,1));
mod(2) = sqrt(y0(:,2)'*y0(:,2));
mod(3) = sqrt(y0(:,3)'*y0(:,3));
y0(:,1) = y0(:,1)/mod(1);
y0(:,2) = y0(:,2)/mod(2);
y0(:,3) = y0(:,3)/mod(3);
lp = lp+log(abs(mod));
Lyapunov1(i) = lp(1)/(tstart);
Lyapunov2(i) = lp(2)/(tstart);
Lyapunov3(i) = lp(3)/(tstart);
y(4:12) = y0';
end
i=1:iteratetimes;
plot(i,Lyapunov1,Lyapunov2,Lyapunov3);
Le1=Lyapunov1(end),Le2=Lyapunov2(end),Le3=Lyapunov3(end)
title('Lyapunov 指数谱图')
function dX = Rossler_Ly(t,X)
a=0.15;
b=0.20;
c=10.0;
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)];
dX=zeros(12,1);
dX(1) = -y-z;
dX(2) = x+a*y;
dX(3) = z*(x-c)+b;
Jaco=[0 -1 -1;
1 a 0;
z 0 x-c];
dX(4:12) = Jaco*Y;
end
function A = ThreeGS(V)
v1 = V(:,1);
v2 = V(:,2);
v3 = V(:,3);
a1 = zeros(3,1);
a2 = zeros(3,1);
a3 = zeros(3,1);
a1 = v1;
a2 = v2-((a1'*v2)/(a1'*a1))*a1;
a3 = v3-((a1'*v3)/(a1'*a1))*a1-((a2'*v3)/(a2'*a2))*a2;
A=[a1,a2,a3];
end

fortran
python
Lorenz系统模型

Lorenz模型(sun2009文章)

Lorenz系统族模型

module head
implicit none
real(kind=8), parameter :: aa=10.0D0, bb=100.0D0, cc=-5.75D0, dt=0.001D0
integer(kind=4), parameter :: st=1e5,n=1e6
integer(kind=4), parameter :: m=3
contains
subroutine initial(in)
implicit none
real(kind=8), dimension(m) :: in
call random_seed()
call random_number(in)
end subroutine
subroutine fnf1(in,out)
implicit none
real(kind=8), dimension(m) :: in, out
out(1)=dt*(aa*(in(2)-in(1)))
out(2)=dt*(-cc*in(2)-in(1)*in(3))
out(3)=dt*(in(1)*in(2)-bb)
end subroutine
subroutine fnf2(in,out,jj)
implicit none
real(kind=8), dimension(m,m) :: in, out
real(kind=8), dimension(m,m) :: jj
integer(kind=4) :: i
out=dt*matmul(jj,in)
end subroutine
end module
program main
use head
implicit none
integer(kind=4) :: step,i,j,ii
real(kind=8), dimension(m) :: fnorm, flya, fnorm1,fnorm2
real(kind=8), dimension(m) :: y,k1,k2,k3,k4
real(kind=8), dimension(m,m) :: jj,w,v,k11,k22,k33,k44
real(kind=8), external ::funcdj
real(kind=8), external ::funcfs
open(unit=10,file='flya.dat')
open(unit=11,file='x-y.dat')
fnorm=0.0D0
flya=0.0D0
do i=1,m,1
do j=1,m,1
if(i==j) then
w(i,j)=1.0D0
else
w(i,j)=0.0D0
end if
end do
end do
v=0.0D0
do ii=2200,2200,1
call initial(y)
do step=1,n,1
call fnf1(y,k1)
call fnf1(y+K1/2,K2)
call fnf1(y+K2/2,K3)
call fnf1(y+K3,K4)
y=y+(k1+2.0D0*k2+2.0D0*k3+k4)/6.0d0
jj(1,1)=-aa
jj(1,2)=aa
jj(1,3)=0.0D0
jj(2,1)=-y(3)
jj(2,2)=-cc
jj(2,3)=-y(1)
jj(3,1)=y(2)
jj(3,2)=y(1)
jj(3,3)=0.0D0
call fnf2(w,k11,jj)
call fnf2(w+K11/2,K22,jj)
call fnf2(w+K22/2,K33,jj)
call fnf2(w+K33,K44,jj)
w=w+(k11+2.0D0*k22+2.0D0*k33+k44)/6.0d0
do j=2,m,1
do i=1,j-1,1
w(:,j)=w(:,j)-funcdj(w(:,j),w(:,i))/funcfs(w(:,i))*w(:,i)
end do
end do
do j=1,m,1
fnorm(j)=funcfs(w(:,j))
fnorm(j)=sqrt(fnorm(j))
w(:,j)=w(:,j)/fnorm(j)
fnorm(j)=log(fnorm(j))
end do
if(step>st) then
do i=1,m,1
flya(i)=flya(i)+fnorm(i)
end do
end if
if(step>n-st) then
write(11,'(f15.9,2x,f15.9,2x,f15.9)') y(1),y(2),y(3)
end if
end do
flya=flya/(n-st)/dt
write(10,'(f15.9,2x,f15.9,2x,f15.9,2x,f15.9)') cc,flya(1),flya(2),flya(3)
end do
stop
end program
real(kind=8) function funcdj(u,v)
use head
implicit none
real(kind=8), dimension(m) :: u, v
integer(kind=4) :: i
funcdj=0.0d0
do i=1,m,1
funcdj=funcdj+u(i)*v(i)
end do
return
end function
real(kind=8) function funcfs(u)
use head
implicit none
real(kind=8), dimension(m) :: u
integer(kind=4) :: i
funcfs=0.0d0
do i=1,m,1
funcfs=funcfs+u(i)*u(i)
end do
return
end function


