不变性原理
例子
对于一个简单的倒立摆
可以知道系统状态方程是
L\ddot{\phi}+gsin\phi=0设
x_1=\phi\\\\
x_2=\dot{\phi}得到
\dot{x}_1=x_2\\\\
\dot{x}_2=-\frac{g}{L}sinx_1寻找李雅普诺夫函数,可以使用能量方程
E=K动能+P势能\\\\
=\frac{1}{2}mv^2+mgh=\frac{1}{2}m(L\dot{\phi})^2+mgL(1-cos\phi)所以得到李雅普诺夫函数
V(x)=\frac{1}{2}m(Lx_2)^2+mgL(1-cosx_1)开始分析,看得出来
V(0)=0并且,对于任意 $x_1,x_2$,可以得到
V(x)>0是满足正定条件的
求导得到
\dot{V}=\triangledown V f(x)=\begin{bmatrix}\frac{\partial V}{\partial x_1}&\frac{\partial V}{\partial x_2}\end{bmatrix}\begin{bmatrix}f_1\\f_2\end{bmatrix}=\ ...
系统的稳定性
稳定性:系统在离开平衡点之后的动态反应随时间不增加
函数的一些知识PD 正定
$V(x)=0\ if\ and\ only\ if\ x=0$
$V(x)>0\ if\ and\ only\ if\ x\neq 0$
PSD 半正定
$V(x)=0\ if\ and\ only\ if\ x=0$
$V(x)\geq0\ if\ and\ only\ if\ x\neq 0$
ND 负定
$V(x)=0\ if\ and\ only\ if\ x=0$
$V(x)<0\ if\ and\ only\ if\ x\neq 0$
NSD 半负定
$V(x)=0\ if\ and\ only\ if\ x=0$
$V(x)\leq0\ if\ and\ only\ if\ x\neq 0$
平衡点
对于一个函数满足
\dot{x}=f(x)\\f(x=0)=0\\\downarrow\\\dot{x}_{x=0}=0那就说这个 $x=0$ 点是该函数的一个平衡点
如果此时的函数 V 满足
V:PD\\\dot{V}:NSD\\\downarrow\\x=0是稳 ...
系统的可控性
对于一个系统状态方程
\dot{X}=AX+Bu离散型与连续型是一样的
X_{k+1}=AX_k+Bu_k
X_{1}=AX_0+Bu_0\\\\
X_2=AX_1+Bu_1=A^2X_0+ABu_0+Bu_1\\\\
\dots\\\\
X_n=AX_{n-1}+Bu_{n-1}=A^nX_0+A^{n-1}Bu_0+\dots+ABu_{n-2}+Bu_{n-1}转化为矩阵形式
X_n=\begin{bmatrix}B&AB&A^{n-1}B&A^n\end{bmatrix}\begin{bmatrix}u_{n-1}\\u_{n-2}\\\dots\\u_0\\X_0\end{bmatrix}想要实现该方程中 $u$ 有解,需要保证系数矩阵行满秩,也就是可控,一般来说初始状态 $X_0=0$,所以上式可以写作
X_n=\begin{bmatrix}B&AB&A^{n-1}B\end{bmatrix}\begin{bmatrix}u_{n-1}\\u_{n-2}\\\dots\\u_0\end{bmatrix}但是这里所说的系统可控并不能使系统从一点直接到另一点,只能沿着特 ...
Hamilton Matrix and Equation
最优化问题求解中的汉密尔顿方程是最优控制方法解决动态优化问题的一阶必要条件
汉密尔顿方程(Hamilton Equation)
理论推导首先看需要解决的问题
max\int_{t_0}^{t_1}f(x,u)dt\\\\
\dot{x}=g(x,u)\\\\
x(t_0)=x_0\\\\
x(t_1):free引入一个函数 $\lambda (t)$ 表示一个定义在 $t_0\leq t\leq t_1$ 上的连续的可微函数,那么对于任何满足上述约束的 $x(t),u(t)$ 有
\int_{t_0}^{t_1}f(x,u)dt=\int_{t_0}^{t_1}[f(x,u)+\lambda g(x,u)-\lambda \dot{x}]dt对上式最右侧右侧部分进行分部积分可以得到
-\int_{t_0}^{t_1}\lambda \dot{x}dt=-\lambda(t_1)x(t_1)+\lambda (t_0)x(t_0)+\int_{t_0}^{t_1}x\dot{\lambda}dt将上式带回原来的方程
\int_{t_0}^{t_1}f(x,u)dt=\int_{t ...
Riccati方程
前言第四讲:李群和李代数 - 知乎 (zhihu.com)
辛矩阵数学中,辛矩阵是指存在一个 $2n\times 2n$ 的矩阵 M,使之满足
M^T\Omega M=\Omega其中 $M^T$ 为 M 的转置矩阵,而辛矩阵 $\Omega$ 是一个固定的可逆斜对称矩阵,这类矩阵在适当的变化后皆能表为
\Omega=\begin{bmatrix}0&I\\-I&0\end{bmatrix}或者
\Omega=\begin{bmatrix}0&1\\-1&0\\&&...\\&&&0&1\\&&&-1&0\\\end{bmatrix}两者的差异仅在于基的排列,其中 $I$ 是 $n\times n$ 的单位矩阵,此外 $\det\Omega=1$ 并且 $\Omega ^{-1}=-\Omega$
性质
$\Omega^T=-\Omega=\Omega^{-1}$
$\Omega^T\Omega=\Omega\Omega^T=I$
$\Omega\Omega=-I$
$\det\Omega=1$
代数Riccati方程黎卡提方程是最简单的一类非线性方程。例如
y' = P( ...
矩阵求导和迹运算
求导对与矩阵 $X$, $A$, $U$, $V$
\frac{dX^T}{X}=I\\\\
\frac{dX}{X^T}=I\\\\
\frac{dX^TA}{X}=A\\\\
\frac{dAX}{X^T}=A\\\\
\frac{dAX}{X}=A^T\\\\
\frac{dXA}{X}=A^T\\\\
\frac{dX^TX}{X}=2X\\\\
\frac{dX^TAX}{X}=(A+A^T)X\\\\
\frac{dX^TAX}{XX^T}=\frac{d}{dX}(\frac{dX^TAX}{dX})=A^T+A\\\\
\frac{\partial U}{\partial X^T}=(\frac{\partial U^T}{\partial X})^T\\\\
\frac{\partial U^TV}{\partial X}=\frac{\partial U^T}{\partial X}V+\frac{\partial V^T}{\partial X}U^T\\\\
\frac{\partial UV^T}{\partial X}=\frac{\partial U}{ ...
系统离散化
连续时间系统一般来说系统的状态变化都是连续的
离散时间系统数字控制器,有时候计算时需要将系统的状态离散化,控制器是离散的输出。这就需要将离散系统和连续系统结合起来,需要用到一些模块。首先是通过ADC将传感器信号采样并转化为离散输出,同时其他的参数都将是离散的形式。随后控制器的输出将会通过DAC转化为连续的系统输出,控制量的输出需要使用到保持器来保证在一个控制周期之内的控制量保持不变。
对于采样,采样频率太快会使数据堆积,需要大量的存储数据,采样频率太小,小于控制周期,会产生误差,采样频率一般采用被采样数据频率的2倍甚至是5-10倍,如果在中断中采样并且处理数据的话,采样周期一定要大于处理所用的时间,否则这段期间内的采样就没有了意义。
有时候会把连续系统近似为离散的系统之后设计算法来控制系统,连续系统与离散系统的转换
采样周期的选取
一般来说肯定是采样周期越小越好 $T→0 \Rightarrow y[k]\rightarrow y(t)$,需要存储大量数据,内存占用多
$T\uparrow$ 会导致产生混叠,根据采样定理,采样频率至少为信号最高频率的2倍,一般选择5~10倍
对于实时 ...
传递函数和状态空间方程
状态空间对于一个系统的状态空间方程,可以使用 laplace 变换来得到系统的运行状态方程
状态空间方程——一个包含输入,输出,状态变量的集合的一阶微分方程,但是对于高阶的系统,可以选择合适的状态量来消除高阶的系数
根据下式求出的状态空间方程中,对于矩阵 A 的特征值是决定系统极点的位置,可能会决定系统的稳定性
状态空间方程的解过程不再写了,直接结论
X(t)=e^{A(t-t_0)}X(t_0)+\int_{t_0}^t{e^{A(t-\tau)}Bu(\tau)}d\tau其中 $e^{A(t-t_0)}$ 是状态转移矩阵,表示系统状态转移变化的规律,是一个实时变化的矩阵,A 矩阵对其有着重要的作用,当 A 的特征值小于0时, $X(t)$ 是不断趋近于 0 的,是系统稳定性分析的一个重要方式,但是 A 矩阵的特征值中含有虚数就表示该系统是有震荡的(根据欧拉公式,引入虚数相当于是引入了 sint 和 cost,实际上是引入了震荡),要保证系统稳定,一定要保证特征值的实部小于零
第二项是一个卷积,表示输入与输出之间的动态变化的关系
传递函数→状态空间方程一阶系统假设传递函数为
...
深入理解计算机系统
快捷键窗口操作切换窗口:Alt+Tab窗口移动:Win+↑/↓/←/→
文件操作保存:Ctrl+S关闭文件:Ctrl+W撤销:Ctrl+Z恢复:Ctrl+Shift+Z复制/粘贴:Ctrl+C/V向上/向下翻页:PageUp/PageDown切换到左/右边的文件:Ctrl+PageUp/PageDown
选择操作全选:Ctrl+A选中:Shift+各种移动/跳转
光标操作上/下/左/右移动光标:↑/↓/←/→向上/下插入光标:Ctrl+Alt+↑/↓在下一个匹配项处插入光标:Ctrl+D查找/替换匹配项:Ctrl+F/H全局查找/替换匹配项:Ctrl+Shift+F/H
更改操作行删除:Shift+Delete行上/下交换:Alt+↑/↓
跳转操作跳转到上/下个光标位置:Alt+←/→跳转到词首/尾:Ctrl+←/→跳转到行首/尾:Home/End跳转到列首/尾:Ctrl+Home/End跳转到行:Ctrl+G跳转到括号:Ctrl+Shift+\跳到定义:F12查看定义:Alt+F12
VSCode 其他操作向右拆分编辑器:Ctrl+\行注释:Ctrl+/命令面板:F1 或 ctrl+ ...
代码整洁之道
时刻保持初心,保持代码整洁
变量命名规则
名副其实,见名知意
避免误导
做有意义的区分
使用读的出来的名称
使用可以搜索的名称
避免使用编码
成员前缀
匈牙利语标记法
避免思维映射
类名
类名和对象名应该是名词或名词短语
类名不应当是动词
方法名
方法名应当是动词或动词短语
别扮可爱
每个概念对应一个词
别用双关语
使用解决方案领域的名称
给这些事取个技术性的名称,通常是最靠谱的做法。
使用源自所涉问题领域的名称
添加有意义的语境,不要添加没用的语境
函数的定义规则
短小 函数的第一规则是要短小。第二条规则是还要更短小。
只做一件事
每个函数一个抽象层级
switch语句
使用描述性的名称
函数参数
最理想的参数数量是零(零参数函数),其次是一(单参数函数),再次是二(双参数函数),应尽量避免三(三参数函数)。有足够特殊的理由才能用三个以上参数(多参数函数)—所以无论如何也不要这么做。
标识参数丑陋不堪。向函数传入布尔值简直就是骇人听闻的做法。这样做,方法签名立刻变得复杂起来,大声宣布本函数不止做一件事。如果标识为 true 将会这样做,标识为 false 则会那样做 ...