探索滑模控制的多元世界
滑模控制SMC滑模抖振削弱模糊滑模动态滑模高阶滑模反馈线性化滑模滑模控制器参数寻优。在控制领域滑模控制SMC就像一颗璀璨的明珠以其独特的魅力吸引着众多研究者与工程师。今天咱们就来深入探讨一番滑模控制及其相关的各种进阶玩法。滑模控制基础滑模控制的核心思想简单来说就是通过设计一个切换面让系统状态在这个切换面上滑动从而实现特定的控制目标。在这个过程中系统对参数变化和外部干扰具有很强的鲁棒性。以一个简单的一阶系统为例假设系统方程为$\dot{x}ax bu$其中$x$是系统状态$a$、$b$是系统参数$u$是控制输入。我们设计滑模面为$s cx \int e dt$$c$为常数$e$为误差。import numpy as np import matplotlib.pyplot as plt # 定义系统参数 a -1 b 1 c 1 # 离散化参数 dt 0.01 T 10 time np.arange(0, T, dt) # 初始化状态和控制输入 x np.zeros(len(time)) u np.zeros(len(time)) e np.zeros(len(time)) s np.zeros(len(time)) # 设定目标值 r 1 for i in range(1, len(time)): e[i] r - x[i - 1] s[i] c * x[i - 1] s[i - 1] e[i] * dt if s[i] 0: u[i] -1 else: u[i] 1 x[i] x[i - 1] (a * x[i - 1] b * u[i]) * dt plt.plot(time, x, labelSystem State) plt.plot(time, np.ones(len(time)) * r, labelReference) plt.xlabel(Time (s)) plt.ylabel(State) plt.legend() plt.show()这段代码模拟了简单一阶系统的滑模控制过程。通过不断判断滑模面$s$的值来决定控制输入$u$使得系统状态$x$朝着目标值$r$靠近。从代码运行结果图中可以直观看到系统状态逐渐稳定在目标值附近。滑模抖振削弱然而滑模控制有个小“毛病”就是抖振问题。抖振不仅影响系统性能还可能造成执行机构的磨损。为了削弱抖振研究者们想出了各种办法。一种常见的方式是边界层法在滑模面附近设置一个边界层$\Phi$当系统状态进入这个边界层时采用连续控制律而不是传统的开关控制律。# 边界层法削弱抖振 phi 0.1 u_damp np.zeros(len(time)) for i in range(1, len(time)): e[i] r - x[i - 1] s[i] c * x[i - 1] s[i - 1] e[i] * dt if abs(s[i]) phi: if s[i] 0: u_damp[i] -1 else: u_damp[i] 1 else: u_damp[i] -s[i] / phi x[i] x[i - 1] (a * x[i - 1] b * u_damp[i]) * dt plt.plot(time, x, labelSystem State with Damp) plt.plot(time, np.ones(len(time)) * r, labelReference) plt.xlabel(Time (s)) plt.ylabel(State) plt.legend() plt.show()通过上述代码可以看到在边界层内控制输入$u$不再是简单的开关切换而是与滑模面$s$成比例这样就有效削弱了抖振。对比之前没有抖振削弱的结果可以发现系统状态变化更加平滑。模糊滑模模糊滑模控制结合了模糊逻辑与滑模控制的优点。模糊逻辑能够处理不确定和不精确的信息它根据系统的状态和误差等信息通过模糊规则来调整滑模控制的参数。滑模控制SMC滑模抖振削弱模糊滑模动态滑模高阶滑模反馈线性化滑模滑模控制器参数寻优。比如我们可以定义模糊输入变量为误差$e$和误差变化率$\dot{e}$模糊输出变量为滑模控制的增益$k$。模糊规则可以像这样如果$e$是正大且$\dot{e}$是正大那么$k$是正大如果$e$是零且$\dot{e}$是零那么$k$是零。from skfuzzy import control as ctrl # 定义模糊变量 e_fuzzy ctrl.Antecedent(np.arange(-1, 1, 0.01), e) de_fuzzy ctrl.Antecedent(np.arange(-1, 1, 0.01), de) k_fuzzy ctrl.Consequent(np.arange(0, 5, 0.01), k) # 定义模糊隶属度函数 e_fuzzy[NB] ctrl.trimf(e_fuzzy.universe, [-1, -1, -0.5]) e_fuzzy[NS] ctrl.trimf(e_fuzzy.universe, [-1, -0.5, 0]) e_fuzzy[ZE] ctrl.trimf(e_fuzzy.universe, [-0.5, 0, 0.5]) e_fuzzy[PS] ctrl.trimf(e_fuzzy.universe, [0, 0.5, 1]) e_fuzzy[PB] ctrl.trimf(e_fuzzy.universe, [0.5, 1, 1]) de_fuzzy[NB] ctrl.trimf(de_fuzzy.universe, [-1, -1, -0.5]) de_fuzzy[NS] ctrl.trimf(de_fuzzy.universe, [-1, -0.5, 0]) de_fuzzy[ZE] ctrl.trimf(de_fuzzy.universe, [-0.5, 0, 0.5]) de_fuzzy[PS] ctrl.trimf(de_fuzzy.universe, [0, 0.5, 1]) de_fuzzy[PB] ctrl.trimf(de_fuzzy.universe, [0.5, 1, 1]) k_fuzzy[NB] ctrl.trimf(k_fuzzy.universe, [0, 0, 1]) k_fuzzy[NS] ctrl.trimf(k_fuzzy.universe, [0, 1, 2]) k_fuzzy[ZE] ctrl.trimf(k_fuzzy.universe, [1, 2, 3]) k_fuzzy[PS] ctrl.trimf(k_fuzzy.universe, [2, 3, 4]) k_fuzzy[PB] ctrl.trimf(k_fuzzy.universe, [3, 4, 5]) # 定义模糊规则 rule1 ctrl.Rule(e_fuzzy[NB] de_fuzzy[NB], k_fuzzy[PB]) rule2 ctrl.Rule(e_fuzzy[NB] de_fuzzy[NS], k_fuzzy[PS]) rule3 ctrl.Rule(e_fuzzy[NB] de_fuzzy[ZE], k_fuzzy[ZE]) rule4 ctrl.Rule(e_fuzzy[NB] de_fuzzy[PS], k_fuzzy[NS]) rule5 ctrl.Rule(e_fuzzy[NB] de_fuzzy[PB], k_fuzzy[NB]) # 更多规则... # 创建模糊控制系统 k_ctrl ctrl.ControlSystem([rule1, rule2, rule3, rule4, rule5]) k_simulation ctrl.ControlSystemSimulation(k_ctrl) # 在滑模控制中应用模糊调整的增益 x_fuzzy np.zeros(len(time)) u_fuzzy np.zeros(len(time)) for i in range(1, len(time)): e[i] r - x_fuzzy[i - 1] de (e[i] - e[i - 1]) / dt k_simulation.input[e] e[i] k_simulation.input[de] de k_simulation.compute() k k_simulation.output[k] s[i] c * x_fuzzy[i - 1] s[i - 1] e[i] * dt if s[i] 0: u_fuzzy[i] -k else: u_fuzzy[i] k x_fuzzy[i] x_fuzzy[i - 1] (a * x_fuzzy[i - 1] b * u_fuzzy[i]) * dt plt.plot(time, x_fuzzy, labelSystem State with Fuzzy SMC) plt.plot(time, np.ones(len(time)) * r, labelReference) plt.xlabel(Time (s)) plt.ylabel(State) plt.legend() plt.show()上述代码构建了一个简单的模糊滑模控制系统。通过模糊规则动态调整滑模控制的增益$k$使得系统在不同状态下能够自适应地调整控制策略进一步提升了系统性能。动态滑模、高阶滑模与反馈线性化滑模动态滑模在传统滑模基础上将滑模面设计为动态变化的这样可以更好地跟踪复杂的参考信号。高阶滑模则是通过对滑模面的高阶导数进行设计来进一步削弱抖振并提高系统精度。反馈线性化滑模是先对非线性系统进行反馈线性化处理将其转化为线性系统然后再应用滑模控制。以一个非线性系统$\ddot{x}f(x,\dot{x})g(x,\dot{x})u$为例通过合适的坐标变换和反馈控制可以将其转化为线性系统形式再设计滑模控制器。# 简单示意反馈线性化滑模 def f(x, dx): return x ** 2 dx def g(x, dx): return 1 # 反馈线性化处理 def feedback_linearization(x, dx, r, dr, ddr): u (ddr - f(x, dx) 2 * (dr - dx) (r - x)) / g(x, dx) return u x_feedback np.zeros(len(time)) dx_feedback np.zeros(len(time)) u_feedback np.zeros(len(time)) for i in range(1, len(time)): u_feedback[i] feedback_linearization(x_feedback[i - 1], dx_feedback[i - 1], r, 0, 0) dx_feedback[i] dx_feedback[i - 1] (f(x_feedback[i - 1], dx_feedback[i - 1]) g(x_feedback[i - 1], dx_feedback[i - 1]) * u_feedback[i]) * dt x_feedback[i] x_feedback[i - 1] dx_feedback[i] * dt plt.plot(time, x_feedback, labelSystem State with Feedback Linearization SMC) plt.plot(time, np.ones(len(time)) * r, labelReference) plt.xlabel(Time (s)) plt.ylabel(State) plt.legend() plt.show()这段代码简单演示了反馈线性化滑模的过程。先对非线性函数$f$和$g$进行定义然后通过反馈线性化计算控制输入$u$使系统状态跟踪目标值$r$。从结果图可以看到系统状态较好地趋近目标值。滑模控制器参数寻优滑模控制器的参数对系统性能影响很大。比如滑模面的系数、控制增益等参数需要进行寻优。常用的寻优方法有遗传算法、粒子群算法等。以粒子群算法为例我们可以将滑模控制器的参数作为粒子的位置以系统性能指标如误差积分、超调量等作为适应度函数。粒子在搜索空间中不断调整自己的位置寻找最优的参数组合。import numpy as np # 粒子群算法参数 n_particles 20 n_iterations 100 c1 1.5 c2 1.5 w 0.7 # 定义适应度函数简单以误差平方和为例 def fitness_function(params): c, k params x_opt np.zeros(len(time)) u_opt np.zeros(len(time)) s_opt np.zeros(len(time)) e_opt np.zeros(len(time)) for i in range(1, len(time)): e_opt[i] r - x_opt[i - 1] s_opt[i] c * x_opt[i - 1] s_opt[i - 1] e_opt[i] * dt if s_opt[i] 0: u_opt[i] -k else: u_opt[i] k x_opt[i] x_opt[i - 1] (a * x_opt[i - 1] b * u_opt[i]) * dt return np.sum((r - x_opt) ** 2) # 初始化粒子位置和速度 particles np.random.rand(n_particles, 2) velocities np.random.rand(n_particles, 2) # 记录个体最优和全局最优 pbest particles.copy() pbest_fitness np.array([fitness_function(p) for p in particles]) gbest_index np.argmin(pbest_fitness) gbest pbest[gbest_index] gbest_fitness pbest_fitness[gbest_index] for _ in range(n_iterations): r1 np.random.rand(n_particles, 2) r2 np.random.rand(n_particles, 2) velocities w * velocities c1 * r1 * (pbest - particles) c2 * r2 * (gbest - particles) particles particles velocities fitness_values np.array([fitness_function(p) for p in particles]) improved_indices fitness_values pbest_fitness pbest[improved_indices] particles[improved_indices] pbest_fitness[improved_indices] fitness_values[improved_indices] current_best_index np.argmin(pbest_fitness) if pbest_fitness[current_best_index] gbest_fitness: gbest pbest[current_best_index] gbest_fitness pbest_fitness[current_best_index] print(最优参数 c, k:, gbest)上述代码使用粒子群算法对滑模控制器的参数$c$和$k$进行寻优。通过不断迭代粒子群逐渐找到使适应度函数最小的参数组合也就是能让系统性能最优的滑模控制器参数。滑模控制及其各种衍生方法为控制领域提供了丰富的解决方案每一种方法都有其独特的优势和适用场景在实际应用中可以根据具体需求灵活选择与组合。希望这篇博文能让大家对滑模控制的多元世界有更深入的了解。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2415707.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!