1 什么是稳定点

一个控制系统就和一个社会一样,稳定性是首先要解决的重要问题,是其他一切工作的基础。稳定性问题的字面意思很好理解了,那就是系统在受到扰动后,能否能有能力在平衡态继续工作。大家都知道,历史上社会改革成本很高,且以失败者居多,从控制论的角度来看,就是对社会这个大系统的稳定性研究不够,导致扰动发生后,社会发散了。

要研究稳定,首先要研究稳定点,那什么是稳定点呢?我们以发射火箭为例:

火箭的简化模型可以看成是一个倒立摆,如下图所示,在最低端施加控制力,来保持其在竖直方向的角度可控。

其状态方程如下:
ddt[θθ˙]=[θ˙mglJtsin⁡θ−γJtθ˙+lJtcos⁡θ⋅u]\frac{d}{d t}\left[\begin{array}{c} \theta \\ \dot{\theta} \end{array}\right]=\left[\begin{array}{c} \dot{\theta} \\ \frac{m g l}{J_{t}} \sin \theta-\frac{\gamma}{J_{t}} \dot{\theta}+\frac{l}{J_{t}} \cos \theta \cdot u \end{array}\right] dtd​[θθ˙​]=[θ˙Jt​mgl​sinθ−Jt​γ​θ˙+Jt​l​cosθ⋅u​]

其中 γ\gammaγ 为旋转摩擦系数, Jt=J+ml2J_t=J+ml^2Jt​=J+ml2 , uuu 为施加的外力。现在我们要开始做实验了,假设对火箭不做任何控制,即 u=0u=0u=0 ,这时火箭的状态方程可进一步简化:
ddt[θθ˙]=[θ˙mglJtsin⁡θ−γJtθ˙]\frac{d}{d t}\left[\begin{array}{c} \theta \\ \dot{\theta} \end{array}\right]=\left[\begin{array}{c} \dot{\theta} \\ \frac{m g l}{J_{t}} \sin \theta-\frac{\gamma}{J_{t}} \dot{\theta} \end{array}\right] dtd​[θθ˙​]=[θ˙Jt​mgl​sinθ−Jt​γ​θ˙​]

不失一般性,假设我们自己也造了一个火箭,其 mgl=Jt=1,γ=1mgl=J_t=1,\;\gamma=1mgl=Jt​=1,γ=1 ,则上述方程变为:
[x1˙(t)x2˙(t)]=[x2sin⁡(x1)−x2]\left[\begin{array}{c} \dot{x_1}(t) \\ \dot{x_2}(t) \end{array}\right]=\left[\begin{array}{c} x_2 \\ \sin(x_1)-x_2 \end{array}\right] [x1​˙​(t)x2​˙​(t)​]=[x2​sin(x1​)−x2​​]

注意,这个方程虽然看着简单,但确是一个非线性方程,解起来还是费点力气的,我们要借助MATLAB帮我们算一下,并画个图出来看一下,把 x1x_1x1​ 作为横坐标, x2x_2x2​ 作为纵坐标,然后随机选择一些初始点,看看向量 [x1,x2]T[x_1,x_2]^T[x1​,x2​]T 是怎么运动的,轨迹如下图所示:


可见,这个图形是比较有意思的,其中有三个比较明显的点,貌似是旋涡中心,无论初始条件是什么,最终都要稳定在这三个点上(实际很多,我们只计算了三个),这三个点的坐标目测是 [±nπ,0]T[\pm n\pi, 0]^T[±nπ,0]T

我们从数学上再分析一下,什么是稳定点呢?——就是不再变化的点,那什么是不再变化呢?——导数为零呗,怎么样才能让导数为零呢?——状态方程的左边就是导数啊,让右边为零就可以了。
[x2sin⁡(x1)−x2]=[00]\left[\begin{array}{c} x_2 \\ \sin(x_1)-x_2 \end{array}\right]=\left[\begin{array}{c} 0 \\ 0\end{array}\right] [x2​sin(x1​)−x2​​]=[00​]

解这个方程还是比较容易的,它的解就是:
[x1x2]=[±nπ0]\left[\begin{array}{c} x_1 \\ x_2 \end{array}\right]=\left[\begin{array}{c} \pm n\pi \\ 0\end{array}\right] [x1​x2​​]=[±nπ0​]

但是,如果你仔细看,还有一个点,[0,0]T[0,0]^T[0,0]T肯定是数学解,但是似乎在图上并没有明显的显示出来,这是什么原因呢?——这代表着火箭竖直放置,且没有扰动,常识告诉我们这是一个极不稳定的点,就像你把铅笔立在桌子上,稍微风吹草动就倒了,而数值求解的时候,几乎寻找不到这个点。

那其他的稳定点又代表什么呢?——火箭水平躺着 θ=±π\theta=\pm\piθ=±π,而且不再变化 θ˙=0\dot{\theta}=0θ˙=0,这和我们的常识也是一致的。

可见稳定点就是系统状态不再发生变化的点,它可能不止一个,它也可能很脆弱,稍微有个扰动,就不稳定了。

2 什么是李雅普诺夫稳定

早在1892年,俄国有一个叫李雅普诺夫的学者发表了一篇著名的文章《运动稳定性一般》问题,建立了关于运动稳定的一般理论,光看这个文章的名字就不一般,也确实,在尔后百余年,这个理论在数学、力学和控制理论中全面开花,已经成为稳定性研究方向的基础性理论,俄罗斯人对于数学上和工程上的直觉确实令人赞叹。


李雅普诺夫稳定性理论研究的是在扰动下稳定点的稳定性问题。

简单来说,如果稳定状态 xex_exe​ 受到扰动后,仍然停留在 xex_exe​ 附近,我们就称 xex_exe​ 在李雅普诺夫意义下是稳定的 (Lyapunov stable)。

如果更进一步,如果稳定状态 xex_exe​ 受到扰动后,最终都会收敛到 xex_exe​,我们就称 xex_exe​ 在李雅普诺夫意义下是渐进稳定的 (Asymptotically stable)。

再进一步,如果稳定状态 xex_exe​ 受到任何扰动后,最终都会收敛到 xex_exe​ ,我们就称 xex_exe​ 在李雅普诺夫意义下是大范围内渐进稳定的 (Asymptotically stable in large)。

相反,如果稳定状态 xex_exe​ 受到某种扰动后,状态开始偏离 xex_exe​ ,我们就称 xex_exe​ 在李雅普诺夫意义下是不稳定的 (Unstable)。

示意图如下:

下面我们就分别具体看一下。

什么是李雅普诺夫意义下的稳定
请看状态方程:
[x1˙x2˙]=[01−10][x1x2]\left[\begin{array}{c} \dot{x_1} \\ \dot{x_2} \end{array}\right]=\left[\begin{array}{c}0&1\\-1&0\end{array}\right]\left[\begin{array}{c} x_1 \\ x_2\end{array}\right] [x1​˙​x2​˙​​]=[0−1​10​][x1​x2​​]

很容易得到其时域的解为:
x(t)=x(0)[sin⁡(t)cos⁡(t)]x(t)=x(0)\left[\begin{array}{c}\sin(t)\\\cos(t)\end{array}\right] x(t)=x(0)[sin(t)cos(t)​]

且稳定点为 [00]\left[\begin{array}{c}0\\0 \end{array}\right][00​],我们随机取一些很小的扰动,比如 x(0)=[0.010.01]x(0)=\left[\begin{array}{c} 0.01\\0.01\end{array}\right]x(0)=[0.010.01​], x(0)=[0.020.02]x(0)=\left[\begin{array}{c}0.02\\0.02 \end{array}\right]x(0)=[0.020.02​] 以及 x(0)=[0.030.03]x(0)=\left[\begin{array}{c}0.03\\0.03 \end{array}\right]x(0)=[0.030.03​],把 [x1x2]\left[\begin{array}{c}x_1\\x_2 \end{array}\right][x1​x2​​] 在初始条件下的轨迹画出来,结果如下:

可以看出,如果初始扰动小,其状态轨迹的区间也小;相反,当初始扰动大的时候,状态轨迹的区间也变大;但是无论如何,状态轨迹的区间都是有限的,而且,如果想减小轨迹的区间,只要保证扰动在某范围内即可。比如对于本范例,要想 ∣∣x(t)−xe∣∣<0.01||x(t)-x_e||<0.01∣∣x(t)−xe​∣∣<0.01 ,只要保证初始扰动 ∣∣x(0)−xe∣∣<0.01||x(0)-x_e||<0.01∣∣x(0)−xe​∣∣<0.01 即可。

**翻译成严谨的数学语言就是:**对于任意的 ϵ>0\epsilon>0ϵ>0 ,存在 δ>0\delta>0δ>0 ,使得如果 ∣∣x(0)−xe∣∣<δ||x(0)-x_e||<\delta∣∣x(0)−xe​∣∣<δ ,则对于所有的 t>0t>0t>0 ,都有 ∣∣x(t)−xe∣∣<ϵ||x(t)-x_e||<\epsilon∣∣x(t)−xe​∣∣<ϵ。

我们再举个例子看一下:
x˙1(t)=x2+x1(2−x12−x22)x˙2(t)=−x1+x2(2−x12−x22)\begin{array}{l} \dot{x}_{1}(t)=x_{2}+x_{1}\left(2-x_{1}^{2}-x_{2}^{2}\right) \\ \dot{x}_{2}(t)=-x_{1}+x_{2}\left(2-x_{1}^{2}-x_{2}^{2}\right) \end{array} x˙1​(t)=x2​+x1​(2−x12​−x22​)x˙2​(t)=−x1​+x2​(2−x12​−x22​)​

求解稍微复杂一点,我们直接画出轨迹图如下:


显然 [00]\left[\begin{array}{c}0\\0 \end{array}\right][00​] 是其稳定点。从轨迹图中可以看出,无论是小扰动(初始点在稳定零点附近),还是大扰动,状态轨迹最终都趋向一个固定的圆。我们套用一下李雅普诺夫稳定定义看一下,该系统是否稳定。我们不妨取 ϵ=1\epsilon=1ϵ=1 ,即在零点周围画个半径为1的圆,看看能否存在 δ\deltaδ,使得 ∣∣x(0)−xe∣∣<δ||x(0)-x_e||<\delta∣∣x(0)−xe​∣∣<δ,则对于所有的 t>0t>0t>0,都有 ∣∣x(t)−xe∣∣<1||x(t)-x_e||<1∣∣x(t)−xe​∣∣<1。显然, δ\deltaδ 是不存在的,因此,该系统是不稳定的。

2.1 什么是渐进稳定

请看如下方程:
x1˙(t)=−x1x2˙(t)=x1+x2−x23\begin{aligned} &\dot{x_1}(t)=-x_1\\ &\dot{x_2}(t)=x_1+x_2-x_2^3 \end{aligned} ​x1​˙​(t)=−x1​x2​˙​(t)=x1​+x2​−x23​​

令 x1˙(t)=0x2˙(t)=0\begin{aligned} &\dot{x_1}(t)=0\\ &\dot{x_2}(t)=0 \end{aligned}​x1​˙​(t)=0x2​˙​(t)=0​, 很容易计算该系统的稳定点为:[00]\left[\begin{array}{c}0\\0 \end{array}\right][00​],[01]\left[\begin{array}{c}0\\1 \end{array}\right][01​],[0−1]\left[\begin{array}{c}0\\-1 \end{array}\right][0−1​],其轨迹图为:

可见,对于稳定点 [01]\left[\begin{array}{c}0\\1 \end{array}\right][01​],[0−1]\left[\begin{array}{c}0\\-1 \end{array}\right][0−1​],存在 δ>0\delta>0δ>0,比如图中的 δ=0.1\delta=0.1δ=0.1,在 ∣∣x(t)−xe∣∣<0.1||x(t)-x_e||<0.1∣∣x(t)−xe​∣∣<0.1 的区间内,状态轨迹最终都收敛到这两个稳定点上,因此是渐进稳定的。

而对于点 [00]\left[\begin{array}{c}0\\0 \end{array}\right][00​],我们在其周围添加小扰动,发现无论扰动多么小,轨迹线都会偏离该稳定点,因此属于不稳定点。

2.2 什么是大范围渐进稳定

通过前面的例子,我们发现,同一个系统里面,可能有渐进稳定点,也可能有不稳定点,我们还不容易确定系统是否稳定。再来看一个简单的例子:
[x1˙x2˙]=[1−35−2][x1x2]\left[\begin{array}{c} \dot{x_1} \\ \dot{x_2} \end{array}\right]=\left[\begin{array}{c}1&-3\\5&-2\end{array}\right]\left[\begin{array}{c} x_1 \\ x_2\end{array}\right] [x1​˙​x2​˙​​]=[15​−3−2​][x1​x2​​]

其轨迹图为:

可见,对于任何扰动,最后都会收敛到一个稳定点,这就是大范围内渐进稳定。对于线性系统来说,很容易证明,如果平衡态是渐进稳定的,也必然是大范围渐进稳定的。

对于线性时不变系统,只要矩阵 AAA 的特征值具有负实部,那系统就是大范围渐进稳定的。

2.5 什么是不稳定

假设有一个系统,状态方程如下:
[x1˙x2˙]=[13−52][x1x2]\left[\begin{array}{c} \dot{x_1} \\ \dot{x_2} \end{array}\right]=\left[\begin{array}{c}1&3\\-5&2\end{array}\right]\left[\begin{array}{c} x_1 \\ x_2\end{array}\right] [x1​˙​x2​˙​​]=[1−5​32​][x1​x2​​]

同样随机布置一些初始点,看看状态的轨迹如何:

很明显,所有初始状态的轨迹都呈现螺旋发散状,从数学上看,特征值 λ=1.5±3.84i\lambda=1.5\pm3.84iλ=1.5±3.84i,具有共轭根,但是实部是正的,因此发散。

再来看另外一个例子,状态方程为
[x1˙x2˙]=[4−21−3][x1x2]\left[\begin{array}{c} \dot{x_1} \\ \dot{x_2} \end{array}\right]=\left[\begin{array}{c}4&-2\\1&-3\end{array}\right]\left[\begin{array}{c} x_1 \\ x_2\end{array}\right] [x1​˙​x2​˙​​]=[41​−2−3​][x1​x2​​]


貌似也呈现发散状,但是和前面的例子有所不同,轨迹貌似呈现指数形式,计算状态方程特征值为 λ=[3.7−2.7]\lambda=\left[\begin{array}{c} 3.7\\-2.7 \end{array}\right]λ=[3.7−2.7​] ,有一个不稳定的实根,导致系统发散。由以上两例可以看出,发散的轨迹可以有多种多样。

3 李雅普诺夫第一法

前面我们把稳定点分了几类,我们会发现,还是线性系统比较好计算,而且性能比较好,只要保证矩阵 AAA 具有负实部,就是大范围一致稳定的。因此,我们如果把方程的形式由
x˙(t)=f(x(t))\dot{x}(t)=f(x(t)) x˙(t)=f(x(t))

改成:
x˙(t)=Ax(t)\dot{x}(t)=Ax(t) x˙(t)=Ax(t)

就会带来很多方便。这就需要将非线性系统在平衡态附近线性化,然后讨论线性化系统的特征值分布来研究原非线性系统的稳定性问题。这种方法,就是李雅普诺夫在他论文中提到的第一种方法,称之为第一法,也叫间接法。

我们再来分析一下前面所说的倒立摆的例子:
[x1˙(t)x2˙(t)]=[x2sin⁡(x1)−x2]\left[\begin{array}{c} \dot{x_1}(t) \\ \dot{x_2}(t) \end{array}\right]=\left[\begin{array}{c} x_2 \\ \sin(x_1)-x_2 \end{array}\right] [x1​˙​(t)x2​˙​(t)​]=[x2​sin(x1​)−x2​​]

这是一个典型的非线性方程,我们前面计算过了,其有多个稳定点 [±nπ,0]T[\pm n\pi,0]^T[±nπ,0]T ,我们不妨来研究一下 [π,0]T[\pi,0]^T[π,0]T 这个点,其附件的状态轨迹为:


现在将原来的非线性方程线性化,为方便起见,我们定义 z1=x1−πz_1=x_1-\piz1​=x1​−π 以及 z2=x2z_2=x_2z2​=x2​,于是可以得到:
sin⁡(π+z1)=−sin⁡z1≈−z1\sin(\pi+z_1)=-\sin z_1\approx-z_1 sin(π+z1​)=−sinz1​≈−z1​

于是,原非线性方程就变为:
[z1˙(t)z2˙(t)]=[01−1−1][z1z2]\left[\begin{array}{c} \dot{z_1}(t) \\ \dot{z_2}(t) \end{array}\right]= \left[\begin{array}{c} 0&1 \\ -1&-1 \end{array}\right] \left[\begin{array}{c} z_1 \\ z_2 \end{array}\right] [z1​˙​(t)z2​˙​(t)​]=[0−1​1−1​][z1​z2​​]

在新的坐标系下,稳定变为 [00]\left[\begin{array}{c}0\\0\end{array}\right][00​],其轨迹为:


可见,与原轨迹还是比较接近的。一般的书上,对于李雅普诺夫第一法都是一笔带过,其实在工程实践中,第一法应用非常多,比如复杂的飞机飞行控制,就是将飞机模型线性化成多个线性化模型进行设计。

4 李雅普诺夫第二法

第二法就比较天才了,来源于一个朴素的想法:稳定的系统能量总是不断被耗散的,李雅普诺夫通过定义一个标量函数 V(x)V(\boldsymbol{x})V(x) (通常能代表广义能量)来分析稳定性。这种方法的避免了直接求解方程,也没有进行近似线性化,所以也一般称之为直接法。如果 标量函数 V(x)V(\boldsymbol{x})V(x) 满足:
V(x)=0if and only if x=0V(x)>0if and only if x≠0V˙(x)=ddtV(x)=∑i=1n∂V∂xifi(x)≤0when x≠0\begin{aligned} &V(\boldsymbol{x})=0\; \text { if and only if } \boldsymbol{x}=0\\ &V(\boldsymbol{x})>0\; \text { if and only if } \boldsymbol{x} \neq 0\\ &\dot{V}(\boldsymbol{x})=\frac{d}{d t} V(\boldsymbol{x})=\sum_{i=1}^{n} \frac{\partial V}{\partial x_{i}} f_{i}(x) \leq 0\; \text { when } \boldsymbol{x} \neq 0 \end{aligned} ​V(x)=0 if and only if x=0V(x)>0 if and only if x​=0V˙(x)=dtd​V(x)=i=1∑n​∂xi​∂V​fi​(x)≤0 when x​=0​

则称系统在李雅普诺夫意义下是稳定的,特别的,若 x≠0x\ne0x​=0 时,有 V˙(x)<0\dot{V}(\boldsymbol{x})<0V˙(x)<0,则系统是渐进稳定的。举个例子:
x1˙(t)=x2−x1(x12+x22)x2˙(t)=−x1−x2(x12+x22)\begin{aligned} &\dot{x_1}(t)=x_2-x_1(x_1^2+x_2^2)\\ &\dot{x_2}(t)=-x_1-x_2(x_1^2+x_2^2) \end{aligned} ​x1​˙​(t)=x2​−x1​(x12​+x22​)x2​˙​(t)=−x1​−x2​(x12​+x22​)​

如果我们定义李雅普诺夫函数
V(x)=x12+x22V(\boldsymbol{x})=x_1^2+x_2^2V(x)=x12​+x22​

则有
V˙(x)=2x1x˙1+2x2x˙2=−2(x12+x22)2\begin{aligned} \dot{V}(\boldsymbol{x})&=2x_1\dot{x}_1+2x_2\dot{x}_2\\ &=-2(x_1^2+x_2^2)^2 \end{aligned} V˙(x)​=2x1​x˙1​+2x2​x˙2​=−2(x12​+x22​)2​

显然当 x≠0x\ne 0x​=0 时,有 V˙(x)<0\dot{V}(\boldsymbol{x})<0V˙(x)<0 ,所以系统是渐进稳定的。

详细的李雅普诺夫第二法

可见,如果能合理的选定李雅普诺夫函数,则非常容易的判断系统的稳定性。不过遗憾的是,对于复杂的系统,李雅普诺夫函数的选择可以称得上一门玄学,所以,对于工程师而言,笔者还是喜欢李雅普诺夫第一法。

参考文献1
参考文献2

李雅普诺夫稳定性、李雅普诺夫第一法、李雅普诺夫第二法及李雅普诺夫函数相关推荐

  1. 李雅普诺夫稳定性判别方法

    (6条消息) 现代控制理论(4)--李雅普诺夫稳定性理论_wang7301的博客-CSDN博客_李雅普诺夫稳定性

  2. 第二周、逻辑函数的表示方法及其相互转换

    第二周.逻辑函数的表示方法及其相互转换 一个逻辑函数可以用真值表.表达式.逻辑图.波形图 等方法来表示.既然它们都是表示同一种逻辑关系,显然可以 互相转换 . 由真值表写逻辑式 由表达式画逻辑图 由函 ...

  3. apply筛选 pandas_Pandas中第二好用的函数 | 优雅的apply

    原标题:Pandas中第二好用的函数 | 优雅的apply 这是Python数据分析实战基础的第四篇内容,也是基础系列的最后一篇,接下来就进入实战系列了.本文主要讲的是Pandas中第二好用的函数-- ...

  4. Pandas 中第二好用的函数是?

    作者 | 周志鹏 责编 | 刘静 这是Python数据分析实战基础的第四篇内容,也是基础系列的最后一篇,接下来就进入实战系列了.本文主要讲的是Pandas中第二好用的函数--apply. 为什么说第二 ...

  5. 第二十三章 SQL函数 CAST(二)

    文章目录 第二十三章 SQL函数 CAST(二) 转换位值 示例 第二十三章 SQL函数 CAST(二) 转换位值 可以将expr值转换为BIT以返回0或1. 如果expr为1或任何其他非零数值,则返 ...

  6. C语言编程>第二十六周 ① 函数fun的功能是:将形参b所指数组中的前半部分元素的值和后半部分元素的值对换。形参n中存放数组中数据的个数,若n为奇数,则中间的元素不动。

    例题:函数fun的功能是:将形参b所指数组中的前半部分元素的值和后半部分元素的值对换.形参n中存放数组中数据的个数,若n为奇数,则中间的元素不动. 例如,若a所指数组中的数据依次为:11 22 33 ...

  7. 利用51单片机+hc595芯片配合在led点阵上玩贪吃蛇 第二篇“自动运行函数”

    利用51单片机+hc595芯片配合在led点阵上玩贪吃蛇 第二篇"自动运行函数" 完整的项目链接: https://github.com/linxinloningg/51_chip ...

  8. 打表法与freopen 函数

    打表法与freopen 函数 打表法 freopen函数 注意事项 打表法有很多限制 打表法 简单的说就是 预先处理 freopen("C:\\Users\\14640\\Desktop\\ ...

  9. 第二类修正贝塞尔函数

    1 递推算式 摘自<MATLAB语音常用程序集> 第二类修正贝塞尔函数需要用第一类修正贝塞尔函数来计算

  10. 【除留余数法定义hash函数+线性探测法解决hash冲突】数据结构实验之查找七:线性之哈希表

    Think: 1知识点:除留余数法定义hash函数+线性探测法解决hash冲突 数据结构实验之查找七:线性之哈希表 Time Limit: 1000MS Memory Limit: 65536KB P ...

最新文章

  1. mac 不显示 外接屏幕_苹果笔记本A1707电脑屏幕不显示,主板进水腐蚀,一招秒杀...
  2. SAP系统配置常用命令大全
  3. TCP三次握手及四次挥手详解
  4. 10.1-10.12-广州软件所-实习工作日记
  5. Java设计模式之代理(动态代理,静态代理)
  6. MySQL还是h5储存数据_h5中五大存储方式
  7. java 只接受post请求_13SpringMvc_限定某个业务控制方法,只允许GET或POST请求方式访问...
  8. LeetCode 72 编辑距离
  9. 秋色园网站转移过程记录篇
  10. adlicensegen怎么生成许可_国家排污许可证申请系统常见问题及解决办法
  11. 淘宝现在什么类目比较好做?
  12. 2022年成都初级审计师考试测试题及答案
  13. 区块链安全分析:安全是重中之重,需要各方企业共同守护 | 新加坡Meetup
  14. 《PRML》第一章 读书笔记.1
  15. 数字图像信号-灰度内插
  16. 【枚举 + 求最大公约数方法】最大公约数等于K的子数组数目问题
  17. php切图工具,ps切片工具怎么切图
  18. 如何在电脑上运行war包
  19. MUR6060PT-ASEMI快恢复二极管MUR6060PT
  20. stm32驱动syn6288语音合成芯片

热门文章

  1. 如何彻底删掉360安全卫士,删除顽固的DLL文件
  2. 【科研论文】找到中文论文的英文引用格式
  3. mp4 avc格式_sps_pps
  4. Multisim使用入门
  5. 水经注地图发布服务中间件下载安装图文教程
  6. Flak框架 Flask从入门到精通
  7. Himall商城文件帮助类IOHelper(2)
  8. python微信语音转发方法_微信怎么转发语音(想要转到别的群或者人这样做)
  9. ai人工智能电话机器人应用市场分析
  10. 国家漏洞库CNNVD:关于Dnsmasq多个缓冲区错误漏洞的通报