简介:《混沌在保密通信系统中的应用研究》是一篇面向通信、信息安全及非线性系统方向学习者的毕业论文文档,适合用于了解混沌保密通信的理论框架、关键技术及电路仿真思路。全文围绕混沌保密通信的起源与发展、驱动—响应式Chua电路混沌同步的自保持特性,以及Chua电路参数与元件值关系展开,并借助Multisim验证混沌现象,对同步误差、噪声干扰等实用化问题亦有讨论。压缩包共1个doc文件,大小约1.96MB,内容为完整论文正文,便于按摘要、绪论、同步分析与仿真等章节查阅。目前已有206人学习,可为相关课程论文写作、混沌同步方案调研和电路仿真入门提供较具体的参考。
1. 从一份论文切入:混沌保密通信到底卡在哪一步
把 Chua 电路画在纸上只要四个储能元件加一个分段线性负阻,可真正让混沌保密通信从论文里的漂亮相图变成能跑起来的东西,中间隔着的从来不是方程,而是同步。这份《混沌在保密通信系统中的应用研究》做的事很具体:它讲清楚了驱动-响应式 Chua 电路混沌同步的自保持特性,回答了一个工程上绕不开的问题——同一条信道里明文信息和同步控制信号怎么一起走;它又把电路方程参数和电阻、电容、电感的取值对应起来,让人拿到一组元件值就能先判断会不会出混沌,最后用 Multisim 把相图跑出来做验证。做混沌电路仿真、想搭同步链路的人能直接用,被「相图看着像混沌但说不清为什么」困住的人也能对上号。
2. Chua 电路方程与元件值:四个元件怎么压成三个参数
Chua 电路最容易被低估的地方是它「看起来只有几个元件」。电阻一个、电容两个、电感一个、非线性负阻一个,按常理这种规模的东西应该一眼看穿。实际搭起来才发现,电阻 R 这个单一旋钮同时改了三个无量纲参数,任何一个环节的容差都会让相图从双涡卷变成单涡卷甚至周期一。很多人拿着报告里的元件清单直接焊、直接仿真,出来一张歪七扭八的图就开始怀疑自己接错了线,其实是不清楚参数和元件之间那层映射关系。
2.1 从电路方程到无量纲形式
先看原始电路方程,这是所有后续推导的地基。非线性负阻记作 g(v1),它是一个分段线性电导:
C1 · dv1/dt = (v2 - v1)/R - g(v1) C2 · dv2/dt = (v1 - v2)/R + iL L · diL/dt = -v2这三行看着干净,但量纲混乱,直接做数值仿真会因为变量跨度差几个数量级而步长失控。标准做法是做归一化:取折点电压 Bp 作电压标度,取 τ = t/(R·C2) 作时间标度,令
x = v1/Bp, y = v2/Bp, z = iL·R/Bp代回原方程整理之后得到无量纲形式:
dx/dτ = α·(y - x - f(x)) dy/dτ = x - y + z dz/dτ = -β·y其中 f(x) 是分段线性函数,用绝对值形式写最方便:
f(x) = m1·x + 0.5·(m0 - m1)·(|x + 1| - |x - 1|)这一步做完,三个物理量被压成了三组无量纲参数。它们和元件值的对应关系是整份报告里最值钱的一张表,也是判断「这堆元件能不能出混沌」的唯一入口:
| 无量纲参数 | 由哪些元件决定 | 一组可用取值 | 调大之后发生什么 |
|---|---|---|---|
| α | C2 / C1 | 10(C1=10nF, C2=100nF) | 改变 x 通道的时间尺度,过大使相图横向拉伸、失稳 |
| β | R²·C2 / L | 14.87(R=1.64kΩ, C2=100nF, L=18mH) | 主控振荡频率,过小退化为周期振荡,过大轨迹发散 |
| m0 | R·G_a(负阻外段电导) | -1.143 | 外段斜率,直接决定涡卷外侧的收敛快慢 |
| m1 | R·G_b(负阻内段电导) | -0.714 | 内段斜率,决定中心区域是排斥还是吸引 |
这张表最需要盯住的是最后两行。α 只跟两个电容的比值有关,跟 R 完全无关;而 β、m0、m1 三个参数里全都有 R。也就是说,当你把 R 从 1.64kΩ 拧到 1.91kΩ,β 从 14.87 涨到大约 20,同时 m0 和 m1 还按比例被放大。这不是「调一个参数看一个现象」,而是三个参数同向漂移,相图的变化自然就不是线性的。我在第一次复现时按别人的清单固定了 R,只改 C1 想找分岔点,结果怎么扫都没有干净的分岔序列,后来才反应过来方向从一开始就错了——该扫的是 R,因为只有它同时推动三个参数。
提示:把 m0、m1 写成 R·G 的形式,是因为 f(x) 里那一步除以 Bp 之后,非线性电阻的电导被 R 归一化了。所以负阻电路本身不改,只改 R,折线的斜率也会跟着变。这是 Chua 电路参数敏感性的根源,也是它不适合「照着元件清单抄」的原因。
2.2 判混沌的三个层次:相图、庞加莱截面、李雅普诺夫指数
手里有了参数,下一个问题是「怎么才算混沌」。这里翻车的概率比搭电路还高,因为「看起来乱」和「真的是混沌」是两件事。
第一层是相图。把 x-y 投影画出来,双涡卷结构是最直观的证据。但相图的欺骗性很强:一条周期很长的周期轨道投影出来同样是一团乱麻,数值发散时的轨迹也会把画面填满。单靠相图下结论,等于只看了一眼就签字。
第二层是庞加莱截面。在相空间里取一个平面(比如 x=0 且 dx/dτ>0),记录轨迹每次穿越的落点。周期运动在截面上留下有限个点,混沌运动留下一条具有分形结构的点集,准周期运动留下一条闭合曲线。这一层的判别力比相图强得多,实现成本也不高——数值仿真时每步检查穿越条件,把落点存下来即可。
第三层是李雅普诺夫指数谱。最大指数大于零是混沌的严格判据,这个条件不满足,前面两层看到的都只能叫「疑似」。工程上一般只算最大指数,用 Benettin 的重归一化方法,几百行以内的代码就能搞定,第 6 章会给一份可以直接跑的版本。
三层的关系是递进的:相图负责快速筛选(一眼排除掉明显周期的),庞加莱截面负责区分周期与混沌,李雅普诺夫指数负责盖章。跳过前两层直接算指数当然也可以,但算之前你得先知道参数大概落在哪个区间,否则指数谱扫出来的曲线你也不知道该往哪儿看。
2.3 用参数扫描替代手工试凑
既然 R 一个旋钮带动三个参数,手工试凑的效率低得可怕。我一般的做法是写一个扫描脚本,固定 C1、C2、L,让 R 从 1.5kΩ 走到 2.0kΩ,每 10Ω 取一个点,对每个点跑一段数值积分,输出最大李雅普诺夫指数的符号和相图的粗略特征。
import numpy as np def f(x, m0=-1.143, m1=-0.714): # 分段线性负阻的无量纲形式,绝对值写法避免分段判断 return m1 * x + 0.5 * (m0 - m1) * (abs(x + 1) - abs(x - 1)) def chua(state, alpha, beta, m0=-1.143, m1=-0.714): x, y, z = state return np.array([ alpha * (y - x - f(x, m0, m1)), x - y + z, -beta * y ]) def rk4(state, dt, alpha, beta): # 定步长四阶龙格库塔,dt 建议不超过 0.005 k1 = chua(state, alpha, beta) k2 = chua(state + 0.5 * dt * k1, alpha, beta) k3 = chua(state + 0.5 * dt * k2, alpha, beta) k4 = chua(state + dt * k3, alpha, beta) return state + dt * (k1 + 2 * k2 + 2 * k3 + k4) / 6 def lyapunov(state0, alpha, beta, dt=0.005, steps=120000, d0=1e-8, transient=20000): # Benettin 重归一化:每步把扰动轨道拉回 d0,累加对数增长率 s = np.array(state0, dtype=float) for _ in range(transient): s = rk4(s, dt, alpha, beta) sp = s + np.array([d0, 0.0, 0.0]) acc = 0.0 for _ in range(steps): s = rk4(s, dt, alpha, beta) sp = rk4(sp, dt, alpha, beta) diff = sp - s dist = np.linalg.norm(diff) acc += np.log(dist / d0) sp = s + diff * (d0 / dist) # 重归一化,防止扰动溢出线性区 return acc / (steps * dt) C1, C2, L = 10e-9, 100e-9, 18e-3 alpha = C2 / C1 for R in np.arange(1500, 2001, 10): beta = R**2 * C2 / L lam = lyapunov([0.1, 0.0, 0.0], alpha, beta) print(f"R={R:5.0f} beta={beta:6.2f} lambda_max={lam:+.4f}")这段代码的逻辑是:外层扫 R,每个 R 换算出 β,内层用 RK4 积分 Chua 方程,同时用两条初始相距 1e-8 的轨道测分离速率,每步重新归一化并累加 log 值,最后除以总时长得到最大李雅普诺夫指数。三个参数需要说明一下:dt=0.005是无量纲时间步长,对应实际时间约 dt·R·C2,取 0.005 能保证 RK4 稳定;d0=1e-8是扰动幅度,太大就跳出线性响应区,太小会被双精度浮点的舍入误差吃掉;transient=20000是丢弃的暂态步数,不丢弃的话前几百步的瞬态会把指数拉偏。
跑完之后你会看到一条符号变化的曲线:λ 为负的区间是周期或稳定不动点,λ 转正之后进入混沌。曲线从负到正的那一段,就是分岔点附近,也正是相图从规则走向双涡卷的位置。这张表比任何一张相图都有说服力,因为它给出的是「稳不稳定」,而不是「好不好看」。
2.4 报告里标注的两个工作点,为什么不能照抄
原始材料里给了两个工作点:R=1.91kΩ 标注单涡卷,R=1.8kΩ 也标注单涡卷。这里的标注差异本身就是个信号——两个 R 值差了 0.11kΩ,β 一个约 20、一个约 18,都落在常见的双涡卷区间内,标成单涡卷要么是笔误,要么是当时用的折点电压 Bp 与常规值不同导致 m0、m1 的归一化基准不一样。
血泪经验是:任何人给你的工作点都只能当「起点」,不能当「终点」。Bp 由负阻电路的电源电压和分压电阻决定,运放的饱和特性会让折点偏移几十毫伏,m0、m1 跟着变;电容的实际容差常见 ±10%,C1 和 C2 的比值直接决定 α,两个 10% 叠起来 α 可能从 10 跑到 12。这些偏差单个看都不大,凑在一起足够把双涡卷推成单涡卷。稳妥的做法是把 R 做成可调电阻,从 1.5kΩ 开始往上拧,边拧边看相图,记录自己这套元件真正的工作区间。
3. 驱动-响应同步与自保持特性:一条信道怎么同时跑明文和同步信号
混沌保密通信的整套逻辑都压在同步上。发送端产生混沌载波,把信息藏进去,接收端必须产生一个一模一样的副本才能把信息减出来。副本从哪来?从信道里传过来的信号里来。于是就出现了一个死结:同步需要信号,解密也需要信号,可信道只有一条,带宽和信噪比都是有限的。这份材料提出的自保持特性,本质上就是在解这个死结。
3.1 驱动-响应同步的最小结构
驱动-响应法(也叫 PC 同步)的思路非常朴素:把发送端系统拆开,拿其中一个状态变量当驱动信号送到接收端,接收端用这个信号替换掉自己对应的那个变量,剩下的变量自然演化。以 Chua 电路为例,发送端是完整的 (x1, y1, z1),接收端只有 (y2, z2),它的 x 分量被强制钳在 x1 上:
dy2/dτ = x1 - y2 + z2 dz2/dτ = -β·y2注意响应端没有自己的 x 方程了,x2 恒等于 x1。这就是「驱动」两个字的含义:接收端不再自己决定 x,而是被发送端的 x 拖着走。
能否同步,判据是条件李雅普诺夫指数。把误差 e = (y2-y1, z2-z1) 写成线性化方程,e 的演化矩阵的特征值决定误差是衰减还是放大。只有当条件李雅普诺夫指数全为负,误差才会指数收敛,同步才成立。这个条件对参数很苛刻:α、β、m0、m1 在收发两端必须严格一致,任何一端偏了,误差就收敛不到零。
实际做的时候不会去解析求特征值,而是直接数值验证:给收发两端设置完全不同的初始条件(比如 x1 从 0.1 出发,y2、z2 从 3.0 出发),跑一段时间看误差 e 的对数曲线是不是一条向下的直线。向下说明指数收敛,同步成立;走平说明只是有界;向上说明发散。
3.2 自保持特性解决了什么问题
传统做法里,同步信号和密文是分时或分频传的。分时就是先发一段纯同步信号让接收端锁定,再发密文,发一段时间后再插一段同步信号校正。这套机制的问题很明显:同步信号占带宽,而且一旦信道出现突发干扰导致失锁,接收端要等下一个同步段才能恢复,这期间传的信息全丢。
自保持特性的思路是:同步控制信号 U 和密文 C 叠加在同一条信道上一起发,接收端从混合信号里先分离出 U 完成同步,再用同步产生的副本解出 C。因为 U 本身也是混沌的,它和 C 在统计特性上没有明显区别,第三方即使截获了整条信道的内容,也很难从混合信号里把 U 单独剥离出来逆推电路结构。
这里有个关键点容易被忽略:U 不是密钥,或者说不是唯一的密钥。就算对方完整拿到了 U,他能做的也只是驱动一个结构未知的响应系统。混沌电路的参数敏感性在这里变成了防御优势——网络结构和元件参数的微小差异会让副本完全对不上,解出来的就是噪声。这跟传统分组密码「拿到密钥就全丢」的模型不一样,它把安全性分散到了结构未知性上。
3.3 收发端的时序怎么排
把自保持结构落到具体流程,大概是这么几步。第一步,发送端上电后先让驱动电路自由演化一段,等轨迹进入吸引子(跳过暂态),这一步不发任何东西。第二步,把驱动信号 U 和加密后的密文 C 按比例叠加,通过同一信道发出。第三步,接收端收到混合信号后先做同步,用响应系统的输出构造解密副本。第四步,用接收信号减去副本,得到恢复的明文。
每一步都有几个必须定下来的量:
| 环节 | 关键量 | 典型处理 | 出问题的表现 |
|---|---|---|---|
| 暂态跳过 | 预热时长 | 至少 200 个无量纲时间单位 | 一上电就发,前几十个符号全错 |
| 信号叠加 | U 与 C 的幅度比 | C 控制在 U 峰值的 1%~5% | 比例过大,接收端直接失锁 |
| 同步建立 | 收敛判据 | 误差 e 降到初值的 1e-3 以下 | 判据太松,后面解出来全是毛刺 |
| 失锁重捕 | 重同步触发条件 | 误差连续 N 步超阈值 | 不设重捕,失锁后永久失效 |
信息幅度这一行是整套方案最脆弱的地方。混沌掩盖要求信息信号足够小,小到不足以把接收端的轨迹推出同步域。这跟通信里「信号要足够强才能抗噪」的直觉正好相反,是混沌保密通信一个反直觉的工程约束。幅度压得小,抗噪能力就弱;幅度放大,同步就崩。中间那段可用窗口需要自己实测。
3.4 混沌掩盖的幅度边界怎么测
不要靠公式估,直接扫。固定一组收发参数,让信息幅度从载波峰值的 0.5% 开始,每次加 0.5%,每个幅度跑足够长的序列,统计恢复信号的误码率。误码率从 0 跳起来那个点就是边界。
我一般会在这个扫描里额外记录同步误差的收敛曲线。原因是误码率跳变往往不是渐变的,而是突然从 0 跳到 0.3 以上——中间没有过渡带。这说明系统在某个临界幅度上直接失稳,而不是逐渐劣化。知道这一点很重要:它意味着工程上没有「稍微降一点质量换一点余量」的操作空间,只能把工作点放在边界以下足够远的地方,留足余量。
4. Multisim 复现路径:负阻、相图与参数扫描
数值仿真跑通不等于电路能出混沌。中间隔着一层非理想性:运放不是理想的、电感有直流电阻、电容有容差、面包板有分布参数。Multisim 的价值在于它比实物快得多,又比纯数值模型更接近真实元件,是这两者之间的过渡带。
4.1 分段线性负阻怎么搭
Chua 电路里唯一需要自己搭的模块就是那个非线性负阻。常见做法是用两个运放构成模拟负阻,再用二极管做折点限幅,得到三段折线的伏安特性。
具体元件清单和取值大致是这样:运放选通用双运放(GBW 不低于 10MHz),供电 ±15V;第一级做负阻抗变换,把正电阻变成负电阻;第二级做限幅,用两个二极管背靠背加偏置,让伏安特性在 |v| 超过折点 Bp 之后斜率发生跳变。折点电压由分压电阻设定,典型 1V 左右。
一个容易踩的细节是负阻的方向。模拟负阻本质上是一个正反馈回路,接反了不会出混沌,会直接锁死在一个直流工作点上,示波器上就是一条水平线。判断方法很简单:单独给负阻加一个锯齿波激励,用 XY 模式看它的伏安曲线,应该是中间一段陡峭负斜率、两侧缓斜率的折线。如果看到的是一条斜率为正的直线,那就是接反了。
4.2 瞬态分析和相图的观测设置
Multisim 里看相图靠的是 Grapher 的 XY 模式,前提是先把两个节点电压都采下来。推荐用瞬态分析(Transient Analysis)而不是交互式仿真,因为前者可以精确控制步长和时长。
设置上有三个参数必须调:最大时间步长设成 1e-6 秒(比最快的动态过程小一个数量级),仿真总时长设 0.05 秒(足够跑完暂态进入吸引子),起始输出时间设 0.02 秒(丢掉前 40% 的暂态数据)。步长设大了,相图上的轨迹会变成锯齿状的折线;起始时间不丢,相图里会混进从初值冲向吸引子的那一段直线,看起来像是多出来一个涡卷。
想看分岔序列,用参数扫描(Parameter Sweep)扫 R,从 1.5kΩ 到 2.0kΩ,步长 10Ω,每个点输出一张相图。扫完之后排成一排看,能清楚看到从单周期到倍周期再到双涡卷的整条路径。这条路径是判断电路工作是否正常的金标准——如果扫出来的序列跳过了倍周期直接乱掉,那多半是某个元件接错了或者运放饱和了。
4.3 两个非理想因素:电感内阻和运放带宽
电感的直流电阻(DCR)是最容易被忽略的一项。理论推导里 L 是纯电感,实际上一个 18mH 的小电感 DCR 可能有几十欧,串在回路里等效于改变了 β。修正的方法是把 DCR 并入方程重新算一遍:β 的实际值是 R²·C2/(L + R·DCR/…),更简单的做法是直接把 DCR 折算成一个串联电阻,重新跑一遍数值仿真确认混沌区间,再回到 Multisim 里把 DCR 填进电感模型。
运放带宽的影响更隐蔽。折点附近本来应该是锐利的斜率跳变,但运放的压摆率和增益带宽积有限,实际折点会被圆滑掉,等效于 m0、m1 之间多了一段过渡区。过渡区太宽,相图上的涡卷边缘会变得模糊,严重时干脆不出涡卷。选运放时看两个指标:GBW 至少 10MHz,压摆率至少 10V/μs。这两个指标不够,后面怎么调参数都是白费劲。
| 非理想因素 | 影响哪个参数 | 现象 | 处理办法 |
|---|---|---|---|
| 电感 DCR | β 偏小 | 混沌区间整体左移,原工作点变周期 | 电感模型里串入实测 DCR,重算 β |
| 电容容差 ±10% | α 偏移 | 两个涡卷大小不对称 | 用 1% 精度电容,或实测后代入 |
| 运放 GBW 不足 | m0、m1 折点圆滑 | 涡卷边缘模糊、双涡卷退化为单涡卷 | 换 GBW ≥ 10MHz 的运放 |
| 电源内阻 | 折点电压 Bp 漂移 | m0、m1 整体偏移 | 负阻电路单独稳压供电 |
5. 排查清单:五个让结论「看起来成立」的坑
这一章是按现象倒推的。混沌电路和同步系统有个共同特点:失败的时候往往不是报错,而是给你一个看起来合理的错误结果。下面五条都是我自己或者身边人真实撞过的,按「现象 → 原因 → 解决」写。
5.1 相图填满了整个屏幕,但其实是发散
现象:仿真跑出来的 x-y 图占满整个绘图区,轨迹密密麻麻,第一眼很像混沌。
原因:数值发散。RK4 用固定步长时,如果 dt 选得太大,积分过程会持续注入虚假能量,轨迹幅值单调增长直到撞上运放的电源轨。这时候画出来的「吸引子」其实是被 ±15V 削顶后的方波投影,边界整齐得不自然。
解决:把纵轴改成对数坐标看幅值随时间的变化,正常混沌的幅值应该稳定在一个有界范围内来回振荡,发散的幅值会持续爬升。同时把 dt 减半再跑一遍,如果相图形态明显变化,说明原来的步长不够。判据是:dt 减半后结果基本不变,才算收敛。
5.2 按报告里的 R 值搭,出来的是另一种涡卷
现象:严格按材料里的元件清单和 R 值搭,相图是一个完整的大涡卷,不是双涡卷。
原因:R 同时影响 β、m0、m1 三个参数,而 m0、m1 的实际值还取决于负阻电路的折点电压 Bp,Bp 又取决于你的运放供电和分压电阻。别人的 Bp 和你的 Bp 差 10%,m0、m1 就整体偏 10%,同一个 R 值落到的动力学区域完全不同。
解决:不要固定 R,把 R 换成可调电阻,从低往高扫,边扫边看相图,记录自己这套硬件的实际分岔点。同时先单独测一次负阻的伏安曲线,量出真实的折点电压,代入 m0 = R·G_a 重新算一遍预期值,心里有个数再去调。
5.3 收发波形「看起来一样」,但误码率居高不下
现象:示波器上发送端和接收端的波形几乎完全重合,可恢复出来的明文错误率超过 20%。
原因:假同步。两条轨迹可能只是同向运动而误差并没有收敛到零,或者干脆是初值选得恰好接近导致的短期贴合。只看时域波形看不出区别,因为混沌信号本身就是宽带的,几十毫伏的误差在波形上完全看不见。
解决:画同步误差 e(t) 的半对数曲线,看它是不是一条斜率恒定的下降直线。再换十组随机初值重复实验,每一组都收敛才算真同步。如果只有部分初值收敛,说明参数落在同步域的边界上,工作点不可靠。
5.4 加密之后接收端能同步,但解不出信息
现象:不加信息时同步良好,一旦把明文叠加到载波上,接收端误差立刻跳起来,恢复信号全是噪声。
原因:信息幅度超过了同步的鲁棒域。混沌掩盖对扰动极其敏感,叠加的信号等效于给驱动通道加了噪声,幅度一过阈值,响应系统的轨迹就被推出收敛域。
解决:把信息幅度降到载波峰值的 1% 以内重新测,确认能解出来之后再逐步往上加,找到误码率跳变的临界点,工作点定在临界点的 60% 以下。如果 1% 都解不出来,那问题不在幅度,回去查收发两端的 α、β 是否严格一致——这种参数不匹配导致的失锁,症状和幅度过大几乎一样。
5.5 理想仿真能出混沌,加上寄生参数就只剩周期
现象:数值仿真和 Multisim 理想模型都能跑出漂亮的双涡卷,把电感 DCR 和运放带宽填进去之后,相图缩成一个闭合环。
原因:两个非理想因素都在削弱非线性强度。DCR 让 β 偏移,运放带宽让折点变圆滑,两者叠加等效于把系统从混沌区推回了周期区。
解决:先单独修一个因素再修另一个,不要同时改。先把 DCR 加进去,重新扫 R 找新的混沌区间;确认能出涡卷之后再加运放带宽限制,再扫一遍。两次扫描的区间取交集,那才是这套硬件真正能用的工作范围。这个交集通常比理想情况窄很多,要有心理准备。
6. 数值交叉验证:用李雅普诺夫指数给相图结论上保险
第 2 章那个扫描脚本只算了最大指数,够用但不够细。真正做验证的时候我会再补一步:把驱动-响应同步的误差收敛也数值化,两件事一起做,互相印证。
同步误差的验证很直接。驱动系统跑完整的 Chua 方程,响应系统只保留 y、z 两个状态,x 被钳在驱动信号上,然后看误差范数的对数随时间的变化:
def sync_error(x1_traj, y2_0=3.0, z2_0=-2.0, alpha=10.0, beta=14.87, dt=0.005): # 响应系统:x 被驱动信号钳制,只有 y、z 自由演化 y2, z2 = y2_0, z2_0 y1, z1 = x1_traj[0][1], x1_traj[0][2] # 用驱动端初值算误差起点 err = [] for x1, yy1, zz1 in x1_traj: dy2 = x1 - y2 + z2 dz2 = -beta * y2 y2 += dt * dy2 z2 += dt * dz2 err.append(np.hypot(y2 - yy1, z2 - zz1)) return np.array(err)这段的关键在于响应端没有 dx 方程,x1 直接来自驱动轨迹,这正是驱动-响应法的定义。y2_0、z2_0故意设得离驱动端很远,是为了让误差从一个大值开始收敛,半对数图上的斜率才有意义。如果斜率是负的常数,同步成立;斜率在零附近摆动,说明只是有界同步;斜率为正,失锁。
两套数值结果要对得上。李雅普诺夫指数告诉你参数在不在混沌区,同步误差收敛告诉你这组参数能不能用来通信。有时候会遇到指数为正但同步不收敛的情况——这说明系统确实是混沌的,但驱动变量选错了,换一个状态变量(比如改用 y 驱动)往往就好了。这个「换驱动变量」的操作在文献里提得不多,但线性化矩阵的特征值确实跟选哪个变量强相关,值得在实验里试一遍。
还有一点是误差收敛速度。同样的参数,有的组合几十个时间单位就收敛到 1e-8,有的要几百个。收敛慢意味着同步建立时间长,接收端要等更久才能开始解密,等效于损失了带宽。工程上一般要求收敛时间控制在总帧长的十分之一以内,超过这个数,同步开销就吃掉太多有效载荷了。
从那以后我每次拿到一组新的 Chua 参数,都会强制走一遍「指数定区、误差验同步、换驱动变量对比」这三步,不管相图看起来多漂亮。相图是最容易骗人的一层,而指数和误差曲线不会。希望帮到你。
本文还有配套的精品资源,点击获取