Matlab/Simulink - BLDC直流无刷电机仿真基础教程(五) - animateRotorPosition脚本讲解与使用
Matlab/Simulink - BLDC直流无刷电机仿真基础教程(五) - animateRotorPosition脚本讲解与使用
- 前言
- 一、animateRotorPosition脚本内容
- 二、脚本功能讲解
- 三、脚本修改与模型配置
- 四、可视化效果展示
- 五、修改后脚本内容
- 文章相关模型文件下载链接
- 参考链接
前言
本系列文章分享如何使用Matlab的Simulink功能来进行BLDC直流无刷电机的基础仿真;本篇文章讲解官方animateRotorPosition.m
脚本文件的功能与使用。
文章内容主要参考Matlab官网的BLDC仿真视频教程,主要是对官方视频教程的进一步详细说明,以及对BLDC电机控制原理、仿真过程部分问题点的简要讲解,希望大家通过此系列文章可以掌握Matlab电机仿真的基本技术,并在后续能够按照需要搭建更复杂的模型。
官方视频教程地址如下:
https://ww2.mathworks.cn/videos/series/how-to-design-motor-controllers-using-simscape-electrical.html
相关演示操作在Matlab2023b中进行。
一、animateRotorPosition脚本内容
该脚本文件的官方github链接如下:
https://github.com/mathworks/Design-motor-controllers-with-Simscape-Electrical/blob/master/2%20Modeling%20a%20three%20phase%20inverter/animateRotorPosition.m
也可以进入到matlab官方github仓库,获取相关系列视频里的模型文件,与本系列文章前面几章搭建的模型基本相同;仓库地址为:
https://github.com/mathworks/Design-motor-controllers-with-Simscape-Electrical
这里为方便演示,将官方可视化脚本的文件内容复制到这里,内容如下:
(注意,官方github仓库在第二、第三章节对应文件夹中各有一个名称为animateRotorPosition.m
的脚本,内容略有区别,请自行查看了解。此处展示的脚本文件内容是第二章节 Modeling a three phase inverter 对应的文件)
%Copyright 2019 The MathWorks, Inc.
%% animateRotorPosition
%
% This script will run a Simulink model of a BLDC that is energized in
% one coil and animate the movement of the rotor. Once the animation figure
% is rendered, there is a 5 second pause before the animation begins.close all
clear% Below parameters are defined in the Simulink model
% Sample time
% Ts = 1e-5;
% Number of pole pairs
% p = 1;
% Initial rotor angle in degrees
% th0 = 0;
% Sector
% sector = 6;mdl = 'Modeling_three_phase_inverter';open_system(mdl);sim(mdl)try
%
r = 1.2;
theta = linspace(0,2*pi);
x = cos(theta);
y = sin(theta);x1 = 0.8*cos(theta);
y1 = 0.8*sin(theta);xa = cos(0);
ya = sin(0);xb = cos(2*pi/3);
yb = sin(2*pi/3);xc = cos(-2*pi/3);
yc = sin(-2*pi/3);xat = r*cos(0);
yat = r*sin(0);xbt = r*cos(2*pi/3);
ybt = r*sin(2*pi/3);xct = r*cos(-2*pi/3);
yct = r*sin(-2*pi/3);hf = figure(1);h = plot(x,y,'k-',[0 xa],[0 ya],'k-',[0 xb],[0 yb],'k-',[0 xc],[0 yc],'k-',xa,ya,'ko',xb,yb,'ko',xc,yc,'ko',x1,y1,'k-');gridset(hf,'Color',[1 1 1])ha = gca;set(ha,'Visible','off')ht1 = text(xat,yat,'A');
ht2 = text(xbt,ybt,'B');
ht3 = text(xct,yct,'C');set(ht1,'FontSize',14);
set(ht2,'FontSize',14);
set(ht3,'FontSize',14);axis([-1.2 1.2 -1.2 1.2])
axis equalset(h(5),'MarkerSize',20)
set(h(6),'MarkerSize',20)
set(h(7),'MarkerSize',20)switch_pattern = logsout{2}.Values.Data(1:20:end,:);init_switch_pattern = num2str(switch_pattern(1,:));switch init_switch_patterncase num2str([1 0 0 0 0 1])set(h(5),'MarkerFaceColor',[1 0 0])set(h(7),'MarkerFaceColor',[0 0 1])case num2str([0 0 1 0 0 1])set(h(6),'MarkerFaceColor',[1 0 0])set(h(7),'MarkerFaceColor',[0 0 1])case num2str([0 1 1 0 0 0])set(h(5),'MarkerFaceColor',[0 0 1])set(h(6),'MarkerFaceColor',[1 0 0])case num2str([0 1 0 0 1 0])set(h(5),'MarkerFaceColor',[0 0 1])set(h(7),'MarkerFaceColor',[1 0 0])case num2str([0 0 0 1 1 0])set(h(6),'MarkerFaceColor',[0 0 1])set(h(7),'MarkerFaceColor',[1 0 0])case num2str([1 0 0 1 0 0])set(h(5),'MarkerFaceColor',[1 0 0])set(h(6),'MarkerFaceColor',[0 0 1])endl1 = 0.7;
ro = logsout{1}.Values.Data(1)*pi/180;xr1 = l1*cos(ro);
yr1 = l1*sin(ro);
xr2 = -l1*cos(ro);
yr2 = -l1*sin(ro);hold on,hl1 = plot([xr1 xr2],[yr1 yr2],'m-');set(hl1,'LineWidth',3)hpr = plot(xr2,yr2,'ko');
hpb = plot(xr1,yr1,'ko');set(hpr,'MarkerSize',20)
set(hpb,'MarkerSize',20)
set(hpr,'MarkerFaceColor',[1 0 0])
set(hpb,'MarkerFaceColor',[0 0 1])pausero1 = logsout{1}.Values.Data(1:40:end);for l = 1:numel(ro1)switch_pattern1 = num2str(switch_pattern);ro = ro1(l)*pi/180;xr1 = l1*cos(ro);
yr1 = l1*sin(ro);
xr2 = -l1*cos(ro);
yr2 = -l1*sin(ro);set(hpr,'XData',xr2);
set(hpr,'YData',yr2);
set(hpb,'XData',xr1);
set(hpb,'YData',yr1);set(hl1,'XData',[xr1 xr2]);
set(hl1,'YData',[yr1 yr2]);switch switch_pattern1case num2str([1 0 0 0 0 1])set(h(5),'MarkerFaceColor',[1 0 0])set(h(7),'MarkerFaceColor',[0 0 1])case num2str([0 0 1 0 0 1])set(h(6),'MarkerFaceColor',[1 0 0])set(h(7),'MarkerFaceColor',[0 0 1])case num2str([0 1 1 0 0 0])set(h(5),'MarkerFaceColor',[0 0 1])set(h(6),'MarkerFaceColor',[1 0 0])case num2str([0 1 0 0 1 0])set(h(5),'MarkerFaceColor',[0 0 1])set(h(7),'MarkerFaceColor',[1 0 0])case num2str([0 0 0 1 1 0])set(h(6),'MarkerFaceColor',[0 0 1])set(h(7),'MarkerFaceColor',[1 0 0])case num2str([1 0 0 1 0 0])set(h(5),'MarkerFaceColor',[1 0 0])set(h(6),'MarkerFaceColor',[0 0 1])enddrawnowendcatchdisp("The animation was closed before the end of the simulated data")end
不过注意,这个脚本文件主要适配官方搭建的模型,我们前面文章系列搭建的模型如果想要进行可视化,还需要一些额外的配置。
二、脚本功能讲解
以下内容修改于deepseek回答。
部分未讲解内容请查找matlab相关教程进行学习,自学能力很重要。
以下是该 MATLAB 脚本的功能解析及关键代码的分步讲解:
脚本总体功能
这是一个用于 无刷直流电机(BLDC)转子位置动画演示 的脚本,通过 Simulink 模型仿真电机运行,并动态可视化以下内容:
- 转子位置:磁极方向随仿真时间的变化。
- 定子线圈通电状态:通过颜色标记当前通电的线圈(红色为通电,蓝色为断电)。
- 三相逆变器开关模式:通过六个开关状态控制电流方向。
关键代码分步解析
1. 初始化环境
close all
clear
close all
:关闭所有图形窗口。clear
:清空工作区变量,确保脚本从干净环境运行。
2. 加载并运行 Simulink 模型
mdl = 'Modeling_three_phase_inverter';
open_system(mdl);
sim(mdl)
mdl
:指定 Simulink 模型名称Modeling_three_phase_inverter
。open_system(mdl)
:打开模型界面(如果存在图形界面)。sim(mdl)
:运行模型,生成仿真数据(存储在logsout
变量中)。
3. 绘制静态图形(定子与标签)
r = 1.2;
theta = linspace(0,2*pi);
x = cos(theta);
y = sin(theta);
...
hf = figure(1);
h = plot(x,y,'k-',[0 xa],[0 ya],'k-',...);
- 功能:绘制定子的静态图形,包括:
- 外圆(半径 1.2)和内圆(半径 0.8)。
- 三个相位点
A
,B
,C
(坐标分别对应0°
,120°
,-120°
)。
- 图形元素:
- 黑色线条 (
'k-'
):定子框架。 - 黑色圆圈 (
'ko'
):三相线圈位置。
- 黑色线条 (
4. 设置开关状态颜色(初始状态)
switch_pattern = logsout{2}.Values.Data(1:20:end,:);
init_switch_pattern = num2str(switch_pattern(1,:));
switch init_switch_patterncase num2str([1 0 0 0 0 1])set(h(5),'MarkerFaceColor',[1 0 0]) % A红set(h(7),'MarkerFaceColor',[0 0 1]) % C蓝...
end
- 功能:从仿真数据
logsout
中提取开关状态(logsout{2}
),并根据初始状态设置线圈颜色。 - 关键参数:
switch_pattern
:三相逆变器的 6 个开关状态(如[1 0 0 0 0 1]
)。num2str
:将开关状态转换为字符串,用于switch-case
判断。
- 颜色规则:
- 红色 (
[1 0 0]
):通电线圈。 - 蓝色 (
[0 0 1]
):断电线圈。
- 红色 (
5. 绘制转子动态轴线
ro = logsout{1}.Values.Data(1)*pi/180;
xr1 = l1*cos(ro);
yr1 = l1*sin(ro);
...
hl1 = plot([xr1 xr2],[yr1 yr2],'m-');
hpr = plot(xr2,yr2,'ko');
hpb = plot(xr1,yr1,'ko');
- 功能:根据仿真数据
logsout{1}
中的转子角度(单位:度),绘制转子轴线。 - 图形元素:
- 洋红色线条 (
'm-''
):转子轴线。 - 红色圆点 (
hpr
):转子南极(假设为红色)。 - 蓝色圆点 (
hpb
):转子北极(假设为蓝色)。
- 洋红色线条 (
6. 动态更新动画
ro1 = logsout{1}.Values.Data(1:40:end);
for l = 1:numel(ro1)switch_pattern1 = num2str(switch_pattern);ro = ro1(l)*pi/180;...set(hpr,'XData',xr2); % 更新转子位置set(hpb,'YData',yr1);...drawnow % 刷新图形
end
- 功能:循环遍历转子角度数据 (
ro1
),动态更新:- 转子轴线位置 (
set(hpr, 'XData', ...)
)。 - 线圈通电颜色 (
switch-case
判断开关状态)。
- 转子轴线位置 (
- 关键参数:
1:40:end
:数据降采样,控制动画速度。drawnow
:强制刷新图形界面,形成动画效果。
异常处理
catchdisp("The animation was closed before the end of the simulated data")
end
- 功能:捕获用户提前关闭动画窗口的异常,避免报错。
关键仿真数据说明
logsout{1}
:转子角度数据(单位:度),用于计算转子位置。logsout{2}
:三相逆变器的开关状态(6位二进制数组),控制线圈通电逻辑。
使用场景
- 电机控制教学:可视化 BLDC 电机工作原理。
- 控制算法验证:通过动画观察开关策略对转子运动的影响。
- 动态调试:检查仿真结果是否符合预期(如转子是否按设定方向旋转)。
三、脚本修改与模型配置
在使用其脚本对我们的模型转子位置及逆变器通电状态进行演示前,我们可以先运行一下官方模型及脚本,来简单的查看其效果。
进入官方github仓库,到第二章节对应文件夹中,下载如图红框选中的两项文件,分别是官方的simulink仿真模型文件及可视化脚本。
将两个文件下载后,放置到同一文件夹下,使用matlab打开animateRotorPosition.m
脚本,并点击运行(确保matlab目录为同一文件夹,能够识别到官方的simulink放置模型文件)。
随后matlab将会自动运行simulink放置模型文件,之后弹出如图所示的窗口,鼠标点击一下窗口,按下回车(由于原始代码中存在pause语句,因此需要手动回车以继续脚本的执行。),即可看到电机转子的旋转情况。
如上图所示,点击转子位置由初始的0°,旋转到了30°,仔细看可以看到转子在最终暂停到目标位置前,有一个幅度逐渐衰减的震荡。
此时在matlab界面右侧的工作区,可以看到脚本运行完毕后,出现了很多变量,我们在之后将会稍作分析。
我们要了解,这个.m的可视化脚本在运行时,会首先运行simulink仿真模型文件,之后再根据仿真模型的输出来进行可视化;因此我们这里首先来查看一下官方的simulink模型运行后会有什么结果。
运行模型后,我们在工作区右侧可以看到出现了一些新的变量,其中logsout
变量正是我们的可视化脚本所需要用到的,因此对其进行进一步的查看。
工作区双击要查看的logsout
变量,即可查看其内部的数据情况,可以看到这个数据集变量里面有两个信号,名称分别是theta
、swichPattern
,其中前者即是电机转子的角度位置,后者则是逆变器的通电状态,这也正是可视化脚本所要进行可视化的两个信号。
在第三篇系列文章中,我们搭建了一个带有基础速度环的BLDC模型(为便于展示,暂时不使用带PWM调制模块的模型),如下图所示。
为了将模型运行过程中的电机转子角度位置、逆变器开关状态等信号保存、导出,我们需要进行如下的操作:
切换到Hall Sensor
模块,鼠标放置到转子角度位置上,右键后在列表中点击"记录所选信号"。
之后,我们可以看到对应位置出现了一个信号的标志,表示此处的信号在之后运行过程会进行记录并输出到工作区。
对于逆变器开关状态信号,我们可以进入到Three-Phase Inverter
模块,对模块输入的逆变器开关状态信号的信号线进行相同的操作。
注:我们可以通过双击信号线来设置对应信号的名称。
此时运行我们的模型,可以看到工作区出现了一个名为out
的值。
打开之后,情况如下所示,可以看到与官方的simulink仿真模型的输出略有不同。
关于这一点,是由于我们的模型设置方面略有差异。
为了使我们的模型输出与官方模型一致,我们需要在“建模”一栏中,点击“模型设置”按钮。
随后在模型设置界面,在“数据导入/导出”一栏中,将下方的“单一仿真输出”一栏取消勾选,这个功能的含义即是使我们的仿真模型运行后只输出一个变量out
。
取消勾选后,如下图所示。
此时,我们再次运行仿真模型,输出与官方模型一致。
接下来,我们还需要对官方提供的animateRotorPosition.m
脚本文件进行一定的修改,才能够按照我们的预期来可视化转子位置角度、逆变器状态。
这里我们可以简单学习一下matlab脚本的调试方法;在脚本界面,可以点击左侧的行号,此时对应行号上将会出现一个红色的方框,表示稍后我们运行脚本时,将会在此处暂停,也就是在这里打了一个断点。
我们点击运行后,程序运行到对应行号会自动暂停,此时,我们可以看到上方的相关按钮发生了改变,我们可以点击“步进”按钮,来控制程序员一行一行的运行,方便我们梳理程序的运行次序以及过程中各个变量的变化情况。(这里建议不太熟悉相关功能的朋友多多尝试、学习,多多受挫,即是多多收获。)
这里简单展示一下本人对该可视化脚本的修改。
- 修改脚本文件中指定的simnulink仿真模型名称为自己希望进行可视化的模型名称。(如下几个步骤的配图,上方是原始脚本的代码,下方是修改后的脚本内容。)
- 修改相关变量的取样间隔,使逆变器状态变量与转子角度位置变量的数目一致。
- 修改可视化过程相关节点的颜色修改代码。
(主要参考官方github仓库第三章对应文件夹里面的脚本内容。)
- 在
for
循环后添加pause(0.1)
语句,降低动画的速度,并完善逆变器状态变量的获取处理。
- 修改
for
循环中相关节点的颜色修改代码。
(主要参考官方github仓库第三章对应文件夹里面的脚本内容。)
四、可视化效果展示
为了便于演示,我们这里修改simulink仿真模型给定的速度参考值,使转子旋转的速度比较稳定。
接下来,我们运行修改后的animateRotorPosition
脚本,将会看到如下效果,可以结合转子及三相的颜色,来了解BLDC电机旋转过程中应当如何改变逆变器的通电状态。
五、修改后脚本内容
此处为方便大家学习、对照,将修改后的脚本内容放置于此。
%Copyright 2019 The MathWorks, Inc.
%% animateRotorPosition
%
% This script will run a Simulink model of a BLDC that is energized in
% one coil and animate the movement of the rotor.close all
clear% Below parameters are defined in the Simulink model
% Sample time
% Ts = 1e-5;
% Number of pole pairs
% p = 1;
% Initial rotor angle in degrees
% th0 = 0;
% Sector
% sector = 6;mdl = 'BLDC_DRIVER_BASIC_SPEED_LOOP_visulization';open_system(mdl);sim(mdl)try
%
r = 1.2;
theta = linspace(0,2*pi);
x = cos(theta);
y = sin(theta);x1 = 0.8*cos(theta);
y1 = 0.8*sin(theta);xa = cos(0);
ya = sin(0);xb = cos(2*pi/3);
yb = sin(2*pi/3);xc = cos(-2*pi/3);
yc = sin(-2*pi/3);xat = r*cos(0);
yat = r*sin(0);xbt = r*cos(2*pi/3);
ybt = r*sin(2*pi/3);xct = r*cos(-2*pi/3);
yct = r*sin(-2*pi/3);hf = figure(1);h = plot(x,y,'k-',[0 xa],[0 ya],'k-',[0 xb],[0 yb],'k-',[0 xc],[0 yc],'k-',xa,ya,'ko',xb,yb,'ko',xc,yc,'ko',x1,y1,'k-');gridset(hf,'Color',[1 1 1])ha = gca;set(ha,'Visible','off')ht1 = text(xat,yat,'A');
ht2 = text(xbt,ybt,'B');
ht3 = text(xct,yct,'C');set(ht1,'FontSize',14);
set(ht2,'FontSize',14);
set(ht3,'FontSize',14);axis([-1.2 1.2 -1.2 1.2])
axis equalset(h(5),'MarkerSize',20)
set(h(6),'MarkerSize',20)
set(h(7),'MarkerSize',20)switch_pattern = logsout{2}.Values.Data(1:40:end,:);init_switch_pattern = num2str(switch_pattern(1,:));switch init_switch_patterncase num2str([1 0 0 0 0 1])set(h(5),'MarkerFaceColor',[1 0 0])set(h(7),'MarkerFaceColor',[0 0 1])set(h(6),'MarkerFaceColor',[1 1 1])case num2str([0 0 1 0 0 1])set(h(6),'MarkerFaceColor',[1 0 0])set(h(7),'MarkerFaceColor',[0 0 1])set(h(5),'MarkerFaceColor',[1 1 1])case num2str([0 1 1 0 0 0])set(h(5),'MarkerFaceColor',[0 0 1])set(h(6),'MarkerFaceColor',[1 0 0])set(h(7),'MarkerFaceColor',[1 1 1])case num2str([0 1 0 0 1 0])set(h(5),'MarkerFaceColor',[0 0 1])set(h(7),'MarkerFaceColor',[1 0 0])set(h(6),'MarkerFaceColor',[1 1 1])case num2str([0 0 0 1 1 0])set(h(6),'MarkerFaceColor',[0 0 1])set(h(7),'MarkerFaceColor',[1 0 0])set(h(5),'MarkerFaceColor',[1 1 1])case num2str([1 0 0 1 0 0])set(h(5),'MarkerFaceColor',[1 0 0])set(h(6),'MarkerFaceColor',[0 0 1])set(h(7),'MarkerFaceColor',[1 1 1])endl1 = 0.7;
ro = logsout{1}.Values.Data(1)*pi/180;xr1 = l1*cos(ro);
yr1 = l1*sin(ro);
xr2 = -l1*cos(ro);
yr2 = -l1*sin(ro);hold on,hl1 = plot([xr1 xr2],[yr1 yr2],'m-');set(hl1,'LineWidth',3)hpr = plot(xr2,yr2,'ko');
hpb = plot(xr1,yr1,'ko');set(hpr,'MarkerSize',20)
set(hpb,'MarkerSize',20)
set(hpr,'MarkerFaceColor',[1 0 0])
set(hpb,'MarkerFaceColor',[0 0 1])pausero1 = logsout{1}.Values.Data(1:40:end);for l = 1:numel(ro1)pause(0.1)switch_pattern1 = num2str(switch_pattern(l,:));ro = ro1(l)*pi/180;xr1 = l1*cos(ro);
yr1 = l1*sin(ro);
xr2 = -l1*cos(ro);
yr2 = -l1*sin(ro);set(hpr,'XData',xr2);
set(hpr,'YData',yr2);
set(hpb,'XData',xr1);
set(hpb,'YData',yr1);set(hl1,'XData',[xr1 xr2]);
set(hl1,'YData',[yr1 yr2]);switch switch_pattern1case num2str([1 0 0 0 0 1])set(h(5),'MarkerFaceColor',[1 0 0])set(h(6),'MarkerFaceColor',[1 1 1])set(h(7),'MarkerFaceColor',[0 0 1])case num2str([0 0 1 0 0 1])set(h(6),'MarkerFaceColor',[1 0 0])set(h(7),'MarkerFaceColor',[0 0 1])set(h(5),'MarkerFaceColor',[1 1 1])case num2str([0 1 1 0 0 0])set(h(5),'MarkerFaceColor',[0 0 1])set(h(6),'MarkerFaceColor',[1 0 0])set(h(7),'MarkerFaceColor',[1 1 1])case num2str([0 1 0 0 1 0])set(h(5),'MarkerFaceColor',[0 0 1])set(h(7),'MarkerFaceColor',[1 0 0])set(h(6),'MarkerFaceColor',[1 1 1])case num2str([0 0 0 1 1 0])set(h(6),'MarkerFaceColor',[0 0 1])set(h(7),'MarkerFaceColor',[1 0 0])set(h(5),'MarkerFaceColor',[1 1 1])case num2str([1 0 0 1 0 0])set(h(5),'MarkerFaceColor',[1 0 0])set(h(6),'MarkerFaceColor',[0 0 1])set(h(7),'MarkerFaceColor',[1 1 1])enddrawnowendcatchdisp("The animation was closed before the end of the simulated data")end
下一篇文章中,我们将会对仿真模型各种情况下的波形进行重点分析。
文章相关模型文件下载链接
通过网盘分享的文件:BLDC直流无刷电机仿真基础教程(五) - animateRotorPosition脚本讲解与使用
链接: https://pan.baidu.com/s/1ld_d9TDVztWcLyAUgokNpg?pwd=bu2r 提取码: bu2r
参考链接
Design-motor-controllers-with-Simscape-Electrical
MATLAB 教程
matlab——simulink从工作空间导入数据作为输入信号进行仿真
深入研究simulink仿真之信号标签
matlab帮助中心 - pause
相关文章:
Matlab/Simulink - BLDC直流无刷电机仿真基础教程(五) - animateRotorPosition脚本讲解与使用
Matlab/Simulink - BLDC直流无刷电机仿真基础教程(五) - animateRotorPosition脚本讲解与使用 前言一、animateRotorPosition脚本内容二、脚本功能讲解三、脚本修改与模型配置四、可视化效果展示五、修改后脚本内容文章相关模型文件下载链接参考链接 前言…...
安川机器人常见故障报警及解决办法
机器人权限设置 操作权限设置(如果密码不对,就证明密码被人修改) 编辑模式密码:无(一把钥匙,默认) 管理模式密码:999999999(9个9,二把钥匙) 安全模式密码:555555555(9个5,三把钥匙,权限最高,有的型号机器人,没有此模式,但最高密码为安全模式密码) 示教器…...
【Quest开发】极简版!透视环境下抠出身体并能遮挡身体上的服装
前两天发了一个很复杂的版本,又鼓捣了一下发现完全没有必要。我之前的理解有点偏(不是错误的但用法错了),但是有一些小伙伴收藏了,害怕里面的某些东西对谁有用,所以写了一篇新的,前两步配置环境…...
【Github仓库】Learn-Vim随笔
一、前言 学习vim的过程中发现了很多很好的资源,其中不乏bilibili上up主的精品教程。也在YouTube上看过很多教程。但Learn-Vim这个Github仓库实在让我受益良多。 本笔记便是出于此仓库: 仓库地址 附上个人.vimrc配置文件: syntax on " 开启语法高…...
【2025五一数学建模竞赛C题】社交媒体平台用户分析问题|建模过程+完整代码论文全解全析
你是否在寻找数学建模比赛的突破点?数学建模进阶思路! 作为经验丰富的美赛O奖、国赛国一的数学建模团队,我们将为你带来本次数学建模竞赛的全面解析。这个解决方案包不仅包括完整的代码实现,还有详尽的建模过程和解析,…...
Wireshark抓取SMTP协议报文
文章目录 1. 实验:网络仿真软件使用及网络分析2. SMTP协议2.1 SMTP协议简介2.2 SMTP协议的核心功能2.3 SMTP的相关命令和作用 3. Wireshark抓取报文3.1 抓取SMTP协议报文流程3.1.1 Email邮件服务器背景3.1.2 具体实现流程 3.2 过滤SMTP协议相关报文 4. 协议时序图4.…...
PS学习笔记(一)
课程地址:【B站第一!】央美大佬198小时讲完的PS教程,全程干货无废话!学完秒变大神!还学不会,我不教设计了!!_哔哩哔哩_bilibili 第一章:基础知识 1.PS认识 一、PS应用领…...
部署.NET6.0 Web API项目到Docker
文章目录 介绍创建.NET WebAPI项目项目打包项目部署文件准备部署命令可能的问题与解决 介绍 使用VS2022创建一个.NET6的Web API项目,将其打包,并部署到Linux服务器上的Docker中。 Linux和Docker环境已经备好,本文不再赘述,主要记…...
前端函数防抖(Debounce)完整讲解 - 从原理、应用到完整实现
🌷 古之立大事者,不惟有超世之才,亦必有坚忍不拔之志 🎐 个人CSND主页——Micro麦可乐的博客 🐥《Docker实操教程》专栏以最新的Centos版本为基础进行Docker实操教程,入门到实战 🌺《RabbitMQ》…...
React Redux 与 Zustand
Redux 一、Redux 核心概念 1. 为什么需要 Redux? 解决的问题:在大型 React 应用中,跨组件共享状态、管理复杂数据流。 优势: 单一数据源:全局状态集中存储在 Store 中。 可预测性:通过严格的规则&#…...
Webug4.0靶场通关笔记07- 第9关反射XSS和第10关存储XSS
目录 第09关 反射型XSS 1.打开靶场 2.源码分析 3.渗透实战 第10关 存储型XSS 1.打开靶场 2.源码分析 3.渗透实战 本系列为通过《Webug4.0靶场通关笔记》的渗透集合,本文为反射型和存储型XSS漏洞关卡的渗透部分,通过对XSS关卡源码的代码审计找到漏…...
react学习笔记4——React UI组件库与redux
流行的开源React UI组件库 material-ui(国外) 官网: http://www.material-ui.com/#/github: GitHub - mui/material-ui: Material UI: Comprehensive React component library that implements Googles Material Design. Free forever. ant-design(国内蚂蚁金服) 官网: Ant…...
Java学习手册:Spring 事务管理
一、事务管理的概念 事务是一组操作的集合,这些操作要么全部成功,要么全部失败。事务管理的目的是保证数据的一致性和完整性。在数据库操作中,事务管理尤为重要,例如银行转账、订单支付等场景都需要事务管理来确保数据的正确性。…...
SpringBoot研究生双选系统开发实现
概述 SpringBoot研究生双选信息发布系统,该系统实现了研究生与导师双向选择的全流程管理,采用主流SpringBoot框架开发,是学习企业级教育管理系统开发的优质资源。适合作为计算机专业设计项目或高校信息化建设参考,完整实现…...
springboot中异步接口实现所有方式_20250501
几种异步接口实现demo package org.dromara.controller.app;// 导入必要的依赖库import cn.dev33.satoken.annotation.SaIgnore; import lombok.extern.slf4j.Slf4j; import org.springframework.core.io.Resource; import org.springframework.core.io.UrlResource; import o…...
【Linux网络】I/O多路转接技术 - epoll
📢博客主页:https://blog.csdn.net/2301_779549673 📢博客仓库:https://gitee.com/JohnKingW/linux_test/tree/master/lesson 📢欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正! &…...
机器学习经典算法:用决策树原理优化新能源汽车续航能力
🔥 “用决策树重构新能源车能量大脑!算法推导代码实战全解,续航暴增15%” 决策树算法就像我们生活中做决策的 “流程指南”,通过层层判断得出最终结论。比如你去超市买水果,站在琳琅满目的货架前,就不自觉地…...
深入探讨宾馆一次性牙刷价格,市场价格区间差异大
在我们日常出行、住宿的时候,宾馆的一次性牙刷是常见的、标配的物品。许多人或许都会感到好奇,这些一次性牙刷到底值多少钱。下面就来深入探讨一下宾馆一次性牙刷价格方面的问题。 市场价格区间 宾馆一次性牙刷价格差距大,便宜的一支可能只…...
深入解析 .NET Kestrel:高性能 Web 服务器的架构与最佳实践
Kestrel 是 .NET 中用于处理 HTTP 请求的高性能 Web 服务器。作为 ASP.NET Core 的默认服务器,Kestrel 被设计为在高并发、高吞吐量的环境下表现优异,并且能够支持多种协议和跨平台操作。本文将深入探讨 Kestrel 的架构设计、工作原理、配置方式、性能优…...
ZYNQ 纯PL端逻辑资源程序固化流程
ZYNQ 纯PL端逻辑资源程序固化 ZYNQ的程序固化流程比传统的FPGA固化流程复杂很多,Vivado生成的bit文件无法直接固化在ZYNQ芯片中。因为ZYNQ 非易失性存储器的引脚(如 SD 卡、QSPI Flash)是 ZYNQ PS 部分的专用引脚。这些非易失性存储器由 PS …...
【树莓派Pico FreeRTOS】-FreeRTOS-SMP移植
FreeRTOS-SMP移植 文章目录 FreeRTOS-SMP移植1、Raspberry Pi Pico SDK准备2、下载最新FreeRTOS-Kernel源码3、Raspberry Pi Pico的开发环境搭建4、编译配置5、FreeRTOSConfig.h文件设置6、演示代码RP2040 由 Raspberry Pi 设计,具有双核 Arm Cortex-M0+ 处理器和 264KB 内部 …...
数字智慧方案5961丨智慧能源与运维云平台解决方案(52页PPT)(文末有下载方式)
详细资料请看本解读文章的最后内容。 资料解读:智慧能源与运维云平台解决方案 在当今数字化时代,能源管理与设备运维的智能化、高效化成为企业发展的关键。智慧能源与运维云平台解决方案应运而生,为企业提供了全面且先进的能源管理和运维手段…...
2025东三省C题深圳杯C题数学建模挑战赛数模思路代码文章教学: 分布式能源接入配电网的风险分析
完整内容请看文章最下面的推广群 数据整理与分析 表1:有源配电网62节点系统负荷参数 内容:列出了62个节点的有功负荷(单位:kW)。 特点: 负荷范围:24 kW(节点19)到420 …...
腾讯云BI VS quickbi 企业选型(从企业实际功能使用和费用对比)
腾讯云BI VS quickbi 选型 一、总结 前段时间领导让调研腾讯云BI,用来做BI选型,现根据公司实际使用功能做如下总结。 建议继续使用quickbi,不选择腾讯云BI 原因: 腾讯云BI专业版,官方价格最低101996元。并且只能选…...
WebDeveloper 流量分析、sudo提权,靶场通关WP
一、信息收集 1、主机探测 arp-scan -l netdiscover -i eth0 -r 192.168.33.0/24 nmap -sP 192.168.66.0/24 2、端口扫描 nmap -sS -sV 192.168.66.141 PORT STATE SERVICE VERSION 22/tcp open ssh OpenSSH 7.6p1 Ubuntu 4 (Ubuntu Linux; protocol 2.0) 80/tcp op…...
编写教育网站后端页面笔记
callbacktitle.html 对应表: 对应的功能: 控制器层数据: 页面没有写内容 chapter.html 对应表: questionbank ,intofloortime,questionBank,title,didtitles,option,answer,analyse 对应的功能:问题反馈页面 控制器层数据(控制器类): ChapterQuestionbankTitle c…...
C++漫溯键值的长河:map set
文章目录 1.关联式容器2.set2.1 find2.2 lower_bound、upper_bound 3.multiset3.1 count3.2 equal_range 4.map4.1 insert4.2 operate->4.3 operate[ ]4.4 map的应用实践:随机链表的复制 5.multimap希望读者们多多三连支持小编会继续更新你们的鼓励就是我前进的动…...
西门子数字化研发设计制造一体化规划案例P87(87页PPT)(文末有下载方式)
资料解读:《西门子数字化研发设计制造一体化规划案例》 详细资料请看本解读文章的最后内容。 该文档围绕西门子为企业打造的智能化制造研发工艺生产一体化平台规划方案展开,全面阐述了从业务现状分析到项目实施及案例分享的整个过程。 业务现状与需求分析…...
Rust多线程性能优化:打破Arc+锁的瓶颈,效率提升10倍
一、引言 在 Rust 开发中,多线程编程是提升程序性能的重要手段。Arc(原子引用计数)和锁的组合是实现多线程数据共享的常见方式。然而,很多程序员在使用 Arc 和锁时会遇到性能瓶颈,导致程序运行效率低下。本文将深入剖…...
基于python的人工智能应用简述
基于Python的人工智能应用简述 Python已成为人工智能(AI)开发的首选语言,凭借其简洁性、丰富的库生态系统和强大的社区支持,广泛应用于各类AI应用场景。以下是Python在人工智能领域的主要应用领域和技术实现。 1. 机器学习(Machine Learning) Python通过Scikit-learn、Ten…...
《Android 应用开发基础教程》——第十章:使用 Gson 实现网络 JSON 数据解析与对象映射
目录 第十章:使用 Gson 实现网络 JSON 数据解析与对象映射 🔹 10.1 什么是 Gson? 🔸 10.2 添加依赖 🔸 10.3 基础使用 ✦ 示例 JSON 字符串: ✦ 定义对应的 Java 类: ✦ JSON ➜ 对象&am…...
【Android】四大组件之BroadcastReceiver
目录 一、什么是BroadcastReceiver 二、创建和使用BroadcastReceiver 三、跨应用广播接收权限 四、广播方式 五、广播类型与特性 六、BroadcasReceiver注册方式 七、BroadcasReceiver工作流程 你可以把广播接收器想象成一个“收音机”。它的作用是监听系统或应用发出的“…...
[UVM]寄存器模型的镜像值和期望值定义是什么?他们会保持一致吗?
寄存器模型的镜像值和期望值定义是什么?他们会保持一致吗? 摘要:在 UVM (Universal Verification Methodology) 寄存器模型中,镜像值 (mirrored value) 和期望值 (desired value) 是两个非常重要的概念,用于管理寄存器…...
OpenGL-ES 学习(12) ---- VBO EBO VAO
目录 VBO 定义VBO 创建统一VertexData使用 VBO 绘制VAO VBO 定义 VBO(Vertex Buffer Object) 是指顶点缓冲区对象,而 EBO(Element Buffer Object)是指图元索引缓冲区对象,VBO 和 EBO实际上是同一类 buffer 按照用途的不同称呼 OpenGL-ES2.0 编程中&…...
【Redis分布式】主从复制
🔥个人主页: 中草药 🔥专栏:【中间件】企业级中间件剖析 一、主从复制 在分布式系统之中为了解决单点问题(1、可用性问题,该机器挂掉服务会停止2、性能支持的并发量是有限的)通常会把数据复制多…...
Node.js心得笔记
npm init 可用npm 来调试node项目 浏览器中的顶级对象时window <ref *1> Object [global] { global: [Circular *1], clearImmediate: [Function: clearImmediate], setImmediate: [Function: setImmediate] { [Symbol(nodejs.util.promisify.custom)]: [Getter] }, cl…...
多智能体空域协同中的伦理博弈与系统调停
在多智能体系统(MAS)广泛应用于低空飞行调度、应急响应与城市管理的背景下,AI之间的“协同”不仅是算法效率问题,更是伦理角色之间的权责动态博弈。尤其在高频互动、任务冲突、资源抢占等复杂场景中,智能体不再是“工具…...
面试中系统化地解答系统设计题:通用方法论
目录 一、明确需求(Clarify Requirements) (一)理解业务背景 (二)功能性需求(Functional Requirements) 1. 分析目标 2. 功能需求分类 A. 用户交互类功能 B. 数据处理类功能 C. 管理与运维类功能 D. 外部系统交互类功能 示例场景详解 3. 捕捉隐藏需求的技巧…...
kotlin中 热流 vs 冷流 的本质区别
🔥 冷流(Cold Flow) vs 热流(Hot Flow)区别 特性冷流(Cold Flow)热流(Hot Flow)数据生产时机每次 collect 才开始执行启动时就开始生产、始终运行生命周期与 collect 者…...
机器视觉开发-打开摄像头
以下是使用Python和OpenCV打开摄像头的最简单实现: import cv2# 打开默认摄像头(通常是0) cap cv2.VideoCapture(0)# 检查摄像头是否成功打开 if not cap.isOpened():print("无法打开摄像头")exit()print("摄像头已打开 - 按…...
Rerank详解
疑惑一 我对rag的流程理解是。后端首先建立embedding后的向量数据库,用户提问使用相同的embedding模型进行向量化,使用阈值控制相似度找出前topk个数据。然后rerank,将rerank的结果打包成prompt返回给大模型进行解答。我对于rerank的过程不是…...
深度探索DeepSeek:从架构设计到性能优化的实战指南
深度解码DeepSeek:从架构设计到工业级部署的全链路优化实践 引言:大模型时代的工程挑战 在人工智能技术进入工业化落地阶段的今天,大模型训练与推理的工程化能力已成为衡量企业技术实力的重要标尺。DeepSeek作为当前业界领先的超大规模语言…...
d202551
目录 一、175. 组合两个表 - 力扣(LeetCode) 二、511. 游戏玩法分析 I - 力扣(LeetCode) 三、1204. 最后一个能进入巴士的人 - 力扣(LeetCode) 一、175. 组合两个表 - 力扣(LeetCode…...
(C题|社交媒体平台用户分析问题)2025年第二十二届五一数学建模竞赛(五一杯/五一赛)解题思路|完整代码论文集合
我是Tina表姐,毕业于中国人民大学,对数学建模的热爱让我在这一领域深耕多年。我的建模思路已经帮助了百余位学习者和参赛者在数学建模的道路上取得了显著的进步和成就。现在,我将这份宝贵的经验和知识凝练成一份全面的解题思路与代码论文集合…...
计网_PPP协议
2024.10.15:beokayy计算机网络学习笔记 PPP协议 PPP协议的特点PPP协议应满足的需求(了解)PPP协议的组成(PPP协议有三个组成部分) PPP协议的帧格式PPP协议的工作状态 ISP指的是运营商,比如中国联通、中国电信…...
Mem0.ai研究团队开发的全新记忆架构系统“Mem0”正式发布
每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…...
二叉树删除结点详细代码
#include<stdio.h> #include<stdlib.h> #include<string.h> #include<time.h>typedef int data_t; typedef struct _node {data_t data;struct _node* left;struct _node* right; }node_t;int bst_create(node_t**, data_t);//函数声明BST创建 int bst…...
PyTorch线性代数操作详解:点积、矩阵乘法、范数与轴求和
本文通过代码示例详细讲解PyTorch中常用的线性代数操作,包括点积、矩阵乘法、范数计算以及按轴求和等操作,帮助读者掌握张量运算的核心方法。 1. 点积运算 点积(Dot Product)是两个向量对应元素相乘后求和的结果。 实现代码&…...
Java SE(6)——类和对象
1.初始面向对象 1.1 什么是面向对象 Java是一门纯面向对象的编程语言(Object Oriented Program,简称OOP),在面向对象的世界里,一切皆为对象。面向对象是解决问题的一种思想,主要依靠对象之间的交换来完成一件事情 1.2 面向过程…...
Kubernetes(k8s)的API Server 组件原理与结合生产实战教程
一、API Server 架构深度解析 1. 核心架构设计 二、生产环境安全加固实战 1. 认证(Authentication) 2. 授权(Authorization) 3. 准入控制(Admission Control) 三、性能优化与调参 1. 关键启动参数 四…...