平衡截断(Balanced Truncation)—— MTALAB 和 Python 实现
- 平衡截断
- balreal 算法原理
- 平衡截断过程
- 求解 HSV 为什么不使用定义而是使用 Cholesy 和SVD 分解?
- MATLAB 实践
- Python 实现
- 先验知识:可控性 Gramian W c W_c Wc、可观性 Gramian W o W_o Wo 以及 Hankel 奇异值(HSV) σ i \sigma_i σi
平衡截断
平衡截断(Balanced Truncation)是一种经典的 模型降阶方法,它通过衡量 各状态对系统输入–输出响应的贡献(Hankel 奇异值)来丢弃“能量”较小的状态,从而得到低阶近似模型。平衡截断既能 保证降阶后模型与原模型在频域响应上的接近性,也给出了严格的误差界。
在做平衡截断(或其他降阶)之后,不会直接再用原来高维的 状态向量 x x x——而是引入一个新的、维度已降到 r r r 的降阶状态向量 x r x_{r} xr。
balreal 算法原理
balreal
函数 是 MATLAB Control Toolbox 中用于 平衡截断(balanced truncation)模型约简的核心函数。
[sysb, g, T, Ti] = balreal(sys, opts);
其中,sysb
是平衡化后的系统(ss
对象);g
是 Hankel 奇异值向量,对应 Gramian 对角线;T
、Ti
:相似变换矩阵及其逆,用于在原始和平衡化坐标间转换。
算法起源与扩展
- 历史:最早由 Moore 提出“平衡化(balancing)”概念,后由 Glover 完善,成为经典的 SVD 基模型约简方法。
- 数学基础:本质上是 对可控性 Gramian 和可观性 Gramian 的同时对角化问题,等价于 对两正定矩阵进行相似对角化。
其基本思路是:
- 将原始系统通过相似变换(similarity transformation)转化到可控性和可观性 Gramian 相等且对角化的坐标下,所得对角线即为 Hankel 奇异值(Hankel singular values)。
- 奇异值较小的状态对系统输入-输出行为贡献较小,可 予以截断以简化模型,同时可利用理论上严格的误差界评估截断误差。
截断阶段可选择多种策略,包括简单删除(Truncate)和匹配直流增益(MatchDC),并提供基于奇异值的 ∞ ∞ ∞-范数误差上界估计。
- Truncate:直接删除最后 n − r n-r n−r 个状态,频域近似效果较好,但不保证直流增益匹配。
- MatchDC(默认):在截断同时重新计算系统矩阵,保证截断系统与原系统的直流增益一致。
平衡截断在 H ∞ \mathcal{H}_\infty H∞ 范数下满足经典误差界:
∥ G − G r ∥ ∞ ≤ 2 ∑ i = r + 1 n σ i \|G - G_r\|_\infty \;\le\; 2\,\sum_{i=r+1}^{n}\sigma_i ∥G−Gr∥∞≤2i=r+1∑nσi
其中 σ i \sigma_i σi 为被截断的 Hankel 奇异值,提供了保留前 r r r 个状态时最坏情况的频域误差估计。
对于含有 不稳定极点 的系统,balreal
(或 balred
)会首先调用 stabsep
对系统进行“稳定/不稳定”子系统分离:
G ( s ) = G s ( s ) + G u ( s ) , G(s) = G_s(s) \;+\; G_u(s), G(s)=Gs(s)+Gu(s),
其中 G s G_s Gs 是 所有极点实部<0 的稳定子系统, G u G_u Gu 是不稳定子系统。
- 针对稳定部分 G s G_s Gs 求解 Lyapunov 方程(李雅普诺夫方程)得到 Gramian,再 通过 Cholesky 分解及奇异值分解(SVD)构造平衡变换,最后输出平衡化系统及相应的 Hankel 奇异值和变换矩阵。
- 不稳定部分 G u G_u Gu 则原样保留,并在输出中 将对应奇异值设置为无穷大
Inf
,以 提示截断时勿删除不稳定状态。
最后将两部分按并联结构拼回。
为什么要先分离 稳定/不稳定 子系统?
- 稳定性保证:Gramian 只有在系统稳定时才存在有限、正定的解;对不稳定部分直接调用 Lyapunov 会发散或得到非正定结果。
- 误差界仅对稳定部分:平衡截断的 H ∞ \mathcal H_\infty H∞ 误差界 ∥ G − G r ∥ ∞ ≤ 2 ∑ i > r σ i \|G - G_r\|_\infty \le 2\sum_{i>r} \sigma_i ∥G−Gr∥∞≤2∑i>rσi只对稳定子系统有意义。
- 保留不稳定行为:不稳定极点通常对系统行为至关重要,不能被截断。
平衡截断过程
下面用坐标变换
x ˉ = T x \bar x = T\,x xˉ=Tx
(即 T T T 将原始状态 x x x 映到“平衡坐标” x ˉ \bar x xˉ)来重新推导平衡截断的全过程。
对于 原系统,考虑连续时间 LTI 系统
x ˙ = A x + B u , y = C x + D u \dot x = A\,x + B\,u, \\[5pt] y = C\,x + D\,u x˙=Ax+Bu,y=Cx+Du
其中 x ∈ R n x\in\mathbb R^n x∈Rn、 u ∈ R m u\in\mathbb R^m u∈Rm、 y ∈ R p y\in\mathbb R^p y∈Rp。
-
求解 Gramian 并构造变换矩阵
- 可控性 Gramian
W c = ∫ 0 ∞ e A τ B B T e A T τ d τ , W_c = \int_0^\infty e^{A\tau}B\,B^T e^{A^T\tau}\,d\tau, Wc=∫0∞eAτBBTeATτdτ,
解 Lyapunov 方程
A W c + W c A T + B B T = 0. A\,W_c + W_c\,A^T + B\,B^T = 0. AWc+WcAT+BBT=0. - 可观性 Gramian
W o = ∫ 0 ∞ e A T τ C T C e A τ d τ , W_o = \int_0^\infty e^{A^T\tau}C^T\,C\,e^{A\tau}\,d\tau, Wo=∫0∞eATτCTCeAτdτ,
解 Lyapunov 方程
A T W o + W o A + C T C = 0. A^T\,W_o + W_o\,A + C^T\,C = 0. ATWo+WoA+CTC=0.
- 可控性 Gramian
-
平衡变换的构造
-
对 W c W_c Wc 和 W o W_o Wo 做 Cholesky 分解:
W c = R R T , W o = S S T . W_c = R\,R^T,\quad W_o = S\,S^T. Wc=RRT,Wo=SST. -
对 R T S R^T S RTS 做 SVD:
R T S = U Σ V T , Σ = d i a g ( σ 1 , … , σ n ) , R^T S = U\,\Sigma\,V^T,\\[5pt] \Sigma = \mathrm{diag}(\sigma_1,\dots,\sigma_n), RTS=UΣVT,Σ=diag(σ1,…,σn),
{ σ i } \{\sigma_i\} {σi} 即 Hankel 奇异值,按降序排列。 -
于是取
T = Σ − 1 2 U T S T , T − 1 = R V Σ − 1 2 , T = \Sigma^{-\tfrac12} U^T S^T,\\ \qquad\\ T^{-1} = R\,V\,\Sigma^{-\tfrac12}, T=Σ−21UTST,T−1=RVΣ−21,能使得在新坐标下, W ~ c = T W c T T = Σ W ~ o = T − T W o T − 1 = Σ \tilde W_c = T\,W_c\,T^T = \Sigma \\[5pt] \tilde W_o = T^{-T}W_o\,T^{-1} = \Sigma W~c=TWcTT=ΣW~o=T−TWoT−1=Σ
-
-
坐标变换
定义
x ˉ = T x ⟹ x = T − 1 x ˉ . \bar x = T\,x \quad\Longrightarrow\quad x = T^{-1}\,\bar x. xˉ=Tx⟹x=T−1xˉ.
将原系统变换得
x ˉ ˙ = T x ˙ = T ( A x + B u ) = ( T A T − 1 ) x ˉ + ( T B ) u , y = C x + D u = ( C T − 1 ) x ˉ + D u . \dot{\bar x} = T\,\dot x = T\bigl(A\,x + B\,u\bigr) = \bigl(T\,A\,T^{-1}\bigr)\,\bar x \;+\; \bigl(T\,B\bigr)\,u, \\[5pt] y = C\,x + D\,u = \bigl(C\,T^{-1}\bigr)\,\bar x + D\,u. xˉ˙=Tx˙=T(Ax+Bu)=(TAT−1)xˉ+(TB)u,y=Cx+Du=(CT−1)xˉ+Du.
设
A b = T A T − 1 , B b = T B , C b = C T − 1 , A_b = T\,A\,T^{-1},\quad B_b = T\,B,\quad C_b = C\,T^{-1}, Ab=TAT−1,Bb=TB,Cb=CT−1,
则平衡化系统为
x ˉ ˙ = A b x ˉ + B b u , y = C b x ˉ + D u . \dot{\bar x} = A_b\,\bar x + B_b\,u,\\[5pt] y = C_b\,\bar x + D\,u. xˉ˙=Abxˉ+Bbu,y=Cbxˉ+Du.此时可控性和可观性 Gramian 均为 Σ \Sigma Σ,对角元素 σ i \sigma_i σi 刚好是各状态的能量度量。
-
截断降阶
根据 Σ = d i a g ( σ 1 , … , σ n ) \Sigma=\mathrm{diag}(\sigma_1,\dots,\sigma_n) Σ=diag(σ1,…,σn),保留能量大的前 r r r 个分量,舍弃后 n − r n-r n−r 个分量。将
x ˉ = [ x ˉ 1 x ˉ 2 ] , x ˉ 1 ∈ R r , x ˉ 2 ∈ R n − r A b = [ A 11 A 12 A 21 A 22 ] , B b = [ B 1 B 2 ] , C b = [ C 1 C 2 ] , \bar x = \begin{bmatrix}\bar x_1 \\[4pt]\bar x_2\end{bmatrix},\quad \bar x_1\in\mathbb R^r,\; \bar x_2\in\mathbb R^{n-r} \\[5pt] A_b = \begin{bmatrix}A_{11}&A_{12}\\[3pt]A_{21}&A_{22}\end{bmatrix},\;\\[5pt] B_b = \begin{bmatrix}B_1\\[3pt]B_2\end{bmatrix},\;\\[5pt] C_b = \begin{bmatrix}C_1 & C_2\end{bmatrix}, xˉ=[xˉ1xˉ2],xˉ1∈Rr,xˉ2∈Rn−rAb=[A11A21A12A22],Bb=[B1B2],Cb=[C1C2],
丢弃 x ˉ 2 \bar x_2 xˉ2 及其关联块,令 x r ≡ x ˉ 1 x_r\equiv\bar x_1 xr≡xˉ1,得到约简模型:
x ˙ r = A 11 x r + B 1 u , y = C 1 x r + D u . \dot x_r = A_{11}\,x_r + B_1\,u,\\ \qquad\\ y = C_1\,x_r + D\,u. x˙r=A11xr+B1u,y=C1xr+Du.
这样,整个过程严格按照“ x ˉ = T x \bar x=T\,x xˉ=Tx”的坐标变换来推导,变换后直接在平衡坐标下截断,就得到了降阶模型。
当对原系统做平衡截断降阶后,原来的初始状态 x ( 0 ) x(0) x(0) 以及 对应的初始输出 y ( 0 ) = C x ( 0 ) y(0)=C\,x(0) y(0)=Cx(0) 都必须 映射到降阶系统的坐标空间,否则就无法直接在低维系统中使用它们来启动仿真或分析。
- 降阶模型的初始状态:
-
给定原始系统的初始状态 x ( 0 ) x(0) x(0),降阶模型的初始状态应取
x r ( 0 ) = x ˉ 1 ( 0 ) = [ T x ( 0 ) ] 1 : r , x_r(0) \;=\;\bar x_1(0) \;=\;\Bigl[T\,x(0)\Bigr]_{1:r}, xr(0)=xˉ1(0)=[Tx(0)]1:r,即先用 T T T 映射到平衡坐标,再截取前 r r r 分量。
-
这样,降阶系统从正确的低维初始条件开始演化,才能近似再现原系统的初始响应。
-
- 原系统的初始输出:
- 原始系统在 t = 0 t=0 t=0 的输出是 y ( 0 ) = C x ( 0 ) + D u ( 0 ) y(0) = C\,x(0) + D\,u(0) y(0)=Cx(0)+Du(0),若已知 D = 0 D=0 D=0,且若假设初始输入 u ( 0 ) = 0 u(0)=0 u(0)=0,则初始输出简化为 y ( 0 ) = C x ( 0 ) y(0) = C\,x(0) y(0)=Cx(0);
- 降阶系统的输出方程 截断后,用 ( A r , B r , C r ) (A_r,B_r,C_r) (Ar,Br,Cr) 表示低维模型,则
y ( t ) ≈ C r x r ( t ) + D u ( t ) . y(t) \approx C_r\,x_r(t) + D\,u(t). y(t)≈Crxr(t)+Du(t). - 将 降阶初始状态 按上面方式设置为 x r ( 0 ) = [ T x ( 0 ) ] 1 : r x_r(0)=\bigl[T\,x(0)\bigr]_{1:r} xr(0)=[Tx(0)]1:r,则
C r x r ( 0 ) = C 1 x ˉ 1 ( 0 ) = C 1 [ T x ( 0 ) ] 1 : r ≈ C x ( 0 ) , C_r\,x_r(0) = C_1\,\bar x_1(0) = C_1\,\bigl[T\,x(0)\bigr]_{1:r} \approx C\,x(0), Crxr(0)=C1xˉ1(0)=C1[Tx(0)]1:r≈Cx(0),
其中 C 1 C_1 C1 是对 C T C\,T CT 的前 r r r 列截取 。 - 这样,降阶系统的初始输出就能尽量贴合原系统。
这样就解决了“维度不匹配”的问题,确保降阶模型能够从正确的低维初始条件开始,重现原系统的初始响应。
求解 HSV 为什么不使用定义而是使用 Cholesy 和SVD 分解?
在数值实现中,很少把 Hankel 奇异值(HSV)直接定义为可控 Gramian W c W_c Wc 与可观 Gramian W o W_o Wo 乘积的特征值平方根来计算,而是先做 Cholesky 分解再做 SVD,其主要原因有以下几点:
-
避免显式构造乘积矩阵,降低计算成本与内存开销
-
如果直接计算 W c W o W_cW_o WcWo,首先要把两个 n × n n\times n n×n 的 Gramian 显式地存储并相乘,生成一个新的 n × n n\times n n×n 矩阵,所需的存储量和乘法运算均为 O ( n 3 ) O(n^3) O(n3) 量级,且中间结果通常比原来更“密集”甚至更难存储。
-
而通过 Cholesky 分解:
W c = R R T , W o = S S T , W_c = R\,R^T,\quad W_o = S\,S^T, Wc=RRT,Wo=SST,
只需分别存储和操作 R R R 与 S S S(同样是三角矩阵),然后对 S T R S^T R STR 做一次 SVD,就能得到奇异值 Σ \Sigma Σ,即 HSV,无需生成 W c W o W_cW_o WcWo 本身,从而节省了额外的存储和矩阵乘法开销。
-
-
提高数值稳定性
- Gramian 通常是病态的:它的特征值会很快衰减(尤其是在高阶系统中),导致 W c W_c Wc 和 W o W_o Wo 的条件数都非常大。若再相乘得到 W c W o W_cW_o WcWo,其条件数大约是原来条件数的平方,数值误差成倍放大,可能导致特征值计算崩溃。
- 相反,Cholesky 分解对正定矩阵是数值稳定且无需列主元(pivoting)的操作,而对 S T R S^T R STR 做 SVD(而非对不对称的 W c W o W_cW_o WcWo 做特征分解)可以直接获取奇异值,且 SVD 本身对误差更不敏感,能够在高病态情况下仍然给出可靠的奇异值排序和数值结果。
-
天然支持低秩/截断优化
- 在大规模系统中,Gramian 往往是低秩或数值低秩的。Cholesky 分解(或其它“平方根”算法)可以直接求出低秩因子 R , S R,S R,S,保留有效维度 r ≪ n r\ll n r≪n,随后只对 S T R ∈ R r × r S^T R\in\mathbb R^{r\times r} STR∈Rr×r 做 SVD,大幅降低运算量。
- 这在“平方根算法”(square-root method)中被广泛采纳,也是 MATLAB
balreal
在大规模场景中常用的实现策略 。
总结:
- 定义法(直接特征值分解 W c W o W_cW_o WcWo)在实现上既费内存,又数值极不稳定;
- Cholesky+SVD 法(先分解再奇异值分解)既避免了构造病态乘积矩阵,也利用了数值线性代数中对称正定矩阵和奇异值分解的稳定性优势,因而成为计算 HSV 的标准做法。
MATLAB 实践
MATLAB 平衡截断 步骤:MATLAB -> 模型降阶器 -> 导入模型(如工作区中的状态空间模型 sys_siso = ss(A, B_siso, C_siso, D_siso)
变量)-> 选中模型后平衡截断 -> 输入目标阶数。
Python 实现
Python-Control 0.9.4 文档总览 — 无
balreal
定义
不过有现成的轮子 pyMor,使用 pip install pymor
安装。
注意,之前由于安装了一个
pip install slycot
,导致一运行就 报错AttributeError: module 'slycot' has no attribute 'sb03md57'
,通常是因为 Python 中安装的 Slycot 包缺少底层 Fortran/C 扩展,导致无法导入 SLICOT 的新接口 sb03md57。
- 解决方法:卸载掉即可,
pip uninstall slycot
和pip uninstall pymor
,然后再重新安装pip install pymor
。- 可能这就是 Python 的好处带来的弊端吧,开源的同时带来了很多不规范。
import scipy.sparse as sps
from pymor.models.iosys import LTIModel
from pymor.reductors.bt import BTReductorA, B, C, D, x0, y0 = ... # 自定义syso = LTIModel.from_matrices(A, B, C, D)
bt = BTReductor(fom)
sysb = bt.reduce(20)A_r = sysb.A.matrix # Reduced A matrix, shape (r, r)
B_r = sysb.B.matrix # Reduced B matrix, shape (r, m)
C_r = sysb.C.matrix # Reduced C matrix, shape (p, r)
D_r = sysb.D.matrix # Reduced D matrix, shape (p, m)Ti = bt.W # shape (n, r)
Ti_mat = Ti.to_numpy() # shape (r, n)
x0_r = Ti_mat.dot(x0) # shape (r,)
y0_r = C_r.dot(x0_r)plot_bode_and_error(syso, sysb)
def plot_bode_and_error(fom, rom, w=None, save_prefix=''):# 1) Compute H-infinity error bounds for all ordersbt = BTReductor(fom)bounds = bt.error_bounds() # Returns list of error bounds for orders 1,2,… :contentReference[oaicite:0]{index=0}# Select the bound corresponding to the reduced orderr = rom.ordererr_bound = bounds[r-1] if r <= len(bounds) else None# 2) Prepare default frequency range if not specifiedif w is None:w = (1e-5, 1e6)# 3) Plot Bode magnitude & phase for full and reduced modelsfig, axs = plt.subplots(2, 1, figsize=(8, 6), sharex=True)fig.suptitle('Bode Plot Comparison', fontsize=14)# Use pyMOR's built-in transfer_function bode_plot methods :contentReference[oaicite:1]{index=1}fom.transfer_function.bode_plot(w, ax=axs, label='Full-order')rom.transfer_function.bode_plot(w, ax=axs, linestyle='--', label='Reduced-order')# Finalize axesfor ax in axs:ax.grid(True)ax.legend(loc='best')axs[1].set_xlabel('Frequency (rad/s)')fig.tight_layout(rect=[0, 0, 1, 0.95])fig.savefig(f'{save_prefix}bode_comparison.png', dpi=300)plt.close(fig)# 4) Report the H-infinity error boundif err_bound is not None:print(f"Estimated H∞ error bound for reduced order {r}: {err_bound:.2e}") # :contentReference[oaicite:2]{index=2}else:print("No error bound available for order", r)return err_bound
先验知识:可控性 Gramian W c W_c Wc、可观性 Gramian W o W_o Wo 以及 Hankel 奇异值(HSV) σ i \sigma_i σi
- 可控性 Gramian W c W_c Wc 衡量 系统从零初始状态经输入到达某一状态所需的能量,反映了状态可控程度;
- 可观性 Gramian W o W_o Wo 衡量 系统从某一状态到零输出所需的能量,反映了状态可观测程度。
- Hankel 奇异值 σ i \sigma_i σi 定义为 可控性 Gramian 与可观性 Gramian 乘积 W c W o \,W_cW_o WcWo 的特征值的平方根,即 σ i = λ i W c W o , i = 1 , 2 , … , n \sigma_i = \sqrt{\lambda_i W_cW_o}, i=1,2,\dots ,n σi=λiWcWo,i=1,2,…,n,用以 量化每个状态在输入–输出能量传递中的贡献大小。
可控性 Gramian W c W_c Wc
在 MATLAB Control Toolbox 中,可使用命令
Wc = gram(sys,'c');
分别计算可控性 Gramian 或其 Cholesky 因子 (gram - MathWorks)。
对于 连续时间 LTI 系统,
x ˙ ( t ) = A x ( t ) + B u ( t ) , \dot x(t)=Ax(t)+Bu(t), x˙(t)=Ax(t)+Bu(t),
其无限时域可控性 Gramian 定义为
W c = ∫ 0 ∞ e A τ B B T e A T τ d τ , W_c \;=\;\int_{0}^{\infty}e^{A\tau}\,B\,B^T\,e^{A^T\tau}\,d\tau, Wc=∫0∞eAτBBTeATτdτ,
并且它是 Lyapunov 方程
A W c + W c A T + B B T = 0 A\,W_c + W_c\,A^T + B\,B^T = 0 AWc+WcAT+BBT=0
的唯一正定解 (Controllability Gramian)。
对于 离散时间 LTI 系统,
x [ k + 1 ] = A x [ k ] + B u [ k ] , x[k+1]=A\,x[k]+B\,u[k], x[k+1]=Ax[k]+Bu[k],
可控性 Gramian 定义为
W c , d = ∑ m = 0 ∞ A m B B T ( A T ) m , W_{c,d} \;=\;\sum_{m=0}^{\infty}A^{m}\,B\,B^T\,(A^{T})^{m}, Wc,d=m=0∑∞AmBBT(AT)m,
它满足离散 Lyapunov 方程
W c , d − A W c , d A T = B B T , W_{c,d} - A\,W_{c,d}\,A^T = B\,B^T, Wc,d−AWc,dAT=BBT,
且当 A A A 稳定(谱半径 <1)时, W c , d W_{c,d} Wc,d 为正定矩阵。
可观性 Gramian W o W_o Wo
对于 同一连续系统附带输出方程,
y ( t ) = C x ( t ) + D u ( t ) , y(t)=C\,x(t)+D\,u(t), y(t)=Cx(t)+Du(t),
无限时域可观性 Gramian 定义为
W o = ∫ 0 ∞ e A T τ C T C e A τ d τ , W_o \;=\;\int_{0}^{\infty}e^{A^T\tau}\,C^T\,C\,e^{A\tau}\,d\tau, Wo=∫0∞eATτCTCeAτdτ,
它是 Lyapunov 方程
A T W o + W o A + C T C = 0 A^T\,W_o + W_o\,A + C^T\,C = 0 ATWo+WoA+CTC=0
的唯一正定解 (Observability Gramian)。
对于 离散系统,
y [ k ] = C x [ k ] + D u [ k ] , y[k]=C\,x[k]+D\,u[k], y[k]=Cx[k]+Du[k],
可观性 Gramian 定义为
W o , d = ∑ m = 0 ∞ ( A T ) m C T C A m , W_{o,d} \;=\;\sum_{m=0}^{\infty}(A^T)^{m}\,C^T\,C\,A^{m}, Wo,d=m=0∑∞(AT)mCTCAm,
满足离散 Lyapunov 方程
W o , d − A T W o , d A = C T C , W_{o,d} - A^T\,W_{o,d}\,A = C^T\,C, Wo,d−ATWo,dA=CTC,
当 A A A 稳定时, W o , d W_{o,d} Wo,d 为正定。
Hankel 奇异值 σ i \sigma_i σi
Hankel 奇异值 { σ i } i = 1 n \{\sigma_i\}_{i=1}^n {σi}i=1n 定义为矩阵 W c W o W_cW_o WcWo 的特征值 { λ i } \{\lambda_i\} {λi} 的平方根:
σ i = λ i ( W c W o ) , i = 1 , … , n . \sigma_i \;=\;\sqrt{\lambda_i\!\bigl(W_c\,W_o\bigr)},\quad i=1,\dots,n. σi=λi(WcWo),i=1,…,n.
它们可视为 系统在输入–输出能量传递路径上的“能量谱”,按降序排列时,较大的 σ i \sigma_i σi 对模型行为贡献更大。
在 MATLAB 中,通过平衡变换函数 balreal
可直接得到 W c W_c Wc 与 W o W_o Wo 对角化后的奇异值序列,即 HSV 向量。
相关文章:
平衡截断(Balanced Truncation)—— MTALAB 和 Python 实现
平衡截断balreal 算法原理平衡截断过程求解 HSV 为什么不使用定义而是使用 Cholesy 和SVD 分解? MATLAB 实践Python 实现 先验知识:可控性 Gramian W c W_c Wc、可观性 Gramian W o W_o Wo 以及 Hankel 奇异值(HSV) σ i \s…...
机器手电机驱动器小体积解决方案
市场背景 随着工业4.0与人工智能技术的深度融合,智能机器人正加速渗透至医疗、物流、制造及服务等核心领域。据行业分析显示,2023年全球协作机器人市场规模同比增长23%,其中高精度关节驱动与小型化硬件设计成为技术迭代的关键需求。然而&…...
(数智化)采购管理系统平台开发费用
随着招标采购数智化升级加速,采购管理系统平台开发费用成为企业关注的焦点——从几十万到几百万不等,那么开发成本差异的背后藏着怎样的技术逻辑与价值密码呢?采购管理系统研发商郑州信源信息技术股份有限公司根据行业特点及客户实际实践总结…...
K8S Secret 快速开始
一、什么是 Secret? Kubernetes(K8s)中的 Secret 是一种用于存储和管理敏感信息(如密码、令牌、证书、API 密钥等)的资源对象。它避免了将敏感数据明文写入配置文件、镜像或代码中,提供了一种更安全的方式…...
TEN:开启实时语音交互的下一代AI Agent引擎
在AI技术飞速发展的今天,语音交互正成为人机交互的重要方式。传统的文本对话已无法满足用户对自然、高效沟通的需求,而TEN开源框架的出现,为开发者提供了构建超低延迟、可听可说的AI Agent的终极解决方案。 一、TEN的核心优势 超低延迟实时交…...
DeepSeek驱动的金市情绪量化:NLP解析贸易政策文本的情绪传导路径
【AI观察】政策信号与市场情绪的量化关联 基于自然语言处理技术对全球财经文本的情绪分析显示,4月30日亚盘时段现货黄金价格波动率较前日下降12.3%,与技术面修正指标呈现强相关性。特政府最新关税政策调整引发市场风险偏好指数(RPIÿ…...
JVM快速入门
目录 前言: 1.JVM的位置 2.JVM的体系结构 3.类加载器 类加载器中的一些方法和细节: 4.双亲委派机制 5.沙箱安全机制 概念 原理 Java 沙箱安全机制 应用场景 6.Native 7.方法区: 8.PC寄存器 9.栈 10.三种JVM HotSpot VM OpenJ9 VM Zin…...
spring--事务详解
spring事务 什么是事务 我们常说的事务,一般指数据库事务。 数据库事务是指 一个逻辑工作单元中执行的一系列(数据库操作),要么一起成功,要么一起失败 当工作单元中的所有操作全部正确完成时,工作单元的…...
CSS实现DIV水平与垂直居中方法总结
大家好,欢迎来到程序视点!我是你们的老朋友.小二! CSS实现DIV水平与垂直居中方法总结 一、水平居中方案 标准方法 .center-div {margin-left: auto;margin-right: auto; }关键点:必须声明DOCTYPE(推荐XHTML 1.0 Tran…...
AI 助力 Python:长时序植被遥感动态分析与生态评估
技术点目录 Python遥感数据处理基础及AI大模型应用技巧常用共享数据资源介绍AI辅助下地球科学数据处理方法及python实现AI辅助下植被参数遥感反演基本原理及python实现AI辅助下地球科学数据分析方法及python实现AI辅助下植被物候提取与分析实践应用AI辅助下植被时空动态分析及p…...
卫星变轨轨迹和推力模拟(单一引力源)MATLAB
代码说明: 常量定义:定义了万有引力常数、地球和月球的质量、半径以及地月平均距离。初始状态设置:设置卫星的初始位置、速度和姿态,以及月球的初始位置。模拟循环:在循环中计算地球和月球对卫星的引力,模…...
2025华东杯B题华东杯数学建模思路代码成品讲解工序安排问题
完整内容请看文章最下面的推广群 我将展示完整的文章、代码和结果 工序安排问题 摘要 本文研究的核心是制造业中的工序安排优化问题,源自实际生产管理中常见的资源分配挑战。问题背景设定为一家拥有100名工人和三条相同服装生产线的成衣制造厂,涉及裁…...
Python的赋值操作都是引用吗?
Python的赋值操作都是引用吗? 一言以蔽之:Python的赋值本质都是引用传递,但不可变对象的表现类似于值传递,这是由对象不可变性造成的效果。(我非常确信这篇笔记说的内容都是正确的,这篇笔记是deepseekv3的…...
学习influxDB的安装和使用
influxDB的使用场景 nfluxDB 是一种时序数据库,时序数据库通常被用在监控场景,用来收集各个节点采集到的监控指标,以及监控指标产生的时间点.比如我们收集的主机的监控数据,可以通过查询语句,统计查询过去30分钟内cpu的平均使用率是多少. 相比关系型数据库与时序数…...
LeetCode209_长度最小的子数组
LeetCode209_长度最小的子数组 标签:#数组 #二分查找 #前缀和 #滑动窗口Ⅰ. 题目Ⅱ. 示例0. 个人方法:滑动窗口 标签:#数组 #二分查找 #前缀和 #滑动窗口 Ⅰ. 题目 给定一个含有 n 个正整数的数组和一个正整数 target 。 找出该数组中满足…...
uniapp 实现时分秒 分别倒计时
效果 <view class"issue-price-countdown"> <CountDown :endTimestamp"1745996085000"></CountDown> </view> 引入组件 import CountDown from /components/CountDown.vue; <template> <view class&qu…...
ubuntu下一些环境配置
1、qhull sudo apt install qhull-bin libqhull-dev 2、cmake wget -O - https://apt.kitware.com/keys/kitware-archive-latest.asc 2>/dev/null | gpg --dearmor - | sudo tee /usr/share/keyrings/kitware-archive-keyring.gpg >/dev/null echo "deb [signed…...
el-check-box多选框和el-select下拉框组合
<template><div><el-selectv-model"selectedValues"multiplecollapse-tagsplaceholder"请选择电压等级"change"handleChange"><el-option key"all" value"all" class"select-all-option">…...
SPSS PCA+判别分析
1, 主成分分析PCA 我们只要对数化的变量数据: (1)对数据进行标准化处理: 选择【分析】—【描述统计】—【描述】 添加要标准化的变量,勾选【将标准化值另存为变量(Z)】,再点确定 SPSS软件本身不…...
【阿里云大模型高级工程师ACP习题集】2.7 通过微调增强模型能力 (下篇)(⭐️⭐️⭐️ 重点章节!!!)
习题集: 【单选题】在阿里云大模型微调中,以下关于预训练和微调的说法,错误的是?( ) A. 预训练使用自监督/无监督学习方式 B. 微调通常在大规模通用数据集上进行 C. 预训练模型可以为下游任务提供初始模型 D. 微调能让模型适应具体的下游任务 【多选题】LoRA微调中,低秩…...
ag-grid-react 列表导出csv列表getDataAsCsv (自定义导出列表配置)自定义新增,修改导出内容
1.ag-grid-react getDataAsCsv 新增导出字段 方法:临时添加列再导出 你可以通过 columnApi.setColumnDefs() 临时添加需要导出的字段,然后再调用 getDataAsCsv,导出后再恢复原来的列。 import { useRef } from react; import { AgGridReac…...
深度解析:Vue.js 性能优化全景指南(从原理到实践)
前言 随着 Vue.js 应用复杂度提升,性能问题逐渐成为制约用户体验的瓶颈。本文将系统性地剖析 Vue.js 性能优化的 核心原理、关键技巧、工具链支持,并通过真实案例演示如何提升大型应用的运行时性能与加载效率。 一、渲染层优化:减少不必要的…...
Linux -- 操作系统
一、冯•诺依曼体系结构 1、概念 # 在计算机发展历程中,核心作用就是解决人类问题。为了实现这一目标,计算机系统需具备特定结构和功能。 首先,计算机要配备输入设备,如鼠标、键盘、摄像头、话筒、磁盘(文件读取&…...
(初探)强化学习路径规划的理论基础与代码实现
一、强化学习路径规划的核心理论 1.1 马尔可夫决策过程(MDP)框架 理论基础: 路径规划问题可以建模为马尔可夫决策过程(Markov Decision Process, MDP),由五元组(S, A, P, R, γ)定义。其中,S&…...
分布式链路ID实现
实现原理 api入口或者网关处生成traceId,调用服务时优先检查是否头部带有traceId,有则复用,没有则生成 实现方式 处理api相关traceId 1.通过filter复用或者生成traceId,并且将traceId输入到响应头中 import java.io.IOExcept…...
Java @Transactional事物隔离级别和默认值详解
在 Java 开发中,Transactional 注解是 Spring 框架中用于管理事务的重要工具。它提供了多种配置选项,其中事务隔离级别是一个关键属性。本文将深入探讨 Transactional 注解的隔离级别默认值,并通过具体代码示例帮助你更好地理解和应用事务隔离…...
ComputeShader绘制全屏纯色纹理
参考 Getting Started With Compute Shaders In Unity 环境 Win10 Unity20194.40 全屏纯色纹理示例 使用ComputerShader逐个像素设置颜色 ComputeShader脚本 设置纹理颜色 #pragma kernel CSMainRWTexture2D<float4> Result;//纹理 half4 solidColor;//颜色[numth…...
关于 MCP 的理论知识学习
文章目录 1. 写在最前面2. 基本概念2.1 Why MCP2.1.1 大模型访问的局限2.1.2 过渡阶段—Function Call2.1.3 当前阶段— MCP 3. 碎碎念4. 参考资料 1. 写在最前面 最近有一项任务是写旧版本迁移到新版本的支持文档,文档的编写是借助于 cursor 帮忙写的。但是实现的…...
关于vue+iview中tabs嵌套及实际应用
最近在用vueiview框架做项目,在实际做项目中根据需求用到iview中的tabs标签页嵌套以及标签页增加删除功能。想着记录下来,以后可能会再用到。下面是页面。由于是公司的项目具体有些地方我会打码,不影响阅读! 1607751577(1).jpg ta…...
26考研——输入/输出系统_I/O 方式_DMA 方式(7)
408答疑 文章目录 三、I/O 方式DMA 方式DMA 方式的特点DMA 控制器的组成DMA 的传送方式停止 CPU 访存周期挪用DMA 与 CPU 交替访存 示例分析DMA 的传送过程 DMA 方式和中断方式的区别 四、参考资料鲍鱼科技课件26王道考研书 三、I/O 方式 DMA 方式 DMA 方式是一种完全由硬件进…...
处理vue3热加载后axios的请求重复访问的问题
在请求拦截上加上判断,热加载时清空拦截器 if (import.meta.hot) { const interceptorsRe axios.interceptors.response.handlers; const interceptorsRq axios.interceptors.request.handlers; interceptorsRe .length 0; // 清空已有响应拦截器 interceptorsR…...
【教学类-102-21】蝴蝶三色图作品3——异型书蝴蝶“满格变形图”一页2图、一页4图
前期设计 将蝴蝶撑满整个单元格,满格变形图。确保蝴蝶图案最大化 【教学类-102-20】蝴蝶三色图作品2——卡纸蝴蝶“满格变形图”(滴颜料按压对称花纹、原图切边后变形放大到A4横版最大化)-CSDN博客文章浏览阅读572次,点赞7次,收藏3次。【教学类-102-20】蝴蝶三色图作品2…...
【昇腾】Benchmark
1. MindIE 服务化 1.1 环境准备 镜像传送门 参数说明: device用于挂载卡,下面的例子是挂载了8张卡 倒数第二行的镜像名称记得修改 docker run -itd --privileged --namemindie --nethost \--shm-size 500g \--device/dev/davinci0 \--device/dev/da…...
【阿里云大模型高级工程师ACP学习笔记】2.7 通过微调增强模型能力 (下篇)(⭐️⭐️⭐️ 重点章节!!!)
学习目标 特别说明:由于这一章节是2025年3月官方重点更新的部分,新增内容非常多,因此我不得不整理成上、下两篇,方便大家参考。 备考阿里云大模型高级工程师ACP认证时,深入钻研《2.7通过微调增强模型能力(下篇)》,期望达成以下目标: 掌握高效微调技术:深入理解预训练与…...
【RustDesk 】中继1:压力测试 Python 版 RustDesk 中继服务器
测试 Python 版 RustDesk 中继服务器 测试我们实现的中继服务器有几种方法,从简单到复杂依次如下: 1. 基本连接测试客户端 创建一个简单的测试客户端来验证中继服务器的基本功能: 2. 用两个测试客户端测试中继功能 要测试完整的中继功能,你需要运行两个客户端实例来模拟…...
MCP 自定义python实现server服务,支持离线调用和远程接口访问形式
参考: https://blog.csdn.net/lingding_cn/article/details/147355620 其他百炼、mcp服务网址支持链接访问 server服务代码: 出行酒店查询 mcp server代码编写参考:https://blog.csdn.net/weixin_42357472/article/details/146503660 api_mcp_server.py import pickle im…...
搭建PCDN大节点,服务器该怎么配
搭建P2P大节点时,服务器要怎么配呢?需要综合考虑硬件性能、网络带宽、存储能力、系统架构以及安全性等多个方面,以确保节点能够高效、稳定地运行。 一、硬件配置 CPU:选择高性能的多核处理器,以满足高并发处理需求。核…...
JavaScript的3D库有哪些?
JavaScript的3D库有哪些? 在3D开发领域,JavaScript提供了多种库和框架,使开发者能够在浏览器中创建丰富的3D体验。以下是一些流行的3D方面的JavaScript库: Three.js:这是最著名的用于创建3D图形的JavaScript库之一。它…...
如何解决matlab/octave画图legend图例颜色一样的问题?
预期目的: 本意想用legend在画图的时候把对应线段的颜色对应起来,实际按照如下代码运行得不到预期的结果。 x [1:10;11:20]y1 x.^2;y2 0.5.*x.^3plot(x,y1,r,x,y2,b);legend(y x^2,y x^3) 代码运行结果如下: 原因 是matlab /octave默…...
[第十五章][15.3.2 shellcode注入攻击]ret2shellcode+[NewStarCTF 公开赛赛道]ret2shellcode
1、[NewStarCTF 公开赛赛道]ret2shellcode IDA 反编译看伪代码: buf mmap((void *)0x233000, 0x1000uLL, 7, 34, -1, 0LL); 这里直接给了 buf 7 的权限,即可读可写可执行,那么 shellcode 肯定写到 buf 里 buf 的映射地址:0x23…...
边缘计算:数字世界的”末梢神经系统”解析-优雅草卓伊凡
边缘计算:数字世界的”末梢神经系统”解析-优雅草卓伊凡 一、边缘计算深度解析 1.1 边缘计算的定义与架构 边缘计算(Edge Computing)是一种分布式计算范式,它将数据处理能力从传统的集中式云数据中心推向网络边缘,更…...
基于CATIA参数化球体建模的自动化插件开发实践——NX建模之球体命令的参考与移植
引言 在CATIA二次开发领域,Python因其灵活性和丰富的库支持逐渐成为高效工具开发的首选语言。本文将以笔者开发的CATIA球体自动化建模工具为例,参考NX软件中高效球体创建命令,深度解析基于PySide6 GUI框架与pycatia接口库的集成…...
ActiveMQ 可靠性保障:消息确认与重发机制(一)
引言 在当今分布式系统的架构中,消息中间件扮演着举足轻重的角色,而 ActiveMQ 作为一款广泛使用的开源消息中间件,凭借其对 JMS(Java Message Service)规范的支持、多种消息传输协议、丰富的消息模型(如点对…...
麒麟、UOS系统在线打开word文件并提取修订痕迹
麒麟、UOS系统在线打开word文件并提取修订痕迹 查看本示例演示效果(Windows版) 查看本示例演示效果(国产版)本示例关键代码的编写位置,请参考“开始 - 快速上手”里您所使用的开发语言框架的最简集成代码 注意 本文中…...
Vue3笔记摘录
1.Vue3整体知识概览图 2.ref与reactive具体使用区别 2-1 基本类型处理 const count1 ref(0) 使用ref自动转化为数字类型const count2 reactive(0) 参数必须是对象类型 2-2 具体使用过程 // ref 处理对象(自动解包) const user ref({name: John,a…...
大力探索“AI·Life爱生活”项目峰会暨战略投资签约仪式成功举办
2025年4月26日,杭州西溪雷迪森大酒店内气氛热烈非凡,大力探索(杭州)科技有限公司主办的“大力探索项目峰会暨战略投资签约仪式”在此隆重开启。这场汇聚了数百位行业精英与企业代表的盛会,不仅是一场智慧的碰撞&#x…...
复刻低成本机械臂 SO-ARM100 材料齐活篇
视频讲解: 复刻低成本机械臂 SO-ARM100 材料齐活篇 打印件基本ok,总共12个,尴尬的是github又更新了so-101,不过看了下还好只是优化了走线和几个结构键,影响不大,大不了后面再重新打印(有3d打印机…...
解读 AI绘画工作流ComfyUI Stable Diffusion
ComfyUI 是什么?图像工作流又是什么? 认识ComfyUI 从名词术语来看: ComfyUI是一个基于节点流程的Stable Diffusion操作界面,通过自定义节点、拖拽连线实现精准的工作流定制,以完成更复杂的图像生成工作。 </...
北极星 新美团核销接口对接
美团吃相难看,东哥就应该干掉他 申请官方接口一般来说很难了 现在无非就是几种第三方开放出来的接口 按量收费,但是需要一次性充钱收首期的技术服务费 ,然后按年收费就是我们技术自己解决的方式,方便便宜 ,代码齐全,…...
理解数据库存储以及查询(集合)
理解数据库存储以及查询(集合) 基本概念定义 主键集合: 定义:主键集合是由数据库表中的主键组成的一个集合。主键是表中唯一标识每一行记录的属性(或属性组合)。 特性:主键集合包含表的主键属性…...