模糊控制作业
约 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\)(全集
在模糊集合中,元素 \(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\)(空集
在模糊集合中:
\(\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)\):
- 阶跃响应:\(\psi_{ref}(t) = 0.5 \cdot 1(t)\)
- 正弦跟踪:\(\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 论域与比例因子设计¶
为保证控制器有足够的调节范围并充分利用模糊论域,设计如下:
- 误差 \(e\) 的论域:参考信号最大幅值为 \(0.5\) rad,考虑可能的超调,设定实际论域为 \([-0.6, 0.6] \, \text{rad}\)。归一化至模糊论域 \([-3, 3]\)。
- 量化因子:\(K_e = 3 / 0.6 = 5\)
- 误差变化率 \(ec\) 的论域:根据系统惯性(\(T=2.0\))估算,设定实际论域为 \([-0.15, 0.15] \, \text{rad/s}\)。归一化至模糊论域 \([-3, 3]\)。
- 量化因子:\(K_{ec} = 3 / 0.15 = 20\)
- 输出 \(\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 模糊推理与解模糊¶
- 模糊化:采用单点模糊化,将精确输入值 \(E_0\), \(EC_0\) 转化为对应模糊集合的隶属度。
- 推理机制:采用最常用的 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))\)
- 解模糊:采用重心法(Centroid),以获得平滑的输出控制量。
\(U^* = \frac{\int_{-3}^{3} U \cdot \mu_{C’}(U) dU}{\int_{-3}^{3} \mu_{C’}(U) dU}\)
- 其中 \(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\)
模糊系统设计要点:
- 输入变量:\(x_1\)(航向角)和 \(x_2\)(角速度)
- 模糊划分:每个输入定义 5 个模糊集 {NB, NS, ZO, PS, PB}
- 隶属函数:高斯型函数 \(\mu_{A_i^j}(x_j) = \exp\left(-\frac{(x_j - c_i^j)^2}{2\sigma_j^2}\right)\)
- 规则数量:\(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:鲁棒性增强设计
- σ- 修正:防止参数漂移,修改自适应律为:
\(\dot{\theta} = -\gamma s \xi(x) - \sigma \gamma \theta\)
- 投影算法:保证参数在预设范围内:
\(\dot{\theta} = \text{Proj}(\theta, -\gamma s \xi(x))\)
- 抗饱和设计:当控制量饱和时调整自适应律:
- 检测饱和:\(|\delta| \geq \delta_{\text{sat}}\)
- 饱和时:暂停或减弱参数更新
4. 仿真与对比分析¶
4.1 仿真建模与设置¶
在 MATLAB/Simulink 中搭建仿真环境,包含以下模块:
- USV 非线性模型模块:根据方程 \(T\ddot{\psi} = K\delta - KH(\dot{\psi}) + d(t)\) 实现。
- 扰动生成模块:
- a) 无扰动:\(d(t)=0\)
- b) 确定性扰动:\(d(t)=0.1\sin(0.1t)\)
- c) 随机扰动:\(d(t)=n(t)\) ( 白噪声 )
- 参考信号模块:生成阶跃和正弦信号。
- 控制器模块:分别实现常规模糊控制器和自适应模糊控制器。
- 性能评估模块:计算各项性能指标。
仿真参数:采样时间 \(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 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 rad

左图直方图中,自适应控制器(红色)在 0.02 rad 处的峰值高达 1400 次,是常规控制峰值的 3.5 倍(400 次
综合三图分析,自适应模糊控制器相比于普通模糊控制器效果更好。
4.3 结果总结¶
无论是阶跃输入还是正弦输入,无论是无扰动、正弦扰动还是白噪声扰动,自适应模糊控制器的鲁棒性和跟踪效果均强于普通模糊控制器。
4.4 优势与局限性¶
常规模糊控制器:
- 优势:不依赖精确数学模型;设计基于经验,直观易懂;计算效率高,实时性好;对一般非线性和不确定性有一定的鲁棒性。
- 局限性:控制精度有限,尤其是对时变信号跟踪;性能严重依赖于规则和隶属函数的经验设计;缺乏系统性的稳定性保证;对未建模动态和强扰动的适应能力不足。
自适应模糊控制器:
- 优势:能在线学习和补偿系统未知非线性,跟踪精度高;对参数变化和外部扰动具有更强的鲁棒性;结合了模糊逻辑的表述优势和自适应控制的学习能力。
- 局限性:设计过程复杂,需要基于李雅普诺夫方法进行稳定性设计;在线计算量较大,对处理器要求高;存在参数收敛性和可能发生的参数漂移问题;控制器参数(如 \(\gamma\), \(K\))需要仔细整定。
适用场景建议:
- 对实时性要求极高、模型不确定性不高、或对控制精度要求一般的场合,可选用常规模糊控制器。
- 对控制精度和鲁棒性要求高、系统非线性强且模型不确定、具备一定计算资源的场合,宜选用自适应模糊控制器。
- 在实际应用中,亦可考虑分层或混合控制策略,例如在稳态时采用常规模糊控制,在动态过程或异常情况下切换到自适应控制。
作业心得¶
通过本次作业,我学会了模糊控制器的建模与仿真,并进行了两种控制器的对比。我也对 matlab 的使用更加熟悉。
A 附录 1:Matlab 模型文件结构¶
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
其余部分包括模型、主函数代码、结果图均在文件夹里一并提交。