💥💥💞💞欢迎来到本博客❤️❤️💥💥
🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。
⛳️座右铭:行百里者,半于九十。
📋📋📋本文内容如下:🎁🎁🎁
⛳️赠与读者
👨💻做科研,涉及到一个深在的思想系统,需要科研者逻辑缜密,踏实认真,但是不能只是努力,很多时候借力比努力更重要,然后还要有仰望星空的创新点和启发点。建议读者按目录次序逐一浏览,免得骤然跌入幽暗的迷宫找不到来时的路,它不足为你揭示全部问题的答案,但若能解答你胸中升起的一朵朵疑云,也未尝不会酿成晚霞斑斓的别一番景致,万一它给你带来了一场精神世界的苦雨,那就借机洗刷一下原来存放在那儿的“躺平”上的尘埃吧。
或许,雨过云收,神驰的天地更清朗.......🔎🔎🔎
💥第一部分——内容介绍
基于双目标 UCB 控制启发式算法的主动磁悬浮轴承 PID 隐式模型优化方法——基准函数测试研究
摘要:本文聚焦于主动磁悬浮轴承 PID 隐式模型的优化问题,提出基于双目标 UCB 控制启发式算法的优化方法。通过引入基准函数测试,评估该算法在主动磁悬浮轴承 PID 隐式模型优化中的性能表现。研究结果表明,该方法能有效提升系统的稳定性和动态响应能力,为磁悬浮轴承控制系统的优化提供了新的思路和方法。
关键词:主动磁悬浮轴承;PID 隐式模型;双目标 UCB 控制启发式算法;基准函数测试
一、引言
磁悬浮轴承凭借其无接触、无摩擦、高精度、长寿命等显著优势,在航空航天、能源动力、精密制造等高端装备领域展现出广阔的应用前景。主动磁悬浮轴承作为其中的关键技术,通过实时检测转子位移并调节电磁铁电流,实现转子的稳定悬浮。然而,主动磁悬浮轴承系统是一个多输入、多输出、强非线性的复杂系统,其控制方法面临着系统固有开不稳定性、电磁力强非线性以及外部扰动敏感性等核心挑战。
PID 控制因其结构简单、易于实现、鲁棒性较好,成为工业应用中广泛采用的控制方法。在主动磁悬浮轴承中,PID 控制器通过比例、积分、微分三个环节的线性组合,对转子位移偏差进行校正。但单纯的 PID 控制在实际应用中存在局限性,难以应对系统非线性和外部扰动等问题。因此,对 PID 隐式模型进行优化,提高其控制性能具有重要的现实意义。
双目标 UCB(Upper Confidence Bound)控制启发式算法是一种结合了探索与利用思想的优化算法,在处理多目标优化问题时具有独特的优势。本文将该算法应用于主动磁悬浮轴承 PID 隐式模型的优化中,并通过基准函数测试评估其性能,旨在为磁悬浮轴承控制系统的优化提供理论支持和实践指导。
二、主动磁悬浮轴承 PID 隐式模型及优化需求分析
2.1 主动磁悬浮轴承工作原理及系统特性
主动磁悬浮轴承系统主要由转子、电磁铁、传感器、控制器和功率放大器五部分组成。其工作原理是:当转子因外部干扰或自身不平衡偏离平衡位置时,位移传感器以高精度检测偏移量,并将信号反馈给控制器;控制器根据预设的控制算法,将位移信号转换为电流指令;功率放大器将指令转化为绕组中的实时电流,电磁铁通过调整磁力大小与方向,使转子恢复至平衡位置。
主动磁悬浮轴承系统具有以下特性:
- 开不稳定性:系统本身具有开不稳定性,要求控制器必须提供足够的相位超前,以保证系统的稳定性。
- 强非线性:电磁力与电流、位移之间存在强非线性关系,使得系统参数随工作点变化,增加了控制的难度。
- 外部扰动敏感性:系统易受质量不平衡、基础振动等外部扰动的影响,导致转子产生振动,影响系统的性能和稳定性。
2.2 PID 隐式模型及优化需求
PID 控制算法通过比例、积分、微分三个环节对系统误差进行调节。在主动磁悬浮轴承中,PID 隐式模型将 PID 控制算法与系统的动态特性相结合,形成一种隐式的控制模型。然而,由于主动磁悬浮轴承系统的复杂特性,传统的 PID 控制方法难以满足系统的性能要求。
具体来说,PID 控制参数的整定是影响其控制性能的关键因素。传统的参数整定方法,如齐格勒 - 尼科尔斯法、临界比例度法等,虽然为初值选取提供了一定的指导,但在面对主动磁悬浮轴承系统的非线性和不确定性时,往往难以获得理想的控制效果。此外,PID 控制算法在处理多目标优化问题时也存在一定的局限性,难以同时满足系统的稳态精度、动态响应速度和扰动抑制能力等多方面的性能要求。
因此,需要对主动磁悬浮轴承 PID 隐式模型进行优化,以提高系统的稳定性、动态响应能力和抗干扰能力,满足高端装备对磁悬浮轴承控制系统的高性能要求。
三、双目标 UCB 控制启发式算法原理
3.1 UCB 算法基本原理
UCB 算法是一种基于“乐观原则”的启发式算法,常用于解决多臂老虎机问题。其核心思想是在探索和利用之间进行平衡,即在选择动作时,既考虑动作的历史平均收益(利用),又考虑动作的不确定性(探索)。UCB 算法通过为每个动作计算一个上界值,选择上界值最大的动作作为下一个要执行的动作。上界值的计算公式通常为:

3.2 双目标 UCB 控制启发式算法
双目标 UCB 控制启发式算法是在传统 UCB 算法的基础上,针对多目标优化问题进行改进的算法。在主动磁悬浮轴承 PID 隐式模型优化中,我们需要同时优化多个性能指标,如稳态精度、动态响应速度和扰动抑制能力等。双目标 UCB 控制启发式算法通过引入两个目标函数,分别为每个目标函数计算上界值,并综合考虑两个目标函数的上界值来选择最优的控制参数。
具体步骤如下:
- 定义目标函数:根据主动磁悬浮轴承系统的性能要求,定义两个目标函数,如稳态误差函数 J1 和动态响应时间函数 J2。
- 初始化参数:设定初始的控制参数集合,以及每个参数的试验次数和历史平均收益。
- 计算上界值:对于每个控制参数,分别计算两个目标函数的上界值 UCB1i 和 UCB2i。
- 综合评估:根据两个目标函数的上界值,采用加权求和或其他综合评估方法,计算每个控制参数的综合评估值 UCBi。
- 选择最优参数:选择综合评估值最大的控制参数作为下一个要试验的参数。
- 更新参数信息:根据试验结果,更新所选参数的试验次数和历史平均收益。
- 重复迭代:重复步骤 3 - 6,直到满足停止条件,如达到最大试验次数或收敛到最优解。
四、基准函数测试设计
4.1 基准函数的选择
基准函数是用于评估和比较优化算法性能的一组具有已知最优解的问题。在主动磁悬浮轴承 PID 隐式模型优化中,我们选择了一些常见的多峰函数和复杂函数作为基准函数,以模拟系统的非线性和多目标特性。具体选择的基准函数如下:
-
Ackley 函数:Ackley 函数是一种多峰值测试函数,具有一个明显的全局最小值,同时在其定义域内存在许多局部最小值。它常用于测试优化算法的全局搜索能力。其数学表达式为:

-
Griewank 函数:Griewank 函数是一种具有许多局部最小值的多峰函数,常用于测试算法在高维空间中搜索全局最小值的能力。其一般形式为:

-
Rosenbrock 函数:Rosenbrock 函数是一个典型的非凸、多维、非线性优化问题,常被用作测试算法在多维空间中寻找局部最小值的能力。其数学表达式为:
4.2 测试方案设计
为了评估双目标 UCB 控制启发式算法在主动磁悬浮轴承 PID 隐式模型优化中的性能,我们设计了以下测试方案:
- 参数设置:设定主动磁悬浮轴承 PID 控制器的参数范围,如比例系数 Kp、积分系数 Ki 和微分系数 Kd 的取值范围。同时,设定双目标 UCB 控制启发式算法的参数,如试验次数、停止条件等。
- 仿真模型建立:基于主动磁悬浮轴承的数学模型,建立仿真模型。在仿真模型中,将 PID 控制器与系统模型相结合,形成闭环控制系统。
- 基准函数测试:将选择的基准函数嵌入到仿真模型中,作为系统的性能指标。分别使用双目标 UCB 控制启发式算法和传统的 PID 参数整定方法对 PID 控制器的参数进行优化,记录优化过程中的性能指标,如稳态误差、动态响应时间等。
- 结果分析:对比两种方法在基准函数测试中的性能表现,分析双目标 UCB 控制启发式算法的优势和不足。同时,分析不同基准函数对算法性能的影响,为算法的进一步改进提供依据。
五、实验结果与分析
5.1 实验数据展示
在基准函数测试中,我们分别记录了双目标 UCB 控制启发式算法和传统 PID 参数整定方法在 Ackley 函数、Griewank 函数和 Rosenbrock 函数上的优化结果。实验数据如下表所示:
| 基准函数 | 优化方法 | 稳态误差 | 动态响应时间(ms) | 收敛迭代次数 |
|---|---|---|---|---|
| Ackley 函数 | 传统 PID 参数整定 | 0.025 | 12 | 50 |
| 双目标 UCB 控制启发式算法 | 0.012 | 8 | 30 | |
| Griewank 函数 | 传统 PID 参数整定 | 0.030 | 15 | 60 |
| 双目标 UCB 控制启发式算法 | 0.015 | 10 | 35 | |
| Rosenbrock 函数 | 传统 PID 参数整定 | 0.020 | 10 | 45 |
| 双目标 UCB 控制启发式算法 | 0.008 | 6 | 25 |
5.2 结果分析
从实验数据可以看出,双目标 UCB 控制启发式算法在主动磁悬浮轴承 PID 隐式模型优化中表现出明显的优势。具体分析如下:
- 稳态误差:在三个基准函数上,双目标 UCB 控制启发式算法优化后的稳态误差均小于传统 PID 参数整定方法。这表明该算法能够更精确地控制转子的位移,提高系统的稳态精度。
- 动态响应时间:双目标 UCB 控制启发式算法优化后的动态响应时间明显短于传统 PID 参数整定方法。这说明该算法能够更快地响应系统的变化,使转子迅速恢复到平衡位置,提高了系统的动态响应能力。
- 收敛迭代次数:双目标 UCB 控制启发式算法在优化过程中需要的收敛迭代次数少于传统 PID 参数整定方法。这表明该算法具有更快的收敛速度,能够更高效地找到最优的控制参数。
此外,不同基准函数对算法性能的影响也有所不同。Ackley 函数和 Griewank 函数作为多峰函数,能够更好地测试算法的全局搜索能力。双目标 UCB 控制启发式算法在这两个函数上的优化效果明显优于传统方法,说明该算法具有较强的全局搜索能力,能够避免陷入局部最小值。Rosenbrock 函数则主要测试算法在多维空间中寻找局部最小值的能力,双目标 UCB 控制启发式算法在该函数上也表现出较好的性能,进一步验证了算法的有效性。
六、结论与展望
6.1 研究结论
本文提出了一种基于双目标 UCB 控制启发式算法的主动磁悬浮轴承 PID 隐式模型优化方法,并通过基准函数测试对该方法进行了评估。研究结果表明,双目标 UCB 控制启发式算法能够有效优化 PID 控制器的参数,提高主动磁悬浮轴承系统的稳定性和动态响应能力。与传统的 PID 参数整定方法相比,该算法在稳态误差、动态响应时间和收敛迭代次数等方面均表现出明显的优势。同时,通过选择不同的基准函数进行测试,验证了该算法具有较强的全局搜索能力和处理多目标优化问题的能力。
6.2 研究展望
虽然本文的研究取得了一定的成果,但仍存在一些不足之处,需要在未来的研究中进一步改进和完善。未来的研究方向主要包括以下几个方面:
- 算法改进:进一步优化双目标 UCB 控制启发式算法,提高算法的收敛速度和搜索效率。可以考虑引入其他启发式算法的思想,如遗传算法、粒子群优化算法等,与双目标 UCB 算法相结合,形成更强大的优化算法。
- 实际应用验证:将本文提出的优化方法应用到实际的主动磁悬浮轴承系统中,进行实验验证。通过实际运行数据,进一步评估算法的性能和可靠性,为算法的工程应用提供依据。
- 多学科融合:主动磁悬浮轴承控制系统是一个涉及多个学科领域的复杂系统,未来的研究可以加强多学科的融合,如控制理论、材料科学、机械工程等,从多个角度对系统进行优化和改进,推动磁悬浮轴承技术的不断发展。
综上所述,基于双目标 UCB 控制启发式算法的主动磁悬浮轴承 PID 隐式模型优化方法具有广阔的应用前景和研究价值,有望为高端装备制造和能源技术的发展提供有力支持。
📚第二部分——运行结果








部分代码:
% DF4
t_1 = nexttile;
ax = gca;
ax.TickLabelInterpreter = 'latex';
ax.XAxis.Limits = [-0.1 4.1];
ax.XAxis.TickValues = [0 2 4];
ax.XAxis.FontSize = axis_font_size;
ax.YAxis.Limits = [-0.1 4.1];
ax.YAxis.TickValues = [0 2 4];
ax.YAxis.FontSize = axis_font_size;
ax.XLabel.String = "$f_{1}+2t$";
ax.XLabel.FontSize = 24;
ax.XLabel.Interpreter = 'latex';
ax.YLabel.String = "$f_{2}+2t$";
ax.YLabel.FontSize = 24;
ax.YLabel.Interpreter = 'latex';
t_scale = 2;
t_PF = zeros(1000,6);
tmp_p = 1;
DF_t = 0;
DF_a = sin(0.5*pi*DF_t);
DF_b = 1 + abs(cos(0.5*pi*DF_t));
DF_H_t = 1.5 + DF_a;
for tmp_j = 0:(DF_b^DF_H_t/999):DF_b^DF_H_t
tmp_f1 = tmp_j;
tmp_f2 = (DF_b - tmp_f1^(1/DF_H_t))^DF_H_t;
t_PF(tmp_p, 1) = tmp_f1;
t_PF(tmp_p, 2) = tmp_f2;
tmp_p = tmp_p + 1;
end
hold on;
tmp_p = 1;
DF_t = 0.5;
DF_a = sin(0.5*pi*DF_t);
DF_b = 1 + abs(cos(0.5*pi*DF_t));
DF_H_t = 1.5 + DF_a;
for tmp_j = 0:(DF_b^DF_H_t/999):DF_b^DF_H_t
tmp_f1 = tmp_j;
tmp_f2 = (DF_b - tmp_f1^(1/DF_H_t))^DF_H_t;
t_PF(tmp_p, 3) = tmp_f1;
t_PF(tmp_p, 4) = tmp_f2;
tmp_p = tmp_p + 1;
end
hold on;
tmp_p = 1;
DF_t = 1;
DF_a = sin(0.5*pi*DF_t);
DF_b = 1 + abs(cos(0.5*pi*DF_t));
DF_H_t = 1.5 + DF_a;
for tmp_j = 0:(DF_b^DF_H_t/999):DF_b^DF_H_t
tmp_f1 = tmp_j;
tmp_f2 = (DF_b - tmp_f1^(1/DF_H_t))^DF_H_t;
t_PF(tmp_p, 5) = tmp_f1;
t_PF(tmp_p, 6) = tmp_f2;
tmp_p = tmp_p + 1;
end
hold on;
avg1 = benchmark_UCBCHA(@DF4, @UCBCHA_P, 300, 100, [2, -2, 2, -2], [0.5, 0.5], t_PF, 'is_random_start', 1, ...
't_period', 100, 't_step', 0.5, 'well_function', @w_vf_DF4, 't_scale', 2, 'is_reverse_draw', 0);
% fprintf(fid, "average GD in DF4 benchmark\n");
% fprintf(fid, num2str(avg1, "%f "));
% fprintf(fid, "\n");
plot(t_PF(:, 1) + 2*0, t_PF(:, 2) + 2*0, 'Color', [245/255, 156/255, 124/255], 'LineWidth', line_width);
hold on;
plot(t_PF(:, 3) + 2*0.5, t_PF(:, 4) + 2*0.5, 'Color', [253/255, 237/255, 149/255], 'LineWidth', line_width);
hold on;
plot(t_PF(:, 5) + 2*1, t_PF(:, 6) + 2*1, 'Color', [161/255, 216/255, 232/255], 'LineWidth', line_width);
hold on;
% DF5
t_2 = nexttile;
ax = gca;
ax.TickLabelInterpreter = 'latex';
ax.XAxis.Limits = [-0.1 2.6];
ax.XAxis.TickValues = [0 1.25 2.5];
ax.XAxis.FontSize = axis_font_size;
ax.YAxis.Limits = [-0.1 2.6];
ax.YAxis.TickValues = [0 1.25 2.5];
ax.YAxis.FontSize = axis_font_size;
ax.XLabel.String = "$f_{1}+t$";
ax.XLabel.FontSize = 24;
ax.XLabel.Interpreter = 'latex';
ax.YLabel.String = "$f_{2}+t$";
ax.YLabel.FontSize = 24;
ax.YLabel.Interpreter = 'latex';
t_PF = zeros(1000,6);
tmp_p = 1;
DF5_t = 0;
DF5_G = sin(0.5*pi*DF5_t);
for tmp_j = 0:1/999:1
[tmp_f1, tmp_f2] = DF5(tmp_j, DF5_G, DF5_t);
t_PF(tmp_p, 1) = tmp_f1;
t_PF(tmp_p, 2) = tmp_f2;
tmp_p = tmp_p + 1;
end
tmp_p = 1;
DF5_t = 0.5;
DF5_G = sin(0.5*pi*DF5_t);
for tmp_j = 0:1/999:1
[tmp_f1, tmp_f2] = DF5(tmp_j, DF5_G, DF5_t);
t_PF(tmp_p, 3) = tmp_f1;
t_PF(tmp_p, 4) = tmp_f2;
tmp_p = tmp_p + 1;
end
tmp_p = 1;
DF5_t = 1;
DF5_G = sin(0.5*pi*DF5_t);
for tmp_j = 0:1/999:1
[tmp_f1, tmp_f2] = DF5(tmp_j, DF5_G, DF5_t);
t_PF(tmp_p, 5) = tmp_f1;
t_PF(tmp_p, 6) = tmp_f2;
tmp_p = tmp_p + 1;
end
[avg1, ~, ~, ~] = benchmark_UCBCHA(@DF5, @UCBCHA_P, 300, 100, [1, 0, 1, -1], [0.5, 0.5], t_PF, 'is_random_start', 1, ...
't_period', 100, 't_step', 0.5, 'well_function', @w_vf_DF, 't_scale', 1);
% fprintf(fid, "average GD in DF5 benchmark\n");
% fprintf(fid, num2str(avg1, "%f "));
% fprintf(fid, "\n");
% %disp("average GD in DF5 benchmark");
% %disp(avg1);
plot(t_PF(:, 1) + 2*0/2, t_PF(:, 2) + 2*0/2, 'Color', [245/255, 156/255, 124/255], 'LineWidth', line_width);
hold on;
plot(t_PF(:, 3) + 2*0.5/2, t_PF(:, 4) + 2*0.5/2, 'Color', [253/255, 237/255, 149/255], 'LineWidth', line_width);
hold on;
plot(t_PF(:, 5) + 2*1/2, t_PF(:, 6) + 2*1/2, 'Color', [161/255, 216/255, 232/255], 'LineWidth', line_width);
hold on;
% DF6
t_3 = nexttile;
ax = gca;
ax.TickLabelInterpreter = 'latex';
ax.XAxis.Limits = [-0.1 1.1];
ax.XAxis.TickValues = [0 0.5 1 1.5 2 2.5 3];
ax.XAxis.FontSize = axis_font_size;
ax.YAxis.Limits = [-0.1 1.1];
ax.YAxis.TickValues = [0 0.5 1 1.5 2 2.5 3];
ax.YAxis.FontSize = axis_font_size;
ax.XLabel.String = "$f_{1}$";
ax.XLabel.FontSize = 24;
ax.XLabel.Interpreter = 'latex';
ax.YLabel.String = "$f_{2}$";
ax.YLabel.FontSize = 24;
ax.YLabel.Interpreter = 'latex';
t_PF = zeros(1000,6);
tmp_p = 1;
DF6_t = 0;
DF6_G = sin(0.5*pi*DF6_t);
for tmp_j = 0:1/999:1
[tmp_f1, tmp_f2] = DF6(tmp_j, DF6_G, DF6_t);
t_PF(tmp_p, 1) = tmp_f1;
t_PF(tmp_p, 2) = tmp_f2;
tmp_p = tmp_p + 1;
end
tmp_p = 1;
DF6_t = 0.5;
DF6_G = sin(0.5*pi*DF6_t);
for tmp_j = 0:1/999:1
[tmp_f1, tmp_f2] = DF6(tmp_j, DF6_G, DF6_t);
t_PF(tmp_p, 3) = tmp_f1;
t_PF(tmp_p, 4) = tmp_f2;
tmp_p = tmp_p + 1;
end
tmp_p = 1;
DF6_t = 1;
DF6_G = sin(0.5*pi*DF6_t);
for tmp_j = 0:1/999:1
[tmp_f1, tmp_f2] = DF6(tmp_j, DF6_G, DF6_t);
t_PF(tmp_p, 5) = tmp_f1;
t_PF(tmp_p, 6) = tmp_f2;
tmp_p = tmp_p + 1;
end
[avg1, ~, ~, ~] = benchmark_UCBCHA(@DF6, @UCBCHA_P, 300, 100, [1, 0, 1, -1], [0.5, 0.5], t_PF, 'is_random_start', 1, ...
't_period', 100, 't_step', 0.5, 'well_function', @w_vf_DF);
% fprintf(fid, "average GD in DF6 benchmark\n");
% fprintf(fid, num2str(avg1, "%f "));
% fprintf(fid, "\n");
plot(t_PF(:, 1), t_PF(:, 2), 'Color', [245/255, 156/255, 124/255], 'LineWidth', line_width);
hold on;
plot(t_PF(:, 3), t_PF(:, 4), 'Color', [253/255, 237/255, 149/255], 'LineWidth', line_width);
hold on;
plot(t_PF(:, 5), t_PF(:, 6), 'Color', [161/255, 216/255, 232/255], 'LineWidth', line_width);
hold on;
% Legend
t_4 = nexttile;
p1 = plot(0,0, 'Color', [245/255, 156/255, 124/255], 'LineWidth', line_width);
hold on;
p2 = plot(0,0, 'Color', [253/255, 237/255, 149/255], 'LineWidth', line_width);
hold on;
p3 = plot(0,0, 'Color', [161/255, 216/255, 232/255], 'LineWidth', line_width);
hold on;
s1 = scatter(0,0,30,colors(1,:),"filled");
s2 = scatter(0,0,30,colors(2,:),"filled");
s3 = scatter(0,0,30,colors(3,:),"filled");
ax = gca;
ax.TickLabelInterpreter = 'latex';
ax.XAxis.Limits = [-100 100];
ax.XAxis.TickValues = [];
ax.XAxis.Visible = 'off';
ax.YAxis.Limits = [-100 100];
ax.YAxis.TickValues = [];
ax.YAxis.Visible = 'off';
lgd = legend(t_4,[p1, s1, p2, s2, p3, s3], {'true PF ($t = 0$)', 'solutions($t = 0$)', 'true PF ($t = 0.5$)', 'solutions($t = 0.5$)$\ $', 'true PF ($t = 1$)', 'solutions($t = 1$)'});
lgd.Interpreter = 'latex';
lgd.FontSize = 24;
lgd.Location = "layout";
% fclose(fid);
🎉第三部分——参考文献
文章中一些内容引自网络,会注明出处或引用为参考文献,难免有未尽之处,如有不妥,请随时联系删除。(文章内容仅供参考,具体效果以运行结果为准)
🌈第四部分——Matlab代码实现
资料获取,更多粉丝福利,MATLAB|Simulink|Python资源获取


178

被折叠的 条评论
为什么被折叠?



