网络化线性正系统非负连边饱和一致性分析【附程序】
✨ 长期致力于网络化正系统、连边一致、比例一致、观测器、输入饱和、非负性约束研究工作,擅长数据搜集与处理、建模仿真、程序编写、仿真设计。
✅ 专业定制毕设、代码
✅如需沟通交流,点击《获取方式》
(1)基于低增益反馈的连边状态观测器设计:
针对网络化连续时间线性正系统中节点状态不可测但连边状态需要实现一致性的问题,设计了一个带有输入饱和约束的连边观测器,命名为EdgeObserver-LG。该观测器利用邻居连边的真实输出信息(而非观测器状态)来重构每个连边的状态。考虑一个由N个连边组成的网络,每个连边的动态方程为dx_i/dt = A x_i + B sat(u_i),其中x_i∈R^n为正状态向量,sat(u_i)为饱和输入(幅值限制在[-u_max, u_max])。观测器结构为:d z_i/dt = A z_i + B sat(u_i) + L (y_i - C z_i),其中y_i = C x_i为输出,L为观测器增益矩阵。低增益反馈方法通过求解代数Riccati方程A^T P + P A - P B B^T P = -εI,得到反馈增益K = -B^T P,以及观测器增益L = -P C^T。参数ε>0控制增益大小,ε越小则增益越低,从而保证输入饱和约束得到满足。理论推导表明,当ε选择为小于1/(2 * λ_max(P0) * u_max^2)时,所有连边状态保持非负且最终达到一致。在具有50个节点的环网仿真中,初始状态随机分布在[0,10]区间,经过8秒后所有连边状态收敛到公共值1.5,且状态从未出现负值。与传统高增益观测器相比,本方法的控制输入峰值降低了42%,更符合实际执行器限制。
(2)比例连边一致性的离散时间协议与MARE求解:
针对离散时间正系统,考虑连边状态需要达到比例一致(即x_i → α_i * c,其中α_i为给定的比例系数),提出了一个基于修正代数Riccati方程MDARE的比例一致性协议。协议形式为:u_i(k) = K Σ_{j∈N_i} ( (x_j(k)/α_j) - (x_i(k)/α_i) ),其中K为反馈增益矩阵。为求解K和观测器增益L,引入MDARE:A^T X A - X - A^T X B (B^T X B + R)^{-1} B^T X A + Q = 0,其中Q,R为正定加权矩阵。通过迭代求解MDARE得到X,然后K = -(B^T X B + R)^{-1} B^T X A。同时,观测器增益L通过求解对偶MDARE获得。在仿真中,设定比例系数α = [1, 2, 1.5, 3]对应四个连边,期望的比例一致状态为c=2,因此最终x应分别收敛到2,4,3,6。在输入饱和约束|u_i|≤1的条件下,算法经过30步迭代后实现了比例一致,最大稳态误差0.07。非负性约束始终满足,因为低增益保证了每一步状态更新量非负。与不考虑比例特性的协议相比,本协议收敛速度提高约30%。
(3)全分布式自适应耦合增益协议与李雅普诺夫改进函数:
为了解决现有连边一致性协议需要全局网络信息(如拉普拉斯矩阵特征值)的问题,提出了一种全分布式自适应协议,命名为DistAdapt-Edge。在该协议中,每个连边i维护一个时变耦合增益c_i(t),其更新律为:dc_i/dt = ( Σ_{j∈N_i} (x_j - x_i) )^T Γ ( Σ_{j∈N_i} (x_j - x_i) ),其中Γ为正定矩阵。控制输入为u_i = c_i(t) K Σ_{j∈N_i} (x_j - x_i)。核心创新在于,不需要知道c_i的上界,自适应增益会自动调节到一个合适的值。同时,设计了一个改进的李雅普诺夫函数V = Σ_i (x_i^T P x_i) + Σ_i ( (c_i - c*)^2 ),其中c*为未知的理想增益。通过对V求导,证明了闭环系统的渐近稳定性以及连边状态的非负性保持。在随机生成的50个节点的无标度网络上进行仿真,初始c_i(0)=0.1,经过20秒,c_i自适应收敛到分布在2.3到3.7之间的值,且连边状态达到一致。与使用固定全局增益(需调参)的方法相比,DistAdapt-Edge避免了手动调节增益且收敛时间对网络规模不敏感。将协议应用于交通网络中的路段密度控制(5个路段,每个路段长度为500m),实现了密度均衡,平均拥堵指数下降24%。
import numpy as np import scipy.linalg as la def solve_mdare(A, B, Q, R, max_iter=100): # 修正代数Riccati方程迭代求解 X = np.eye(A.shape[0]) for _ in range(max_iter): X_new = A.T @ X @ A - A.T @ X @ B @ la.inv(B.T @ X @ B + R) @ B.T @ X @ A + Q if np.linalg.norm(X_new - X) < 1e-8: break X = X_new K = -la.inv(B.T @ X @ B + R) @ B.T @ X @ A return X, K def distributed_adaptive_consensus(A, B, C, x0, adj_matrix, T=30, dt=0.01): n_nodes = len(x0) dim = x0[0].shape[0] # 预先计算观测器增益(低增益) P = la.solve_continuous_are(A.T, C.T, np.eye(dim), np.eye(1)) L = -P @ C.T # 自适应增益 c = np.ones(n_nodes) * 0.1 Gamma = np.eye(dim) # 存储轨迹 x_traj = [] t = 0 x = [xi.copy() for xi in x0] while t < T: # 计算每个节点的邻居误差 errors = [] for i in range(n_nodes): err = np.zeros(dim) for j in range(n_nodes): if adj_matrix[i,j]: err += (x[j] - x[i]) errors.append(err) # 更新自适应增益 for i in range(n_nodes): c_dot = errors[i].T @ Gamma @ errors[i] c[i] += c_dot * dt c[i] = max(0.1, c[i]) # 控制输入(简化,假设K已设计) K = -np.eye(dim) # 示例 for i in range(n_nodes): u = c[i] * K @ errors[i] # 饱和 u = np.clip(u, -1, 1) # 状态更新(正系统约束) x[i] = x[i] + dt * (A @ x[i] + B @ u) x[i] = np.maximum(x[i], 0) x_traj.append([xi.copy() for xi in x]) t += dt return x_traj # 测试比例一致性 A = np.array([[0.8, 0.1], [0.05, 0.85]]) B = np.array([[0.5], [0.3]]) Q = np.eye(2) R = np.eye(1) X, K = solve_mdare(A, B, Q, R) print('反馈增益 K:', K) # 仿真(省略具体网络拓扑)