MPC模型预测控制器学习笔记(附程序)

news2024/11/27 18:45:55

   本文用于记录学习DR_CAN老师发布的MPC系列视频教程的相关内容,文章中放的源码也是DR_CAN老师提供的程序示例,链接如下:

   DR_CAN老师的视频教程链接(点击可跳转)

   DR_CAN老师提供的程序示例(点击可跳转)

   一、最优化控制与MPC基本概念

   1、最优化控制基本概念

   最优控制的研究动机是在约束条件下(如物理限制)达到最优(综合性最优)的系统表现,在轨迹追踪中可以用真实值与期望值的差值e的平方的积分 ∫ 0 t e 2 d t \int_0^te^2dt 0te2dt来表征追踪效果,其值越小,跟踪效果越好。可以用输入u的平方的积分 ∫ 0 t u 2 d t \int_0^tu^2dt 0tu2dt来表征所需输入的大小

在这里插入图片描述

   我们可以构造目标/代价函数为 J = ∫ 0 t q e 2 + r u 2 d t J=\int_{0}^{t}qe^{2}+ru^{2}dt J=0tqe2+ru2dt,最优化过程就是设计一个控制器u使得 J J J达到最小值,q和r是可以调节的参数。若设置的q远大于r,则说明在优化过程中更看重误差e的大小。同理,若r远大于q,则更看重输入

在这里插入图片描述

   对于多输入多输出的MIMO系统可以用状态空间方程进行表示 d x d t = A x + B u \frac{dx}{dt}=\quad Ax+Bu dtdx=Ax+Bu Y = c x Y=cx Y=cx,x是系统状态变量,Y是系统输出。其目标函数为 J = ∫ 0 x E T Q E + u T R u d t J=\int_{0}^{x}E^{T}Q E+u^{T}Rudt J=0xETQE+uTRudt

在这里插入图片描述

   看一个例子,假如我们有一个如下式所示的二维系统,参考值选为[0 0 ] T ]^T ]T

   d d t [ x 1 x 1 ] = A [ x 1 x 2 ] + B [ μ 1 μ 2 ] [ y 1 y 2 ] = [ x 1 x 2 ] . \begin{aligned}&\frac d{dt}\left[\begin{array}{c}x_1\\x_1\end{array}\right]\quad=\quad A\left[\begin{array}{c}x_1\\x_2\end{array}\right]+B\left[\begin{array}{c}\mu_1\\\mu_2\end{array}\right]\\\\&\begin{bmatrix}y_1\\y_2\end{bmatrix}=\quad\left[\begin{array}{c}x_1\\x_2\end{array}\right]\end{aligned}. dtd[x1x1]=A[x1x2]+B[μ1μ2][y1y2]=[x1x2].

   E = [ x 1 x 2 ] T E=[x_1 \quad x_2]^T E=[x1x2]T E T Q E E^TQE ETQE U T R U U^TRU UTRU的表达式如下图所示,其中Q和R是调节矩阵,其中的q1、q2、r1、r2就是我们可以调节的权重系数,若我们只关心 x 1 x_1 x1的追踪情况,就把q1设置的比较大,q2设置的比较小或0,这里就不会关注 x 2 x_2 x2的追踪情况了

在这里插入图片描述

   2、MPC基本概念

   简单来说,MPC就是通过模型来预测系统在某一未来时间段内的表现来进行优化控制,多用于数位控制,所以分析时常采用离散型的状态空间表达形式 X k + 1 = A X k + B U k X_{k+1}=AX_{k}+BU_{k} Xk+1=AXk+BUk

在这里插入图片描述

   MPC的设计和实施包含三个步骤,在k时刻第一步要做的是,估计/测量出系统当前状态。

   第二步是基于 u k u_{k} uk u k + 1 u_{k+1} uk+1 u k + 2 u_{k+2} uk+2 u k + 3 u_{k+3} uk+3 u k + n u_{k+n} uk+n来做最优化控制,即在k时刻施加一个输入 u k u_{k} uk,根据我们的模型来预测系统k ~ k+1时间段内的表现,然后基于预测的k+1时刻的表现,再施加一个输入 u k + 1 u_{k+1} uk+1、再根据我们的模型来预测系统k+1 ~ k+2时间段内的表现,以此类推,直至预测完我们设定的预测区间,比如k~k+3时间段。则输入 u k u_{k} uk u k + 1 u_{k+1} uk+1 u k + 2 u_{k+2} uk+2称为控制区间,在这个控制区间, u k u_{k} uk u k + 1 u_{k+1} uk+1 u k + 2 u_{k+2} uk+2的选择就是一个最优化的问题。来使得下式所示的目标函数最小,其中,最后一项 E N T F E N E_{N}^{T}FE_{N} ENTFEN表示预测区间的最后一个时刻,与期望值误差的惩罚项

   J = ∑ k N − 1 E k T Q E k + U k T R U k + E N T F E N J=\sum_{k}^{N-1}E_{k}^{T}QE_{k}+U_{k}^{T}RU_{k}+E_{N}^{T}FE_{N} J=kN1EkTQEk+UkTRUk+ENTFEN

   第三步是非常重要的一步,也是MPC当中非常有技巧性的一步,通过上面的计算。我们其实得到了 u k u_{k} uk u k + 1 u_{k+1} uk+1 u k + 2 u_{k+2} uk+2这三个输入,但是在实施的时候,并不是把这三个数值输入都实施下去,而是在K时刻只实施 u k u_{k} uk这一个在k时刻计算出来的最优化结果。
在这里插入图片描述

   在实施的时候只取 u k u_{k} uk这一个输入非常非常的重要,这是因为我们预测的模型很难完美的描述现实的系统,而且,在现实的系统当中可能会有扰动,就是说我们预测出来的实施 u k u_{k} uk后,它的输出 Y k Y_{k} Yk与现实当中真正执行完 u k u_{k} uk后的 Y k Y_{k} Yk是有偏差的,这就要求当我们实施 u k u_{k} uk之后,在k+1时刻要把上面的三步重新执行一遍,即把整个的预测区间(control horizon)和控制区间(predictive horizon)向右移动一个时刻。这个过程就称为滚动优化控制(receiving horizon control)。

   可以看得出来这样的一个解决方案,它在每一步的时候都要进行一下最优化的一个计算。所以MPC对控制器的计算能力要求是很高的。另外一个MPC的特点就是在他求解这个最优化问题的时候,他会考虑到系统的约束。


   二、最优化数学建模与推导

在这里插入图片描述

   MPC算法的重点在第二步,即最优化部分,方法有很多种,这里介绍二次规划QP方法

在这里插入图片描述

   下面来看一下,如何建立二次规划的模型,其中 u ( k + 1 ∣ k ) u(k+1|k) u(k+1∣k)表示的是在k时刻,对k+1时刻的输入的预测,一直预测到k+N-1时刻,N叫做预测空间,同理 x ( k + 1 ∣ k ) x(k+1|k) x(k+1∣k)表示k时刻对k+1时刻状态的预测,一直预测到k+N时刻,

在这里插入图片描述

   我们依然假设y=x,参考值为0,目标函数依然由误差加权和、输入加权和、终端误差三部分构成,如下所示:

在这里插入图片描述

   上面的目标函数中含有未知量x和u,由于我们是要对u进行优化,所以需要把x消去,假设在k时刻对k时刻状态量的预测 x ( k ∣ k ) x(k|k) x(kk) x k x_{k} xk,则k时刻对k+1时刻状态量的预测 x ( k + 1 ∣ k ) x(k+1|k) x(k+1∣k)可利用状态方程进行化简推导… 然后,我们就可以推导出 x ( k + N ∣ k ) x(k+N|k) x(k+Nk)的表达式。

在这里插入图片描述

   我们可以利用前面介绍的矩阵形式的 X k X_k Xk U K U_K UK将其表示成更加简洁的形式 X k = M x k + C U k X_{k}=Mx_{k}+CU_{k} Xk=Mxk+CUk

在这里插入图片描述

   我们再来看一下目标\代价函数,将其展开,并整理,也写成用矩阵 X k X_k Xk U K U_K UK表示的形式 J = X k T Q ˉ X k + U k T R ˉ U k J=X_{k}^{T}\bar{Q}X_{k}+U_{k}^{T}\bar{R}U_{k}^{} J=XkTQˉXk+UkTRˉUk

在这里插入图片描述

   然后将前面推出的 X k = M x k + C U k X_{k}=Mx_{k}+CU_{k} Xk=Mxk+CUk代入到 J = X k T Q ˉ X k + U k T R ˉ U k J=X_{k}^{T}\bar{Q}X_{k}+U_{k}^{T}\bar{R}U_{k}^{} J=XkTQˉXk+UkTRˉUk中就可以消去 X k X_{k} Xk

   在这里插入图片描述

   最终得到目标函数的表达式如下,其中 x k x_{k} xk给定的初始状态,是测量值。

   J = x k T G x k + 2 x k T E U k + U k T H U k J=x_{k}^{T}Gx_{k}+2x_{k}^{T}EU_{k}+U_{k}^{T}HU_{k} J=xkTGxk+2xkTEUk+UkTHUk


   三、一个详细的建模例子

在这里插入图片描述
在这里插入图片描述

   下面,我们以 A = [ 1 0.1 0 2 ] A=\begin{bmatrix}1&0.1\\0&2\end{bmatrix} A=[100.12], B = [ 0 0.5 ] B=\begin{bmatrix}0\\0.5\end{bmatrix} B=[00.5]为例,假设预测空间N=3,进行具体的计算。

在这里插入图片描述

   如果,我们的目标是让x趋于0,则代价函数可以表示成如下的形式,Q、R、F分别表示权重系数矩阵

   J = ∑ i = 0 N − 1 ( x ( k + i ∣ k ) T Q x ( k + i ∣ k ) + u ( k + i ∣ k ) T R u ( k + i ∣ k ) ) + x ( k + N ∣ k ) T F x ( k + N ∣ k ) J=\sum_{i=0}^{N-1}(x(k+i|k)^{T}Qx(k+i|k)+u(k+i|k)^{T}Ru(k+i|k))+x(k+N|k)^{T}Fx(k+N|k) J=i=0N1(x(k+ik)TQx(k+ik)+u(k+ik)TRu(k+ik))+x(k+Nk)TFx(k+Nk)

   通过前面的介绍,我们可以对上式进行简化,简化后的表达式如下,除了系数矩阵,它只包含了输入项和初始状态,初始状态又是给定已知的,所以,未知项,也即需要优化的项为输入项 U ( k ) U(k) U(k)

   J = x ( k ) T G x ˙ ( k ) + U ( k ) T H U ( k ) + 2 x ( k ) T E U ( k ) J=\boldsymbol{x}(k)^T\boldsymbol{G}\dot{\boldsymbol{x}}(k)+\boldsymbol{U}(k)^T\boldsymbol{H}\boldsymbol{U}(k)+2\boldsymbol{x}(k)^T\boldsymbol{E}\boldsymbol{U}(k) J=x(k)TGx˙(k)+U(k)THU(k)+2x(k)TEU(k)

   其中,上式中的系数矩阵的表达式如下:

   G = M T Q ‾ M E = C T Q ‾ M H = C T Q ‾ C + R ‾ . \begin{aligned}G&=M^T\overline{Q}M\\\\E&=C^T\overline{Q}M\\\\H&=C^T\overline{Q}C+\overline{R}\end{aligned}. GEH=MTQM=CTQM=CTQC+R.

   其中, Q ‾ \overline{Q} Q R ‾ \overline{R} R是前面两个系数矩阵的增广形式,如下所示:

   Q ‾ = [ Q ⋯ ⋮ Q ⋮ ⋯ F ] R ‾ = [ R ⋯ ⋮ ⋱ ⋮ ⋯ R ] \overline{Q}=\begin{bmatrix}Q&\cdots&\\\vdots&Q&\vdots\\&\cdots&F\end{bmatrix}\quad\overline{R}=\begin{bmatrix}R&\cdots&\\\vdots&\ddots&\vdots\\&\cdots&R\end{bmatrix} Q= QQF R= RR


   四、完整案例及程序讲解

   研究对象是离散形式的状态空间方程,目标是设计合适的 U k U_k Uk,使得系统的状态变量 x ( k ) x(k) x(k)随着k的增加趋近于目标值,引入误差这个概念,它等于状态量的期望值减去实际值,即e= x d − x k + 1 x_d-x_{k+1} xdxk+1,这样的话,我们的目标就是要让这个误差量趋向于0。

   为了方便观察,我们会需要把系统的状态变量x随着k的增加的变化趋势画出来,横坐标是k,纵坐标是x值。因此我们需要建立两个新的矩阵X_K和U_K,分别累计存放每个k所对应的状态量和输入量

在这里插入图片描述

   定义了这两个矩阵后,在MATLAB或者Octave中状态方程就可以写成如下的形式:

   X _ K ( : , k + 1 ) = ( A ∗ X _ K ( : , k ) + B ∗ U _ K ( : , k ) ) ; X\_K(:,k+1)=(A^{*}X\_K(:,k)+B^{*}U\_K(:,k)); X_K(:,k+1)=(AX_K(:,k)+BU_K(:,k));

   接着看前面给出的具体例子,即取 A = [ 1 0.1 0 2 ] A=\begin{bmatrix}1&0.1\\0&2\end{bmatrix} A=[100.12], B = [ 0 0.5 ] B=\begin{bmatrix}0\\0.5\end{bmatrix} B=[00.5],状态变量的权重矩阵Q、状态变量终端的权重(终端惩罚)矩阵F、输入的权重矩阵R的取值如下:

   Q = ( 1 0 0 1 ) F = ( 1 0 0 1 ) R = 0.1 \boldsymbol{Q}=\begin{pmatrix}1&0\\0&1\end{pmatrix}\quad\boldsymbol{F}=\begin{pmatrix}1&0\\0&1\end{pmatrix}\boldsymbol{R}=0.1 Q=(1001)F=(1001)R=0.1


   由前面的介绍可知,目标函数表达式如下:优化变量

   J = x ( k ) T G x ˙ ( k ) + U ( k ) T H U ( k ) + 2 x ( k ) T E U ( k ) J=\boldsymbol{x}(k)^T\boldsymbol{G}\dot{\boldsymbol{x}}(k)+\boldsymbol{U}(k)^T\boldsymbol{H}\boldsymbol{U}(k)+2\boldsymbol{x}(k)^T\boldsymbol{E}\boldsymbol{U}(k) J=x(k)TGx˙(k)+U(k)THU(k)+2x(k)TEU(k)

   可知第一部分与优化变量 U ( k ) U(k) U(k)没有关系,所以优化时只需要最设计合适的 U ( k ) U(k) U(k)来最小化下式即可

   U ( k ) T H U ( k ) + 2 x ( k ) T E U ( k ) \boldsymbol{U}(k)^T\boldsymbol{H}\boldsymbol{U}(k)+2\boldsymbol{x}(k)^T\boldsymbol{E}\boldsymbol{U}(k) U(k)THU(k)+2x(k)TEU(k)

   其中,矩阵H和E的表达式如下:

   E = C T Q ‾ M H = C T Q ‾ C + R ‾ \begin{array}{l}{E=C^{T}\overline{Q}M}\\{H=C^{T}\overline{Q}C+\overline{R}}\\\end{array} E=CTQMH=CTQC+R

   C = [ 0 0 … 0 ⋮ ⋮ … ⋮ 0 0 … 0 B 0 … 0 A B B … 0 ⋮ ⋮ ⋱ 0 A N − 1 B A N − 2 B … B ] M = [ I n × n A n × n A 2 A N ] Q ⃗ = [ Q ⋯ ⋮ Q ⋮ ⋯ F ] R ⃗ = [ R ⋯ ⋮ ⋱ ⋮ ⋯ R ] \begin{aligned}&\boldsymbol{C}=\begin{bmatrix}0&0&\ldots&0\\\vdots&\vdots&\ldots&\vdots\\0&0&\ldots&0\\\boldsymbol{B}&0&\ldots&0\\\boldsymbol{AB}&\boldsymbol{B}&\ldots&0\\\varvdots&\varvdots&\ddots&0\\\boldsymbol{A}^{N-1}\boldsymbol{B}&\boldsymbol{A}^{N-2}\boldsymbol{B}&\ldots&\boldsymbol{B}\end{bmatrix}\boldsymbol{M}=\begin{bmatrix}\boldsymbol{I}_{n\times n}\\\boldsymbol{A}_{n\times n}\\\boldsymbol{A}^2\\\boldsymbol{A}^N\end{bmatrix}\\&\vec{Q}=\begin{bmatrix}\boldsymbol{Q}&\cdots\\\varvdots&\boldsymbol{Q}&\vdots\\&\cdots&\boldsymbol{F}\end{bmatrix}\quad\vec{R}=\begin{bmatrix}\boldsymbol{R}&\cdots&\\\varvdots&\ddots&\vdots\\&\cdots&\boldsymbol{R}\end{bmatrix}\end{aligned} C= 00BABAN1B000BAN2B00000B M= In×nAn×nA2AN Q = QQF R = RR


   在编程实现上:

   ①、 首先设定矩阵A、B、Q、F、R,设定k的最大值,给定初始状态x,并初始化X_K和U_K矩阵,设定预测区间N

   ②、然后根据表达式计算系数矩阵G、E、H

   ③、开始循环迭代,在每次迭代中,提供当前状态 x k x_k xk、矩阵E、H,预测区间N,然后使用优化算法(本例中调用的MATLAB自带的最优化函数quadprog)计算输入 U k U_k Uk, 并使用状态方程对 X k X_k Xk进行更新

   ④、图像绘制

   DR_CAN老师给出的代码一共由三个部分组成,分别为主程序: MPC_Test.m。 以及两个函数: MPC_Matrices.m 和 Prediction.m。代码使用Octave编写,同时也在Matlab中经过了验证。

   (1)、MPC_Test.m

%% 清屏

clear ; 

close all; 

clc;

%% 加载 optim package,若使用matlab,则注释掉此行

pkg load optim;

%%%%%%%%%%%%%%%%%%%%%%%%%%

%% 第一步,定义状态空间矩阵

%% 定义状态矩阵 A, n x n 矩阵

A = [1 0.1; -1 2];

n= size (A,1);

%% 定义输入矩阵 B, n x p 矩阵

B = [ 0.2 1; 0.5 2];

p = size(B,2);

%% 定义Q矩阵,n x n 矩阵

Q=[100 0;0 1];

%% 定义F矩阵,n x n 矩阵

F=[100 0;0 1];

%% 定义R矩阵,p x p 矩阵

R=[1 0 ;0 .1];

%% 定义step数量k

k_steps=100; 

%% 定义矩阵 X_K, n x k 矩 阵

X_K = zeros(n,k_steps);

%% 初始状态变量值, n x 1 向量

X_K(:,1) =[20;-20];

%% 定义输入矩阵 U_K, p x k 矩阵

U_K=zeros(p,k_steps);



%% 定义预测区间K

N=5;

%% Call MPC_Matrices 函数 求得 E,H矩阵 

[E,H]=MPC_Matrices(A,B,Q,R,F,N);



%% 计算每一步的状态变量的值

for k = 1 : k_steps 

%% 求得U_K(:,k)

U_K(:,k) = Prediction(X_K(:,k),E,H,N,p);

%% 计算第k+1步时状态变量的值

X_K(:,k+1)=(A*X_K(:,k)+B*U_K(:,k));

end



%% 绘制状态变量和输入的变化

subplot  (2, 1, 1);

hold;

for i =1 :size (X_K,1)

plot (X_K(i,:));

end

legend("x1","x2")

hold off;

subplot (2, 1, 2);

hold;

for i =1 : size (U_K,1)

plot (U_K(i,:));

end

legend("u1","u2") 

   (2)、MPC_Matrices.m

function  [E , H]=MPC_Matrices(A,B,Q,R,F,N)


n=size(A,1);   % A 是 n x n 矩阵, 得到 n

p=size(B,2);   % B 是 n x p 矩阵, 得到 p

%%%%%%%%%%%%

M=[eye(n);zeros(N*n,n)]; % 初始化 M 矩阵. M 矩阵是 (N+1)n x n的, 

                         % 它上面是 n x n 个 "I", 这一步先把下半部

                         % 分写成 0 

C=zeros((N+1)*n,N*p); % 初始化 C 矩阵, 这一步令它有 (N+1)n x NP 个 0

% 定义M 和 C 

tmp=eye(n);  %定义一个n x n 的 I 矩阵

% 更新M和C

for i=1:N % 循环,i 从 1到 N

    rows =i*n+(1:n); %定义当前行数,从i x n开始,共n行 

    C(rows,:)=[tmp*B,C(rows-n, 1:end-p)]; %将c矩阵填满

    tmp= A*tmp; %每一次将tmp左乘一次A

    M(rows,:)=tmp; %将M矩阵写满

end 


% 定义Q_bar和R_bar

Q_bar = kron(eye(N),Q);

Q_bar = blkdiag(Q_bar,F);

R_bar = kron(eye(N),R); 



% 计算G, E, H

G=M'*Q_bar*M; % G: n x n

E=C'*Q_bar*M; % E: NP x n

H=C'*Q_bar*C+R_bar; % NP x NP 



end 

   (3)、Prediction.m

function u_k= Prediction(x_k,E,H,N,p)

U_k = zeros(N*p,1); % NP x 1

U_k = quadprog(H,E*x_k);

u_k = U_k(1:p,1); % 取第一个结果

end 

   程序运行结果如下:

在这里插入图片描述



   参考资料

   1、DR_CAN老师的视频教程链接(点击可跳转)

   2、DR_CAN老师提供的程序示例(点击可跳转)


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/952442.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

探索三丰云:免费虚拟主机与云服务器的新选择**

随着云计算技术的飞速发展,我们有了更多的选择来满足我们的在线业务需求。今天,我想向大家推荐一款我最近发现的优质服务——三丰云。 三丰云(https://www.sanfengyun.com)是一家提供免费虚拟主机和免费云服务器的公司&#xff0…

热门框架漏洞

文章目录 一、Thinkphp5.0.23 代码执行1.thinkphp5框架2.thinkphp5高危漏洞3.漏洞特征4.THinkphp5.0 远程代码执行--poc5.*TP5实验一(Windows)a.搭建实验环境b.测试phpinfoc.写入shelld.使用菜刀连接 6.*TP5实验二(Linux)a.测试方法b.测试phpinfoc.写入shelld.反弹shell&#x…

Windows系统中Apache Http服务器简单使用

1 简介 Apache HTTP服务器是一个开源的、跨平台的Web服务器软件。它由Apache软件基金会开发和维护。Apache HTTP服务器可以在多种操作系统上运行,如Windows、Linux、Unix等,并且支持多种编程语言和技术,如PHP、Perl、Python、Java等。…

物联网智慧种植农业大棚系统

一、项目背景 智慧农业是是将物联网技术和农业生产箱管理的新型农业,依托部署在农业生产现场的各种传感节点,以物联网网关为通道形成数据传输网络,可以实现控制柜、环境监测传感器、气象监测机器等设备的远程监控,达到及时高校的…

docker 安装 Nginx

1、下载 docker pull nginx:latest 2、本地创建管理目录 mkdir -p /var/docker/nginx/conf mkdir -p /var/docker/nginx/log mkdir -p /var/docker/nginx/html 3、将容器中的相应文件复制到管理目录中 /usr/docker/nginx docker run --name nginx -p 80:80 -d nginxdocke…

小猫爪:嵌入式小知识18-XCP SeedNKey.dll

小猫爪:嵌入式小知识18-XCP SeedNKey.dll 0 目录1 前言2 生成DLL2.1 下载模板代码2.2 函数简介2.2 DLL编译 3 使用DLLEND 0 目录 小猫爪:嵌入式小知识15-XCP基础简介小猫爪:嵌入式小知识16-XCP协议简介小猫爪:嵌入式小知识17-XCP…

OpenGl图像的位移及旋转

一般而言,改变物体的位置时,需要改变每一帧所有顶点的坐标,计算量巨大 可以将每一个顶点用向量值表示,使用位移矩阵,缩放矩阵,旋转矩阵对顶点进行操作。 顶点着色器: #version 330 core layo…

LeetCode--HOT100题(46)

目录 题目描述:114. 二叉树展开为链表(中等)题目接口解题思路代码 PS: 题目描述:114. 二叉树展开为链表(中等) 给你二叉树的根结点 root ,请你将它展开为一个单链表: 展开后的单链…

解决Jackson解析JSON时出现的Illegal Character错误

🌷🍁 博主猫头虎 带您 Go to New World.✨🍁 🦄 博客首页——猫头虎的博客🎐 🐳《面试题大全专栏》 文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~🌺 &a…

微信小程序echart导出图片

echarts版本5.1.0 用到的echarts组件是uni插件市场的echart组件 <div style"overflow: hidden;"><dCanvas class"uni-ec-canvass" id"uni-ec-canvas" ref"canvas" canvas-id"mychart-gauge" :ec"ec"&g…

恒运资本:如何利用股票筹码进行选股?有什么方法?

在进行股票之前最重要的便是进行股票的挑选&#xff0c;股票挑选有许多办法&#xff0c;比如说消息面选股、使用筹码进行选股等。那么怎么使用股票筹码进行选股&#xff1f;有什么办法&#xff1f;就下面就由恒运资本为大家剖析&#xff1a; 投资者能够根据以下筹码变动特点来进…

基于猎食者算法优化的BP神经网络(预测应用) - 附代码

基于猎食者算法优化的BP神经网络&#xff08;预测应用&#xff09; - 附代码 文章目录 基于猎食者算法优化的BP神经网络&#xff08;预测应用&#xff09; - 附代码1.数据介绍2.猎食者优化BP神经网络2.1 BP神经网络参数设置2.2 猎食者算法应用 4.测试结果&#xff1a;5.Matlab代…

QT基础教程之八Qt消息机制和事件

QT基础教程之八Qt消息机制和事件 QPainter Qt 的绘图系统允许使用相同的 API 在屏幕和其它打印设备上进行绘制。整个绘图系统基于QPainter&#xff0c;QPainterDevice和QPaintEngine三个类。 QPainter用来执行绘制的操作&#xff1b;QPaintDevice是一个二维空间的抽象&#…

【已解决】激活虚拟环境报错:此时不应有Anaconda3\envs\[envs]\Library\ssl\cacert.pem。

新建虚拟环境后&#xff0c;进入虚拟环境的时候出现这样的报错&#xff1a; 此时不应有Anaconda3 envs yolov5 Library ssl cacert.pem。 但是之前装的虚拟环境也还能再次激活&#xff0c;base环境也无任何问题&#xff0c;仅新装的虚拟环境无法激活。 查遍了百度谷歌&#xff…

鸿蒙系列-如何使用好 ArkUI 的 @Reusable?

如何使用好 ArkUI 的 Reusable&#xff1f; OpenHarmony 组件复用机制 在ArkUI中&#xff0c;UI显示的内容均为组件&#xff0c;由框架直接提供的称为 系统组件&#xff0c;由开发者定义的称为 自定义组件。 在进行 UI 界面开发时&#xff0c;通常不是简单的将系统组件进行组合…

classpath:和classpath*:的区别

1、classpath是什么 classpath是指编译之后的target中的classes目录&#xff0c;该目录中存放的内容和源程序中对应的例子如下&#xff1a; 2、classpath:和classpath*:的区别 classpath&#xff1a; 只会到你的target下面的class路径中查找找文件 classpath*&#xff1a; …

使用 Python编程: 下载 YouTube 音频的桌面应用程序

最近我开发了一个使用 Python 编写的桌面应用程序&#xff0c;可以方便地下载 YouTube 音频。该应用程序使用了 wxPython、yt_dlp 和 tqdm 库&#xff0c;提供了一个简单直观的用户界面&#xff0c;并具备高效的下载功能。 C:\pythoncode\new\youtube-dl-audio.py 程序介绍 …

在 Spring Boot 中集成 MinIO 对象存储

MinIO 是一个开源的对象存储服务器&#xff0c;专注于高性能、分布式和兼容S3 API的存储解决方案。本文将介绍如何在 Spring Boot 应用程序中集成 MinIO&#xff0c;以便您可以轻松地将对象存储集成到您的应用中。 安装minio 拉取 minio Docker镜像 docker pull minio/minio创…

Linux串口驱动

《I.MX6ULL 参考手册》第 3561 页的“Chapter 55 Universal Asynchronous Receiver/Transmitter(UART) I.MX6ULL串口原理 1.1UART与USART UART是异步通信&#xff0c;USART是异步/同步通信&#xff0c;比UART多了一条时钟线 USART 的全称是 Universal Synchronous/Asynchr…

【Dots之003】SystemAPI.Query相关基础笔记

1、SystemAPI.Query 注&#xff1a;SystemAPI.Query只能作为foreach中in的的子句 SystemAPI.Query<RefRO<LocalTransform>>().WithAll<Obstacle>()解析&#xff1a;对于每个具有LocalTransform和Obstacle的Entity&#xff1b;都会将LocalTransform的只读引…