跳转至

模糊控制作业

2639 个字 484 行代码 预计阅读时间 16 分钟

理论证明与说明

(1) 证明模糊集合运算满足对偶律

对偶律为:

\(\overline{A \cup B} = \overline{A} \cap \overline{B}, \quad \overline{A \cap B} = \overline{A} \cup \overline{B}\)

证明
设论域为 \(X\),对于任意 \(x \in X\),记 \(\mu_A(x) = a\)\(\mu_B(x) = b\),其中 \(a, b \in [0,1]\)

1. 证明 \(\overline{A \cup B} = \overline{A} \cap \overline{B}\)

左边隶属度:

\(\mu_{\overline{A \cup B}}(x) = 1 - \mu_{A \cup B}(x) = 1 - \max(a, b)\)

右边隶属度:

\(\mu_{\overline{A} \cap \overline{B}}(x) = \min(1-a, 1-b)\)

现需证明:\(1 - \max(a, b) = \min(1-a, 1-b)\)
\(a \ge b\),则 \(\max(a, b) = a\)

  • 左边:\(1 - a\)
  • 右边:\(\min(1-a, 1-b) = 1-a\) ( 因为 \(a \ge b \Rightarrow 1-a \le 1-b\))
    两边相等。同理,若 \(a < b\),则 \(\max(a, b)=b\),左边为 \(1-b\),右边 \(\min(1-a, 1-b)=1-b\),亦相等。
    \(\overline{A \cup B} = \overline{A} \cap \overline{B}\) 得证。

2. 证明 \(\overline{A \cap B} = \overline{A} \cup \overline{B}\)

左边隶属度:

\(\mu_{\overline{A \cap B}}(x) = 1 - \mu_{A \cap B}(x) = 1 - \min(a, b)\)

右边隶属度:

\(\mu_{\overline{A} \cup \overline{B}}(x) = \max(1-a, 1-b)\)

现需证明:\(1 - \min(a, b) = \max(1-a, 1-b)\)
\(a \ge b\),则 \(\min(a, b) = b\)

  • 左边:\(1 - b\)
  • 右边:\(\max(1-a, 1-b) = 1-b\) ( 因为 \(1-a \le 1-b\))
    两边相等。同理可证 \(a < b\) 情形。
    \(\overline{A \cap B} = \overline{A} \cup \overline{B}\) 得证。

结论:模糊集合运算在取大 (\(\max\))、取小 (\(\min\))、补 (\(1-\mu\)) 的算子下,满足对偶律。

(2) 说明模糊集合运算不满足经典集合中的排中律和矛盾律

排中律在经典集合中表述为:\(A \cup \overline{A} = X\)(全集,即一个元素要么属于 \(A\),要么属于 \(\overline{A}\),非此即彼。

在模糊集合中,元素 \(x\) 的归属是程度的。其隶属度为:

\(\mu_{A \cup \overline{A}}(x) = \max(\mu_A(x), 1 - \mu_A(x))\)

\(\mu_A(x)\) 不取 0 1 时,该值小于 1
例如,取 \(\mu_A(x)=0.6\),则 \(\mu_{A \cup \overline{A}}(x) = \max(0.6, 0.4) = 0.6 \neq 1\)
元素 \(x\) 并不完全属于集合 \(A \cup \overline{A}\),即该集合不等于全集 \(X\)因此,模糊集合不满足排中律。


矛盾律在经典集合中表述为:\(A \cap \overline{A} = \emptyset\)(空集,即一个元素不能同时属于 \(A\) \(\overline{A}\)

在模糊集合中:

\(\mu_{A \cap \overline{A}}(x) = \min(\mu_A(x), 1 - \mu_A(x))\)

\(\mu_A(x)\) 不取 0 1 时,该值大于 0
例如,取 \(\mu_A(x)=0.5\),则 \(\mu_{A \cap \overline{A}}(x) = \min(0.5, 0.5) = 0.5 \neq 0\)
元素 \(x\) 以一定程度同时属于 \(A\) \(\overline{A}\),该交集不为空。因此,模糊集合不满足矛盾律。

无人水面艇(USV)模糊控制器设计与仿真

1. 问题描述与系统模型

根据提供的专家控制作业,无人艇航向跟踪系统的非线性动力学模型为:

\(T\ddot{\psi} + KH(\dot{\psi}) = K\delta + d(t)\)

其中:

  • \(\psi\):航向角(单位:弧度)
  • \(\dot{\psi} = r\):转艏角速度(单位:弧度 / 秒)
  • \(\delta\):舵角(控制输入,受限为 \(|\delta| \leq 0.5 \, \text{rad}\)
  • \(H(\dot{\psi}) = \alpha \dot{\psi} + \beta \dot{\psi}^3\),描述非线性转向特性
  • \(d(t) = A_d \sin(\omega_d t) + n(t)\),为环境扰动

给定参数

  • 系统:\(T = 2.0 \, \text{s}\)\(K = 0.8 \, \text{s}^{-1}\)\(\alpha = 1.0\)\(\beta = 0.5\)
  • 扰动:\(A_d = 0.1\)\(\omega_d = 0.1\)\(n(t) \sim \mathcal{N}(0, 0.01)\)
  • 初始状态:\(\psi(0) = 0.1 \, \text{rad}\)\(\dot{\psi}(0) = 0 \, \text{rad/s}\)

控制目标:设计模糊控制器,使航向 \(\psi\) 跟踪参考信号 \(\psi_{ref}(t)\)

  1. 阶跃响应\(\psi_{ref}(t) = 0.5 \cdot 1(t)\)
  2. 正弦跟踪\(\psi_{ref}(t) = 0.2 \cdot \sin(0.1t)\)

2. 常规模糊控制器设计

2.1 控制器结构设计

采用经典的二维模糊控制器结构。输入为航向跟踪误差 \(e\) 及其变化率 \(ec\),输出为控制舵角 \(\delta\)

  • 误差:\(e(t) = \psi_{ref}(t) - \psi(t)\)
  • 误差变化率:\(ec(t) = \dot{e}(t) = \dot{\psi}_{ref}(t) - \dot{\psi}(t)\) (实际计算中采用差分近似)

2.2 论域与比例因子设计

为保证控制器有足够的调节范围并充分利用模糊论域,设计如下:

  1. 误差 \(e\) 的论域:参考信号最大幅值为 \(0.5\) rad,考虑可能的超调,设定实际论域为 \([-0.6, 0.6] \, \text{rad}\)。归一化至模糊论域 \([-3, 3]\)
    • 量化因子:\(K_e = 3 / 0.6 = 5\)
  2. 误差变化率 \(ec\) 的论域:根据系统惯性(\(T=2.0\))估算,设定实际论域为 \([-0.15, 0.15] \, \text{rad/s}\)。归一化至模糊论域 \([-3, 3]\)
    • 量化因子:\(K_{ec} = 3 / 0.15 = 20\)
  3. 输出 \(\delta\) 的论域:执行机构限制为 \([-0.5, 0.5] \, \text{rad}\)。对应模糊论域 \([-3, 3]\)
    • 比例因子:\(K_u = 0.5 / 3 \approx 0.1667\)

映射关系为:

\(E = K_e \cdot e, \quad EC = K_{ec} \cdot ec, \quad \delta = K_u \cdot U\)

其中 \(E\), \(EC\), \(U\) 为模糊论域 \([-3, 3]\) 上的变量。

2.3 隶属度函数设计

在归一化论域 \([-3, 3]\) 上,定义 7 个模糊子集:NB(负大), NM(负中), NS(负小), ZO(零), PS(正小), PM(正中), PB(正大)
采用计算简单、性能良好的三角形隶属函数。取 7 个均匀分布的顶点:{-3, -2, -1, 0, 1, 2, 3},相邻顶点间距为 1。每个三角形隶属函数的左底点、顶点、右底点取相邻顶点值,具体如下表:

模糊集 左底点 顶点 右底点 形状说明
NB -3 -3 -2 左半梯形
NM -3 -2 -1 对称三角形
NS -2 -1 0 对称三角形
ZO -1 0 1 对称三角形
PS 0 1 2 对称三角形
PM 1 2 3 对称三角形
PB 2 3 3 右半梯形

隶属函数图形示意如下(以连续曲线表示

隶属度 μ
   ^
 1 |  NB   NM   NS   ZO   PS   PM   PB
   |  /\   /\   /\   /\   /\   /\   /\
   | /  \ /  \ /  \ /  \ /  \ /  \ /  \
   |/    \    \    \    \    \    \    \
 0 +--|---|---|---|---|---|---|--> 论域
  -3  -2  -1   0   1   2   3

2.4 模糊规则库设计

根据模糊 PD 控制的思想:控制量应与误差同号以消除误差,与误差变化率反号以抑制超调。据此制定 49 条(7x7)模糊控制规则。规则库如下表:

\(E \backslash EC\) NB NM NS ZO PS PM PB
NB PB PB PM PM PS ZO ZO
NM PB PB PM PS PS ZO NS
NS PM PM PS PS ZO NS NS
ZO PM PS PS ZO NS NS NM
PS PS PS ZO NS NS NM NM
PM PS ZO NS NM NM NM NB
PB ZO ZO NS NM NM NB NB

规则解读示例

  • 规则 R1:IF \(E\) is NB AND \(EC\) is NB THEN \(U\) is PB。
    解释:误差负大且误差变化率负大,意味着实际值远小于目标值且偏差仍在快速扩大。此时应施加最大的正控制量,以快速遏制偏差扩大并反向纠正。
  • 规则 R25:IF \(E\) is ZO AND \(EC\) is ZO THEN \(U\) is ZO。
    解释:已达到期望状态,保持控制量不变,维持平衡。

2.5 模糊推理与解模糊

  1. 模糊化:采用单点模糊化,将精确输入值 \(E_0\), \(EC_0\) 转化为对应模糊集合的隶属度。
  2. 推理机制:采用最常用的 Mamdani 蕴含算子(取小运算 min)和 max-min 合成法。
    • 每条规则激活强度:\(\alpha_i = \min(\mu_{A_i}(E_0), \mu_{B_i}(EC_0))\)
    • 规则输出模糊集:\(\mu_{C_i‘}(U) = \min(\alpha_i, \mu_{C_i}(U))\)
    • 总输出模糊集:\(\mu_{C’}(U) = \max_i (\mu_{C_i’}(U))\)
  3. 解模糊:采用重心法(Centroid),以获得平滑的输出控制量。

\(U^* = \frac{\int_{-3}^{3} U \cdot \mu_{C’}(U) dU}{\int_{-3}^{3} \mu_{C’}(U) dU}\)

  1. 其中 \(U_j\) 是输出论域的离散采样点。

最终控制量计算:\(\delta = \text{sat}( K_u \cdot U^*, -0.5, 0.5)\),其中 \(\text{sat}\) 为饱和函数,确保舵角不超出物理限制。

针对仿射非线性系统的自适应模糊控制器设计

3.1 系统建模与问题分析

原始系统模型为:

\(T\ddot{\psi} + KH(\dot{\psi}) = K\delta + d(t)\)

其中:

  • \(H(\dot{\psi}) = \alpha\dot{\psi} + \beta\dot{\psi}^3\)
  • \(d(t) = A_d\sin(\omega_d t) + n(t)\)

转化为仿射非线性形式:

定义状态变量:

\(x_1 = \psi, \quad x_2 = \dot{\psi}\)

则系统可写为状态空间形式:

$$

$$ dot{x}_1 = x_2 \ dot{x}_2 = f(x) + gdelta + d_1(t) end{cases} $$ 其中:

  • \(f(x) = -\frac{K}{T}H(x_2) = -\frac{K}{T}(\alpha x_2 + \beta x_2^3)\)
  • \(g = \frac{K}{T}\) (已知常数)
  • \(d_1(t) = \frac{1}{T}d(t)\)

仿射非线性系统的标准形式:\(\dot{x}_2 = f(x) + g\delta + d_1(t)\),其中 \(f(x)\) 为未知或不确定的非线性函数。

3.2 设计步骤

1:定义跟踪误差和滑模面

定义跟踪误差:

\(e = \psi_{ref} - \psi = x_{1d} - x_1\)

设计滑模面:

\(s = \dot{e} + \lambda e = (\dot{x}_{1d} - x_2) + \lambda e\)

其中 \(\lambda > 0\) 为设计参数,决定误差收敛速度。

2:滑模面动力学分析

对滑模面求导:

\(\dot{s} = \ddot{e} + \lambda \dot{e} = \ddot{x}_{1d} - \dot{x}_2 + \lambda \dot{e}\)

代入系统方程 \(\dot{x}_2 = f(x) + g\delta + d_1(t)\)

\(\dot{s} = \ddot{x}_{1d} - [f(x) + g\delta + d_1(t)] + \lambda \dot{e}\)

3:理想控制律设计 $\(f(x)\)完全已知且无扰动\(d_1(t)=0\),可设计控制律: $ delta^* = frac{1}{g}[-f(x) + ddot{x}_{1d} + lambda dot{e} + K s]$\(其中\) K>0 $为滑模增益。

代入 \(\dot{s}\) 方程可得:

\(\dot{s} = -K s\)

这是一个指数稳定系统,保证 \(s \to 0\),进而 \(e \to 0\)

4:模糊系统逼近未知函数\(f(x)\)

由于 \(f(x)\) 未知,采用模糊系统进行在线逼近。采用单值模糊器、乘积推理、中心平均解模糊器的结构,其输出为:

\(\hat{f}(x|\theta) = \theta^T \xi(x)\)

其中:

  • \(\theta \in \mathbb{R}^M\):可调参数向量
  • \(\xi(x) \in \mathbb{R}^M\):模糊基函数向量,满足 \(\sum_{i=1}^M \xi_i(x) = 1\)

模糊系统设计要点:

  1. 输入变量\(x_1\)(航向角)和 \(x_2\)(角速度)
  2. 模糊划分:每个输入定义 5 个模糊集 {NB, NS, ZO, PS, PB}
  3. 隶属函数:高斯型函数 \(\mu_{A_i^j}(x_j) = \exp\left(-\frac{(x_j - c_i^j)^2}{2\sigma_j^2}\right)\)
  4. 规则数量\(M = 5 \times 5 = 25\) 条规则

5:实际控制律与逼近误差分析

将理想控制律中的 \(f(x)\) 替换为模糊逼近 \(\hat{f}(x|\theta)\)

\(\delta = \frac{1}{g}[-\hat{f}(x|\theta) + \ddot{x}_{1d} + \lambda \dot{e} + K s]\)

定义最优参数 \(\theta^*\) 和最小逼近误差 \(\varepsilon\)

\(\theta^* = \arg\min_{\theta} \sup_{x \in \Omega} |\hat{f}(x|\theta) - f(x)|\)

\(\varepsilon = f(x) - \hat{f}(x|\theta^*)\)

假设 \(|\varepsilon| \leq \bar{\varepsilon}\)(有界。则控制律代入后得:

\(\dot{s} = -K s + (\hat{f} - f) - d_1(t) = -K s + \tilde{\theta}^T \xi(x) - \varepsilon - d_1(t)\)

其中 \(\tilde{\theta} = \theta - \theta^*\) 为参数误差。

6:李雅普诺夫稳定性分析与自适应律设计

选取李雅普诺夫函数候选:

\(V = \frac{1}{2} s^2 + \frac{1}{2\gamma} \tilde{\theta}^T \tilde{\theta}, \quad \gamma > 0\)

对时间求导:

\(\dot{V} = s\dot{s} + \frac{1}{\gamma} \tilde{\theta}^T \dot{\theta}\)

代入 \(\dot{s}\) 表达式:

\(\dot{V} = s[-K s + \tilde{\theta}^T \xi(x) - \varepsilon - d_1(t)] + \frac{1}{\gamma} \tilde{\theta}^T \dot{\theta}\)

\(= -K s^2 + \tilde{\theta}^T \left( s\xi(x) + \frac{1}{\gamma} \dot{\theta} \right) - s(\varepsilon + d_1(t))\)

为消除参数误差项,设计自适应律:

\(\dot{\theta} = -\gamma s \xi(x)\)

则:

\(\dot{V} = -K s^2 - s(\varepsilon + d_1(t))\)

假设总不确定性有界:\(|\varepsilon + d_1(t)| \leq D\),则:

\(\dot{V} \leq -K s^2 + |s|D = -|s|(K|s| - D)\)

\(|s| > D/K\) 时,\(\dot{V} < 0\)。根据一致最终有界理论,系统状态将收敛到边界层 \(|s| \leq D/K\) 内。

7:鲁棒性增强设计

  1. σ- 修正:防止参数漂移,修改自适应律为:

\(\dot{\theta} = -\gamma s \xi(x) - \sigma \gamma \theta\)

  1. 投影算法:保证参数在预设范围内:

\(\dot{\theta} = \text{Proj}(\theta, -\gamma s \xi(x))\)

  1. 抗饱和设计:当控制量饱和时调整自适应律:
    • 检测饱和:\(|\delta| \geq \delta_{\text{sat}}\)
    • 饱和时:暂停或减弱参数更新

4. 仿真与对比分析

4.1 仿真建模与设置

MATLAB/Simulink 中搭建仿真环境,包含以下模块:

  1. USV 非线性模型模块:根据方程 \(T\ddot{\psi} = K\delta - KH(\dot{\psi}) + d(t)\) 实现。
  2. 扰动生成模块
    • a) 无扰动:\(d(t)=0\)
    • b) 确定性扰动:\(d(t)=0.1\sin(0.1t)\)
    • c) 随机扰动:\(d(t)=n(t)\) ( 白噪声 )
  3. 参考信号模块:生成阶跃和正弦信号。
  4. 控制器模块:分别实现常规模糊控制器和自适应模糊控制器。
  5. 性能评估模块:计算各项性能指标。

仿真参数:采样时间 \(T_s=0.01s\),仿真时长:\(100s\),建模如图。

常规模糊控制器:

自适应模糊控制器:

注:我们采取的建模方法为将模糊控制功能封装在 S-Function 里面通过逻辑规则实现。

4.2 仿真输出

注:由于需要分析的参考输入有阶跃输入和正弦跟踪,以及对应三种情况:无扰动,正弦扰动以及噪声扰动共六种情况。因此为了让结果分析更加清晰且典型直观,我们对阶跃输入且正弦扰动,以及正弦输入且噪声扰动两种情况作详细的定量分析,其他所有情况作定性分析。

定性分析:

a)无扰动时的仿真输出:

阶跃响应:

其中蓝色线为普通模糊控制器阶跃输入,红色线为自适应模糊控制器的阶跃输入。

可见自适应模糊控制器相比于普通模糊控制器效果更好。

正弦跟踪:

其中蓝色线为普通模糊控制器阶跃输入,红色线为自适应模糊控制器的阶跃输入。

可见自适应模糊控制器相比于普通模糊控制器效果更好。

b)存在确定性时变扰动:𝑑(𝑡) = 0.1𝑠𝑖𝑛(0.1𝑡)

阶跃输入:

其中蓝色线为普通模糊控制器阶跃输入,红色线为自适应模糊控制器的阶跃输入。

可见自适应模糊控制器相比于普通模糊控制器效果更好。

正弦输入:

其中蓝色线为普通模糊控制器阶跃输入,红色线为自适应模糊控制器的阶跃输入。

可见自适应模糊控制器相比于普通模糊控制器效果更好。

c)存在随机噪声:𝑑(𝑡) = 𝑛(𝑡)(均值为 0,方差为 0.01 的白噪声)

阶跃输入:

其中蓝色线为普通模糊控制器阶跃输入,红色线为自适应模糊控制器的阶跃输入。

可见自适应模糊控制器相比于普通模糊控制器效果更好。

正弦输入:

其中蓝色线为普通模糊控制器阶跃输入,红色线为自适应模糊控制器的阶跃输入。

可见自适应模糊控制器相比于普通模糊控制器效果更好。

定量分析:

阶跃输入、正弦扰动:

跟踪精度分析:

从跟踪精度、动态响应与稳态性能三个角度揭示了自适应模糊控制的优势。在跟踪精度方面,自适应控制器 RMSE 降低 17.3%(0.1569→0.1298 radMAE 改善 26.1%(0.1020→0.0754 rad,表明其对参考航向的平均偏离程度显著减小;动态性能上,调节时间缩短 29.6%(11.13→7.84 s)且超调量降至 4%,证明自适应律在线调整参数后,系统响应更敏捷且无振荡;稳态性能改善 8.2%(0.1253→0.1150 rad)

鲁棒性分析:

左图误差分布直方图中,自适应控制器(红色)的峰值高达 900 次,远超常规的 350 次,且分布收窄至 0-0.2 rad 区间,尾部在 0.3 rad 后几乎为零,说明其误差高度集中于零点;右图累积分布函数显示,自适应控制在 0.05 rad 处累积概率达 90%,而常规仅 50%95% 置信区间对应误差不超过 0.08 rad,证实其抗干扰能力卓越,能将外部扰动导致的航向偏离压缩至常规控制的 ½.5 倍,极端大误差事件概率趋近于零,系统重复性与可靠性显著增强。

综合三图分析,自适应模糊控制器相比于普通模糊控制器效果更好。

正弦输入、噪声扰动:

该图数据呈现出自适应模糊控制的压倒性优势,三项核心指标均实现 40% 以上的跨越式改进:RMSE 降低 42.5%(0.0507→0.0292 radMAE 提升 37.4%(0.0360→0.0225 rad、误差标准差缩小 40%(0.0486→0.0291 rad,表明调优后的自适应律对未知动态逼近精度极高。自适应控制不仅减小了误差均值,更显著抑制了随机扰动导致的波动,鲁棒性增益甚至略优于跟踪精度增益,证明算法在抗干扰与模型补偿之间达到了更优平衡。

左图直方图中,自适应控制器(红色)在 0.02 rad 处的峰值高达 1400 次,是常规控制峰值的 3.5 倍(400 ,且分布完全集中在 ±0.1 rad 区间内(常规控制延伸至 ±0.15 rad,显示误差高度集聚于零点附近,几乎无离散奇异点;右图 CDF 曲线中,自适应控制在 0.05 rad 处累积概率突破 90%,而常规控制仅达 50%,且曲线在 0.08 rad 即饱和至 100%,说明最大误差绝对值不超过 0.08 rad,相比常规控制的 0.15 rad 上限,极端偏离风险降低 81%,系统确定性大幅提升。

综合三图分析,自适应模糊控制器相比于普通模糊控制器效果更好。

4.3 结果总结

无论是阶跃输入还是正弦输入,无论是无扰动、正弦扰动还是白噪声扰动,自适应模糊控制器的鲁棒性和跟踪效果均强于普通模糊控制器。

4.4 优势与局限性

常规模糊控制器

  • 优势:不依赖精确数学模型;设计基于经验,直观易懂;计算效率高,实时性好;对一般非线性和不确定性有一定的鲁棒性。
  • 局限性:控制精度有限,尤其是对时变信号跟踪;性能严重依赖于规则和隶属函数的经验设计;缺乏系统性的稳定性保证;对未建模动态和强扰动的适应能力不足。

自适应模糊控制器

  • 优势:能在线学习和补偿系统未知非线性,跟踪精度高;对参数变化和外部扰动具有更强的鲁棒性;结合了模糊逻辑的表述优势和自适应控制的学习能力。
  • 局限性:设计过程复杂,需要基于李雅普诺夫方法进行稳定性设计;在线计算量较大,对处理器要求高;存在参数收敛性和可能发生的参数漂移问题;控制器参数(如 \(\gamma\), \(K\))需要仔细整定。

适用场景建议

  • 对实时性要求极高、模型不确定性不高、或对控制精度要求一般的场合,可选用常规模糊控制器
  • 对控制精度和鲁棒性要求高、系统非线性强且模型不确定、具备一定计算资源的场合,宜选用自适应模糊控制器
  • 在实际应用中,亦可考虑分层或混合控制策略,例如在稳态时采用常规模糊控制,在动态过程或异常情况下切换到自适应控制。

作业心得

通过本次作业,我学会了模糊控制器的建模与仿真,并进行了两种控制器的对比。我也对 matlab 的使用更加熟悉。

A 附录 1Matlab 模型文件结构

USV_Fuzzy_Control/
├───models/  
│       USV_Fuzzy_Control_System        # 普通模糊控制器模型
│       USV_Adaptive_Control_System     # 自适应模糊控制器模型
│
├───s_functions/
│       usv_model.m                     # 无人艇动力学模型
│       fuzzy_controller_sfun           # 普通模糊控制器
│       adaptive_fuzzy_controller_sfun  # 自适应模糊控制器
│
├───scrips/
│       usv_controller_performance_analysis # 主函数脚本(用于定量分析)
│
└───results/
        #仿真图片  #仿真总结

B 附录 2:函数完整代码

普通模糊控制器 fuzzy_controller_sfun (S-Function)

function [sys,x0,str,ts] = fuzzy_controller_sfun(t,x,u,flag)
% 常规模糊控制器S-Function
% 输入: u(1)=误差e, u(2)=误差变化率ec
% 输出: 舵角δ(已饱和限制)

% 全局变量存储FIS(避免重复加载)
global fis_conv;

% 量化因子和比例因子
Ke = 5;      % 误差量化因子: [-0.6,0.6] -> [-3,3]
Kec = 20;    % 误差变化率量化因子: [-0.15,0.15] -> [-3,3]
Ku = 0.5/3;  % 输出比例因子: [-3,3] -> [-0.5,0.5]

switch flag
    case 0  % 初始化
        sizes = simsizes;
        sizes.NumContStates = 0;
        sizes.NumDiscStates = 0;
        sizes.NumOutputs = 1;       % 舵角δ
        sizes.NumInputs = 2;        % e和ec
        sizes.DirFeedthrough = 1;   % 输出直接依赖输入
        sizes.NumSampleTimes = 1;
        sys = simsizes(sizes);
        
        x0 = [];
        str = [];
        ts = [0 0];
        
        % 加载或创建模糊推理系统(FIS)
        if isempty(fis_conv)
            fis_conv = create_conventional_fis();
        end

    case 3  % 计算输出
        % 读取输入
        e = u(1);
        ec = u(2);
        
        % 量化到模糊论域 [-3, 3]
        E = Ke * e;
        EC = Kec * ec;
        
        % 限制在论域内
        E = min(max(E, -3), 3);
        EC = min(max(EC, -3), 3);
        
        % 模糊推理
        % 检查MATLAB版本,使用兼容的方式
        if exist('evalfis', 'file')
            % 传统方式
            U = evalfis([E, EC], fis_conv);
        else
            % 新版本MATLAB可能使用不同方式
            U = evalfis(fis_conv, [E, EC]);
        end
        
        % 反量化并饱和限制
        delta = Ku * U;
        delta = min(max(delta, -0.5), 0.5);  % 物理限制
        
        sys = delta;

    case {1, 2, 4, 9}
        sys = [];

    otherwise
        error(['未处理的flag = ',num2str(flag)]);
end
end

%% 辅助函数:创建常规模糊推理系统
function fis = create_conventional_fis()
% 创建常规模糊控制器的FIS - 使用新语法


    fis = mamfis('Name', 'Conventional_Fuzzy_Controller');
    
    % 1. 输入变量e(误差)
    fis = addInput(fis, [-3, 3], 'Name', 'e');
    fis = addMF(fis, 'e', 'trimf', [-3, -3, -2], 'Name', 'NB');
    fis = addMF(fis, 'e', 'trimf', [-3, -2, -1], 'Name', 'NM');
    fis = addMF(fis, 'e', 'trimf', [-2, -1, 0], 'Name', 'NS');
    fis = addMF(fis, 'e', 'trimf', [-1, 0, 1], 'Name', 'ZO');
    fis = addMF(fis, 'e', 'trimf', [0, 1, 2], 'Name', 'PS');
    fis = addMF(fis, 'e', 'trimf', [1, 2, 3], 'Name', 'PM');
    fis = addMF(fis, 'e', 'trimf', [2, 3, 3], 'Name', 'PB');
    
    % 2. 输入变量ec(误差变化率)
    fis = addInput(fis, [-3, 3], 'Name', 'ec');
    fis = addMF(fis, 'ec', 'trimf', [-3, -3, -2], 'Name', 'NB');
    fis = addMF(fis, 'ec', 'trimf', [-3, -2, -1], 'Name', 'NM');
    fis = addMF(fis, 'ec', 'trimf', [-2, -1, 0], 'Name', 'NS');
    fis = addMF(fis, 'ec', 'trimf', [-1, 0, 1], 'Name', 'ZO');
    fis = addMF(fis, 'ec', 'trimf', [0, 1, 2], 'Name', 'PS');
    fis = addMF(fis, 'ec', 'trimf', [1, 2, 3], 'Name', 'PM');
    fis = addMF(fis, 'ec', 'trimf', [2, 3, 3], 'Name', 'PB');
    
    % 3. 输出变量u(控制量)
    fis = addOutput(fis, [-3, 3], 'Name', 'u');
    fis = addMF(fis, 'u', 'trimf', [-3, -3, -2], 'Name', 'NB');
    fis = addMF(fis, 'u', 'trimf', [-3, -2, -1], 'Name', 'NM');
    fis = addMF(fis, 'u', 'trimf', [-2, -1, 0], 'Name', 'NS');
    fis = addMF(fis, 'u', 'trimf', [-1, 0, 1], 'Name', 'ZO');
    fis = addMF(fis, 'u', 'trimf', [0, 1, 2], 'Name', 'PS');
    fis = addMF(fis, 'u', 'trimf', [1, 2, 3], 'Name', 'PM');
    fis = addMF(fis, 'u', 'trimf', [2, 3, 3], 'Name', 'PB');
    
    % 4. 模糊规则表(49条规则)
    ruleList = [
        1 1 7 1 1;   % IF e=NB AND ec=NB THEN u=PB
        1 2 7 1 1;   % IF e=NB AND ec=NM THEN u=PB
        1 3 6 1 1;   % IF e=NB AND ec=NS THEN u=PM
        1 4 6 1 1;   % IF e=NB AND ec=ZO THEN u=PM
        1 5 5 1 1;   % IF e=NB AND ec=PS THEN u=PS
        1 6 4 1 1;   % IF e=NB AND ec=PM THEN u=ZO
        1 7 4 1 1;   % IF e=NB AND ec=PB THEN u=ZO
        
        2 1 7 1 1;   % IF e=NM AND ec=NB THEN u=PB
        2 2 7 1 1;   % IF e=NM AND ec=NM THEN u=PB
        2 3 6 1 1;   % IF e=NM AND ec=NS THEN u=PM
        2 4 5 1 1;   % IF e=NM AND ec=ZO THEN u=PS
        2 5 5 1 1;   % IF e=NM AND ec=PS THEN u=PS
        2 6 4 1 1;   % IF e=NM AND ec=PM THEN u=ZO
        2 7 3 1 1;   % IF e=NM AND ec=PB THEN u=NS
        
        3 1 6 1 1;   % IF e=NS AND ec=NB THEN u=PM
        3 2 6 1 1;   % IF e=NS AND ec=NM THEN u=PM
        3 3 5 1 1;   % IF e=NS AND ec=NS THEN u=PS
        3 4 5 1 1;   % IF e=NS AND ec=ZO THEN u=PS
        3 5 4 1 1;   % IF e=NS AND ec=PS THEN u=ZO
        3 6 3 1 1;   % IF e=NS AND ec=PM THEN u=NS
        3 7 3 1 1;   % IF e=NS AND ec=PB THEN u=NS
        
        4 1 6 1 1;   % IF e=ZO AND ec=NB THEN u=PM
        4 2 5 1 1;   % IF e=ZO AND ec=NM THEN u=PS
        4 3 5 1 1;   % IF e=ZO AND ec=NS THEN u=PS
        4 4 4 1 1;   % IF e=ZO AND ec=ZO THEN u=ZO
        4 5 3 1 1;   % IF e=ZO AND ec=PS THEN u=NS
        4 6 3 1 1;   % IF e=ZO AND ec=PM THEN u=NS
        4 7 2 1 1;   % IF e=ZO AND ec=PB THEN u=NM
        
        5 1 5 1 1;   % IF e=PS AND ec=NB THEN u=PS
        5 2 5 1 1;   % IF e=PS AND ec=NM THEN u=PS
        5 3 4 1 1;   % IF e=PS AND ec=NS THEN u=ZO
        5 4 3 1 1;   % IF e=PS AND ec=ZO THEN u=NS
        5 5 3 1 1;   % IF e=PS AND ec=PS THEN u=NS
        5 6 2 1 1;   % IF e=PS AND ec=PM THEN u=NM
        5 7 2 1 1;   % IF e=PS AND ec=PB THEN u=NM
        
        6 1 5 1 1;   % IF e=PM AND ec=NB THEN u=PS
        6 2 4 1 1;   % IF e=PM AND ec=NM THEN u=ZO
        6 3 3 1 1;   % IF e=PM AND ec=NS THEN u=NS
        6 4 2 1 1;   % IF e=PM AND ec=ZO THEN u=NM
        6 5 2 1 1;   % IF e=PM AND ec=PS THEN u=NM
        6 6 2 1 1;   % IF e=PM AND ec=PM THEN u=NM
        6 7 1 1 1;   % IF e=PM AND ec=PB THEN u=NB
        
        7 1 4 1 1;   % IF e=PB AND ec=NB THEN u=ZO
        7 2 4 1 1;   % IF e=PB AND ec=NM THEN u=ZO
        7 3 3 1 1;   % IF e=PB AND ec=NS THEN u=NS
        7 4 2 1 1;   % IF e=PB AND ec=ZO THEN u=NM
        7 5 2 1 1;   % IF e=PB AND ec=PS THEN u=NM
        7 6 1 1 1;   % IF e=PB AND ec=PM THEN u=NB
        7 7 1 1 1;   % IF e=PB AND ec=PB THEN u=NB
    ];
    
    % 添加规则
    fis = addRule(fis, ruleList);

    % 设置去模糊化方法
    fis.defuzzMethod = 'centroid';
end

自适应模糊控制器 adaptive_fuzzy_controller_sfun (S-Function)

function [sys,x0,str,ts] = adaptive_fuzzy_controller_improved(t,x,u,flag)
% 改进的自适应模糊控制器S-Function
% 改进点: 1.抗饱和设计 2.零除保护 3.投影算法 4.动态模糊集
% 输入: u(1)=ψ_ref, u(2)=ψ, u(3)=ψ_dot, u(4)=ψ_ref_dot, u(5)=ψ_ref_ddot
% 状态: x(1:25)=参数向量θ
% 输出: 舵角δ

% ========== 控制器设计参数 ==========
% 滑模控制参数
lambda = 0.5;   % 滑模面参数 - 决定误差收敛速度
K_smc = 1.0;    % 滑模控制增益 - 影响收敛速率和鲁棒性
g = 0.4;        % 系统控制增益 (K/T)

% 自适应参数
gamma = 0.1;    % 自适应增益 - 权衡学习速度和稳定性
sigma_mod = 0.01; % σ-修正增益 - 防止参数漂移
theta_max = 5.0; % 参数最大幅值 - 用于投影算法

% 抗饱和参数
delta_sat_threshold = 0.45; % 饱和阈值(小于硬限制0.5)
anti_windup_gain = 0.5;     % 抗饱和补偿增益

% 零除保护参数
epsilon_min = 1e-6; % 最小阈值防止除以零

% ========== 模糊系统设置 ==========
% 使用持久变量存储模糊系统参数(避免重复计算)
persistent c1 c2 sigma1 sigma2 M theta_min theta_max_vec

switch flag
    case 0  % ========== 初始化 ==========
        sizes = simsizes;
        sizes.NumContStates = 30;  % 25个参数 + 5个模糊集中心调整
        sizes.NumDiscStates = 0;
        sizes.NumOutputs = 1;      % 舵角δ
        sizes.NumInputs = 5;       % ψ_ref, ψ, ψ_dot, ψ_ref_dot, ψ_ref_ddot
        sizes.DirFeedthrough = 1;
        sizes.NumSampleTimes = 1;
        sys = simsizes(sizes);
        
        % 初始参数设置
        % 前25个: 模糊系统参数θ (初始化为零)
        % 后5个: 第一个模糊集中心的动态调整参数
        x0 = zeros(30, 1);
        
        str = [];
        ts = [0 0];  % 连续系统
        
        % 初始化模糊系统参数
        if isempty(c1)
            % 定义模糊集中心 - 基于系统工作范围
            % ψ的模糊集中心: 根据参考信号范围[-0.6, 0.6] rad
            c1 = [-0.6, -0.3, 0, 0.3, 0.6];
            % ψ_dot的模糊集中心: 根据角速度范围[-0.5, 0.5] rad/s
            c2 = [-0.5, -0.25, 0, 0.25, 0.5];
            
            % 高斯函数宽度 (σ)
            sigma1 = 0.15;    % ψ的宽度
            sigma2 = 0.125;   % ψ_dot的宽度
            
            M = 25;           % 规则总数(5x5)
            
            % 参数边界 (用于投影算法)
            theta_min = -theta_max * ones(25, 1);
            theta_max_vec = theta_max * ones(25, 1);
        end

    case 1  % ========== 计算状态导数(参数自适应律) ==========
        % 读取输入
        psi_ref = u(1);
        psi = u(2);
        psi_dot = u(3);
        psi_ref_dot = u(4);
        psi_ref_ddot = u(5);
        
        % 当前参数状态
        theta = x(1:25);     % 模糊系统参数
        c1_adj = x(26:30);   % 第一个模糊集中心调整参数
        
        % ===== 1. 计算跟踪误差和滑模变量 =====
        e = psi_ref - psi;
        e_dot = psi_ref_dot - psi_dot;
        s = e_dot + lambda * e;
        
        % ===== 2. 计算模糊基函数向量ξ(x) =====
        % 使用动态调整的模糊集中心
        c1_dynamic = c1 + c1_adj'; % 动态调整中心
        xi = compute_fuzzy_basis_improved(psi, psi_dot, c1_dynamic, c2, sigma1, sigma2, epsilon_min);
        
        % ===== 3. 计算控制量(检查是否饱和) =====
        f_hat = theta' * xi;  % 模糊系统逼近f(x)
        
        % 控制律: δ = (1/g)[ -f_hat + ψ_ref_ddot + λe_dot + K·s ]
        delta_nominal = (1/g) * ( -f_hat + psi_ref_ddot + lambda*e_dot + K_smc*s );
        
        % 应用饱和限制
        delta_saturated = min(max(delta_nominal, -0.5), 0.5);
        
        % ===== 4. 抗饱和设计 =====
        % 计算饱和指示函数
        saturation_indicator = 0;
        if abs(delta_nominal) > delta_sat_threshold
            saturation_indicator = 1;
        end
        
        % 抗饱和补偿项
        delta_diff = delta_nominal - delta_saturated;
        anti_windup_term = anti_windup_gain * delta_diff;
        
        % ===== 5. 带投影算子和抗饱和的自适应律 =====
        if saturation_indicator < 0.5  % 未严重饱和时才更新参数
            % 基本自适应律: dθ/dt = -γ * s * ξ(x)
            dtheta_basic = -gamma * s * xi;
            
            % 添加σ-修正防止参数漂移
            dtheta_sigma = -sigma_mod * gamma * theta;
            
            % 合并自适应律
            dtheta = dtheta_basic + dtheta_sigma;
            
            % 应用投影算子保证参数在边界内
            dtheta = projection_operator(theta, dtheta, theta_min, theta_max_vec);
        else
            % 严重饱和时,停止参数更新或仅进行σ-修正
            dtheta = -sigma_mod * gamma * theta;
        end
        
        % ===== 6. 动态模糊集中心调整 =====
        % 根据跟踪性能动态调整第一个模糊集中心
        % 规则: 如果误差持续较大,则扩展模糊集覆盖范围
        dc1_adj = -0.01 * e * c1_adj;  % 简单调整策略
        
        % ===== 7. 组合状态导数 =====
        sys = [dtheta; dc1_adj];

    case 3  % ========== 计算输出(控制量) ==========
        % 读取输入和当前参数
        psi_ref = u(1);
        psi = u(2);
        psi_dot = u(3);
        psi_ref_dot = u(4);
        psi_ref_ddot = u(5);
        
        theta = x(1:25);     % 模糊系统参数
        c1_adj = x(26:30);   % 模糊集中心调整参数
        
        % ===== 1. 计算跟踪误差和滑模变量 =====
        e = psi_ref - psi;
        e_dot = psi_ref_dot - psi_dot;
        s = e_dot + lambda * e;
        
        % ===== 2. 计算模糊基函数和模糊系统输出 =====
        % 使用动态调整的模糊集中心
        c1_dynamic = c1 + c1_adj'; % 动态调整中心
        xi = compute_fuzzy_basis_improved(psi, psi_dot, c1_dynamic, c2, sigma1, sigma2, epsilon_min);
        f_hat = theta' * xi;  % 逼近f(x)
        
        % ===== 3. 计算名义控制量 =====
        delta_nominal = (1/g) * ( -f_hat + psi_ref_ddot + lambda*e_dot + K_smc*s );
        
        % ===== 4. 应用抗饱和补偿 =====
        % 检查历史饱和情况(简化的抗饱和补偿)
        persistent delta_sat_history;
        if isempty(delta_sat_history)
            delta_sat_history = 0;
        end
        
        % 计算饱和补偿
        if abs(delta_nominal) > delta_sat_threshold
            % 进入饱和区,记录饱和量
            delta_sat_history = delta_sat_history + 0.01 * sign(delta_nominal) * ...
                (abs(delta_nominal) - delta_sat_threshold);
        else
            % 未饱和时逐渐释放饱和补偿
            delta_sat_history = delta_sat_history * 0.99;
        end
        
        % 限制饱和补偿的大小
        delta_sat_history = min(max(delta_sat_history, -0.1), 0.1);
        
        % ===== 5. 最终控制量 =====
        delta = delta_nominal - anti_windup_gain * delta_sat_history;
        
        % ===== 6. 应用硬饱和限制 =====
        delta = min(max(delta, -0.5), 0.5);
        
        sys = delta;

    case {2, 4, 9}
        sys = [];

    otherwise
        error(['未处理的flag = ',num2str(flag)]);
end
end

%% ========== 辅助函数 ==========

function xi = compute_fuzzy_basis_improved(x1, x2, c1, c2, sigma1, sigma2, epsilon_min)
% 改进的模糊基函数计算(带零除保护)
% 计算模糊基函数向量ξ(x) ∈ ℝ^{25}
% x1: ψ, x2: ψ_dot

% 高斯隶属函数计算
mu1 = exp(-(x1 - c1).^2 ./ (2*sigma1^2));  % 5维
mu2 = exp(-(x2 - c2).^2 ./ (2*sigma2^2));  % 5维

% 数值稳定性处理:防止下溢
mu1 = max(mu1, 1e-10);
mu2 = max(mu2, 1e-10);

% 计算规则激活度(乘积推理)
phi = zeros(5,5);
for i = 1:5
    for j = 1:5
        phi(i,j) = mu1(i) * mu2(j);
    end
end

% 归一化得到模糊基函数(带零除保护)
phi_sum = sum(phi(:));

if phi_sum < epsilon_min
    % 零除保护:如果激活度总和太小,返回均匀分布
    xi = ones(25,1) / 25;
else
    xi = phi(:) / phi_sum;
end

% 确保数值稳定性
xi = max(xi, 0);
xi = xi / sum(xi); % 重新归一化
end

function dtheta_proj = projection_operator(theta, dtheta, theta_min, theta_max)
% 投影算子实现
% 保证参数θ在[θ_min, θ_max]范围内

dtheta_proj = dtheta;
n = length(theta);

for i = 1:n
    % 检查参数是否在边界附近
    if theta(i) <= theta_min(i) + 1e-6 && dtheta(i) < 0
        % 在最小边界且试图减小,停止减小
        dtheta_proj(i) = max(dtheta(i), 0);
    elseif theta(i) >= theta_max(i) - 1e-6 && dtheta(i) > 0
        % 在最大边界且试图增加,停止增加
        dtheta_proj(i) = min(dtheta(i), 0);
    end
end
end

function [xi, mu1, mu2] = compute_fuzzy_basis_with_adaptation(x1, x2, c1, c2, sigma1, sigma2, adaptation_factors)
% 带自适应调整的模糊基函数计算
% adaptation_factors: 5x2矩阵,调整每个模糊集中心的权重

% 调整后的中心
c1_adapted = c1 .* (1 + adaptation_factors(:,1)');
c2_adapted = c2 .* (1 + adaptation_factors(:,2)');

% 高斯隶属函数计算
mu1 = exp(-(x1 - c1_adapted).^2 ./ (2*sigma1^2));
mu2 = exp(-(x2 - c2_adapted).^2 ./ (2*sigma2^2));

% 数值稳定性处理
mu1 = max(mu1, 1e-10);
mu2 = max(mu2, 1e-10);

% 计算规则激活度
phi = zeros(5,5);
for i = 1:5
    for j = 1:5
        phi(i,j) = mu1(i) * mu2(j);
    end
end

% 归一化
phi_sum = sum(phi(:));
if phi_sum < 1e-10
    xi = ones(25,1) / 25;
else
    xi = phi(:) / phi_sum;
end

% 重新归一化确保数值稳定性
xi = xi / sum(xi);
end

其余部分包括模型、主函数代码、结果图均在文件夹里一并提交。