电力系统状态估计,加权最小二乘直流状态估计,虚假数据注入攻击,基于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%)

这种跨节点联动的数据漂移,容易导致调度员误判线路负载。要是攻击者再鸡贼点,专挑关键线路搞事情,分分钟能让保护误动。

防御招数也不是没有,比如上抗差估计或者数据驱动检测。不过道高一尺魔高一丈,电力系统的攻防战可比《星际争霸》刺激多了。下次要是听说某地电网突然抽风,说不定就是哪个黑客在玩真人版《看门狗》呢。

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐