欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 健康 > 养生 > 平衡截断(Balanced Truncation)—— MTALAB 和 Python 实现

平衡截断(Balanced Truncation)—— MTALAB 和 Python 实现

2025/5/2 4:58:33 来源:https://blog.csdn.net/xiaoyuting999/article/details/147606550  浏览:    关键词:平衡截断(Balanced Truncation)—— MTALAB 和 Python 实现

平衡截断

平衡截断(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 对角线;TTi:相似变换矩阵及其逆,用于在原始和平衡化坐标间转换。

算法起源与扩展

  • 历史:最早由 Moore 提出“平衡化(balancing)”概念,后由 Glover 完善,成为经典的 SVD 基模型约简方法。
  • 数学基础:本质上是 对可控性 Gramian 和可观性 Gramian 的同时对角化问题,等价于 对两正定矩阵进行相似对角化

其基本思路是:

  • 将原始系统通过相似变换(similarity transformation)转化到可控性和可观性 Gramian 相等且对角化的坐标下,所得对角线即为 Hankel 奇异值(Hankel singular values)
  • 奇异值较小的状态对系统输入-输出行为贡献较小,可 予以截断以简化模型,同时可利用理论上严格的误差界评估截断误差。

    截断阶段可选择多种策略,包括简单删除(Truncate)和匹配直流增益(MatchDC),并提供基于奇异值的 ∞ ∞ -范数误差上界估计。

    • Truncate:直接删除最后 n − r n-r nr 个状态,频域近似效果较好,但不保证直流增益匹配。
    • 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 GGr2i=r+1nσ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,以 提示截断时勿删除不稳定状态

最后将两部分按并联结构拼回。

为什么要先分离 稳定/不稳定 子系统?

  1. 稳定性保证:Gramian 只有在系统稳定时才存在有限、正定的解;对不稳定部分直接调用 Lyapunov 会发散或得到非正定结果。
  2. 误差界仅对稳定部分:平衡截断的 H ∞ \mathcal H_\infty H 误差界 ∥ G − G r ∥ ∞ ≤ 2 ∑ i > r σ i \|G - G_r\|_\infty \le 2\sum_{i>r} \sigma_i GGr2i>rσi只对稳定子系统有意义。
  3. 保留不稳定行为:不稳定极点通常对系统行为至关重要,不能被截断。

平衡截断过程

下面用坐标变换
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 xRn u ∈ R m u\in\mathbb R^m uRm y ∈ R p y\in\mathbb R^p yRp

  1. 求解 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=0eAτ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=0eATτ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.
  2. 平衡变换的构造

    • 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,T1=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=TTWoT1=Σ

  3. 坐标变换
    定义
    x ˉ = T x ⟹ x = T − 1 x ˉ . \bar x = T\,x \quad\Longrightarrow\quad x = T^{-1}\,\bar x. xˉ=Txx=T1xˉ.
    将原系统变换得
    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)=(TAT1)xˉ+(TB)u,y=Cx+Du=(CT1)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=TAT1,Bb=TB,Cb=CT1,
    则平衡化系统为
    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 刚好是各状态的能量度量。

  4. 截断降阶
    根据 Σ = d i a g ( σ 1 , … , σ n ) \Sigma=\mathrm{diag}(\sigma_1,\dots,\sigma_n) Σ=diag(σ1,,σn)保留能量大的前 r r r 个分量,舍弃后 n − r n-r nr 个分量。将
    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ˉ1Rr,xˉ2RnrAb=[A11A21A12A22],Bb=[B1B2],Cb=[C1C2],

丢弃 x ˉ 2 \bar x_2 xˉ2 及其关联块,令 x r ≡ x ˉ 1 x_r\equiv\bar x_1 xrxˉ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:rCx(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,其主要原因有以下几点:

  1. 避免显式构造乘积矩阵,降低计算成本与内存开销

    • 如果直接计算 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 本身,从而节省了额外的存储和矩阵乘法开销。

  2. 提高数值稳定性

    • 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 本身对误差更不敏感,能够在高病态情况下仍然给出可靠的奇异值排序和数值结果。
  3. 天然支持低秩/截断优化

    • 在大规模系统中,Gramian 往往是低秩或数值低秩的。Cholesky 分解(或其它“平方根”算法)可以直接求出低秩因子 R , S R,S R,S,保留有效维度 r ≪ n r\ll n rn,随后只对 S T R ∈ R r × r S^T R\in\mathbb R^{r\times r} STRRr×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 slycotpip 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=0eAτ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=0AmBBT(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,dAWc,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=0eATτ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,dATWo,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 向量。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词