电力系统状态估计,加权最小二乘直流状态估计,虚假数据注入攻击,基于matlab和matpower包实现
电力系统状态估计是电网调度的"眼睛",今天咱们来扒一扒它的裤衩——哦不,是内核。先拿直流模型开刀,毕竟交流模型那堆三角函数看着就头大。在Matlab里用Matpower包搞这个,就像用瑞士军刀削苹果,顺手得很。
先整点实在的,打开Matpower直接加载14节点系统:
mpc = loadcase('case14'); results = runpf(mpc); % 先跑个潮流拿真实数据这时候系统里每个母线的电压相角θ都算出来了,这就是咱们的"真理"。但现实中调度中心可没这上帝视角,得靠测量数据猜谜——这就是状态估计存在的意义。
构建测量矩阵H的时候要注意,直流模型下量测方程简化的亲妈都不认识:
[Ybus, Yf, Yt] = makeYbus(mpc); H = -imag(Ybus); % 直流模型的雅可比矩阵直接取导纳矩阵虚部 H = H(2:end,2:end); % 去掉平衡节点这波操作相当于把交流模型里那些cosθ≈1、sinθ≈θ的近似都用上了,误差肯定有,但架不住计算量小啊。
电力系统状态估计,加权最小二乘直流状态估计,虚假数据注入攻击,基于matlab和matpower包实现
加权最小二乘的核心代码就几行:
W = diag(1./measurement_noise); % 权重矩阵,噪声大的数据说话不好使 x_hat = (H'*W*H) \ H'*W*z; % 经典WLS解算不过这里有个坑,测量值z得自己构造。聪明的攻击者这时候要笑了——既然状态估计就是个方程组,那我往z里掺点假数据...
举个虚假数据注入的栗子:
% 构造攻击向量 c = H(:,5); # 瞄准第5个状态量(比如某个中间节点的相角) z_attack = z + 0.1*c; # 往测量数据里注水 x_attack = (H'*W*H) \ H'*W*z_attack;这时候估计的节点相角会集体漂移,但残差检测愣是发现不了异常。就像往泡面里加了三聚氰胺,检测指标都正常,但电网调度已经吃着暗亏了。
来看个攻击前后的对比:
节点 | 真实值 | 正常估计 | 受攻击估计 --------------------------------- 5 | -0.121 | -0.119 | -0.138 (+16%) 7 | -0.143 | -0.141 | -0.162 (+13%)这种跨节点联动的数据漂移,容易导致调度员误判线路负载。要是攻击者再鸡贼点,专挑关键线路搞事情,分分钟能让保护误动。
防御招数也不是没有,比如上抗差估计或者数据驱动检测。不过道高一尺魔高一丈,电力系统的攻防战可比《星际争霸》刺激多了。下次要是听说某地电网突然抽风,说不定就是哪个黑客在玩真人版《看门狗》呢。