Henon映射

本文展示了如何使用Matlab编程语言通过Henon映射算法生成一系列二维散点图,展示了参数a和b的变化对序列x(n)的影响,揭示了当参数超出一定范围时可能出现的混沌行为。

Henon映射的数学表示为:

 

clear,clc
%% when a =0.5,b=0.05
a = 0.5;
b = 0.05;
x(1) = 0;
y(1) = 0;
for i = 2:2000
    x(i) = y(i-1) - a*x(i-1)^2 +1;
    y(i) = b.*x(i-1);
end
subplot(2,2,1)
scatter(x,y)
txt = {'a = 0.5','b= 0.05'};
text(0.1,0.04,txt)

set(gca,'xlim',[min(x),max(x)])
xlabel('n');
ylabel('x(n)');
%% when a=1,b=0.05
a = 1;
b = 0.05;
x(1) = 0;
y(1) = 0;
for i = 2:2000
    x(i) = y(i-1) - a*x(i-1)^2 +1;
    y(i) = b.*x(i-1);
end
subplot(2,2,2)
scatter(x,y)
txt = {'a = 1','b= 0.05'};
text(0,0.04,txt)

set(gca,'xlim',[min(x),max(x)])
xlabel('n');
ylabel('x(n)');
%% when a=1.2,b=0.1
a = 1.2;
b = 0.1;
x(1) = 0;
y(1) = 0;
for i = 2:2000
    x(i) = y(i-1) - a*x(i-1)^2 +1;
    y(i) = b.*x(i-1);
end
subplot(2,2,3)
scatter(x,y)
txt = {'a = 1.2','b= 0.1'};
text(-0.2,0.08,txt)

set(gca,'xlim',[min(x),max(x)])
xlabel('n');
ylabel('x(n)');
%% when a=1.4,b=0.3
a = 1.4;
b = 0.3;
x(1) = 0;
y(1) = 0;
for i = 2:2000
    x(i) = y(i-1) - a*x(i-1)^2 +1;
    y(i) = b*x(i-1);
end
subplot(2,2,4)
scatter(x,y)
txt = {'a = 1.4','b= 0.3'};
text(-1,0.2,txt)

set(gca,'xlim',[min(x),max(x)])
xlabel('n');
ylabel('x(n)');

结果:

Henon映射是一种在二维平面上定义的离散动力系统,由法国数学家米歇尔·埃诺(Michel Hénon)于1976年提出。它最初是作为对洛伦兹吸引子的一种简化模型而引入的,目的是为了研究混沌行为。Henon映射的定义形式简单,但其动力学行为却非常复杂,尤其在某些参数取值下能够展现出典型的混沌特性。 Henon映射的数学表达式如下: $$ x_{n+1} = 1 - a x_n^2 + y_n $$ $$ y_{n+1} = b x_n $$ 其中,$x_n$ 和 $y_n$ 是第 $n$ 次迭代的状态变量,$a$ 和 $b$ 是控制系统的参数。当 $a = 1.4$,$b = 0.3$ 时,系统进入混沌状态,并生成具有强随机性的混沌序列[^1]。 Henon映射的基本原理可以理解为一个非线性二次映射与线性缩放的结合。在每次迭代中,$x_{n+1}$ 的值依赖于当前 $x_n$ 的平方项,这导致了系统的非线性特性;而 $y_{n+1}$ 则是对 $x_n$ 的线性缩放和传递,从而保持了系统的二维特性。这种结构使得Henon映射能够在简单的数学形式下展现出复杂的动力学行为,包括周期轨道、准周期轨道以及混沌吸引子。 通过数值模拟可以观察到,当参数 $a$ 和 $b$ 取不同值时,Henon映射的轨迹会呈现出不同的行为。例如,当 $a$ 在一定范围内变化时,系统可能会经历从稳定不动点到周期倍增再到混沌的转变过程。这种行为可以通过绘制分岔图来直观展示,其中横轴表示参数 $a$ 的取值,纵轴则显示了系统在不同 $a$ 值下的稳定状态值。 此外,Henon映射的混沌特性也可以通过计算李雅普诺夫指数(Lyapunov Exponent)来量化。李雅普诺夫指数反映了系统轨迹对初始条件的敏感程度,正的李雅普诺夫指数意味着系统具有混沌行为。对于Henon映射,通常会计算两个李雅普诺夫指数,分别对应于 $x$ 和 $y$ 方向上的平均指数增长率。当其中一个李雅普诺夫指数为正值时,表明系统处于混沌状态[^4]。 ### Henon映射的实现 Henon映射可以通过简单的编程语言实现,以下是使用MATLAB实现Henon映射的一个示例代码: ```matlab % Henon映射的MATLAB实现 x(1) = rand; % 初始值 y(1) = rand; a = 1.4; b = 0.3; for i = 2:2000 x(i) = 1 + y(i-1) - a * x(i-1)^2; y(i) = b * x(i-1); end % 绘制混沌序列图 figure; plot(x, '.'); xlabel('维度'); ylabel('混沌值'); % 绘制直方图 figure; hist(x); xlabel('混沌值'); ylabel('频数'); ``` 该代码首先初始化了状态变量 $x$ 和 $y$,并设定了参数 $a$ 和 $b$ 的值。然后,通过循环迭代生成Henon映射的轨迹,并绘制出混沌序列及其直方图以展示其分布特性。 ### Henon映射的分岔图 为了进一步分析Henon映射的动力学行为,可以绘制其分岔图。以下是一个用于生成Henon映射分岔图的MATLAB代码示例: ```matlab % Henon映射的分岔图MATLAB实现 clc; clear all; close all; x0 = 0.1; y0 = 0.2; b = 0.3; n = 850; t = 800; hold on; for a = 0:0.002:1 x(1) = 1 + y0 - a * x0^2; y(1) = b * x0; for i = 2:n x(i) = 1 + y(i-1) - a * x(i-1)^2; y(i) = b * x(i-1); end xn = x(t+1:n); pause(0.1); plot(a, xn, 'r.', 'Markersize', 2); end xlabel('a'); ylabel('x'); set(gca, 'XLim', [0 1]); set(gca, 'XTick', [0:0.2:1]); set(gca, 'YLim', [-1.5 1.5]); set(gca, 'YTick', [-1.5:0.5:1.5]); ``` 这段代码通过改变参数 $a$ 的值,计算出不同 $a$ 下的系统状态,并将最后若干次迭代的结果绘制出来,形成分岔图。通过观察分岔图,可以看到系统从稳定状态逐渐过渡到混沌状态的过程。 ### Henon映射的李雅普诺夫指数 为了量化Henon映射的混沌特性,可以计算其李雅普诺夫指数。以下是一个用于计算Henon映射李雅普诺夫指数的MATLAB代码示例: ```matlab % Henon映射的李雅普诺夫指数计算 clc; close all; clear all; N = 1000; a = (0:0.001:1.4)'; b = 0.3; na = length(a); LE1 = zeros(na, 1); LE2 = zeros(na, 1); x = 0.2; y = 0.3; for i = 1:na LCEvector = zeros(2, 1); Q = eye(2); for j = 1:N xprev = x; yprev = y; x = 1 - a(i) * xprev^2 + yprev; y = b * xprev; Ji = [-2 * a(i) * x, 1; b, 0]; B = Ji * Q; [Q, R] = qr(B); LCEvector = LCEvector + log(diag(abs(R))); end LE = LCEvector / N; LE1(i) = LE(1); LE2(i) = LE(2); end figure(1); plot(a, LE1, 'g', 'linewidth', 1); hold on; plot(a, LE2, 'b', 'linewidth', 1); set(gca, 'XLim', [0 1.4]); set(gca, 'YLim', [-2 1]); legend('\lambda1', '\lambda2'); hold on; plot([0 1.4], [0 0], 'k--', 'linewidth', 1); hold off; xlabel('a'); ylabel('LE'); set(gca, 'fontsize', 10); ``` 此代码通过QR分解方法计算Henon映射的两个李雅普诺夫指数,并绘制出它们随参数 $a$ 变化的曲线。正的李雅普诺夫指数表明系统具有混沌行为。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值