牛顿-拉夫森法潮流计算

本文最后更新于:2025年3月27日 下午

在电力系统潮流计算中,我们需要求解非线性功率平衡方程。牛顿-拉夫森法的基本思想就是将这些非线性方程在当前点做泰勒展开,忽略高阶项,从而用雅各比矩阵来描述局部线性关系,迭代求解更新量。

实验数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
%说明:节点数据表用第1,3,4,5,6,7,8,9,14,15项数据。
% 节点类型:0:PQ节点;2:PV节点;3:平衡节点。
% 支路数据表用第1,2,6,7,8,9,15项数据。
% 支路类型:0:线路;1:变压器。
% 变压器模型为XT+理想变压器,变压器的变比为1:k。

%节点数据表
% 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
% 节点 区 类 电压 相角 有功 无功 有功 无功 电压 期望 乏值 乏值 并联 并联 远端控 节点
% 号 号 型 负荷 负荷 出力 出力 基准 电压 上限 下限 电导 电纳 制节点号 号
%
Node=[1 1 2 1.0350 0.00 0.00 0.00 160.00 30.00 230.00 1.032 0.0000 0.0000 0.0000 0.0000 0 1
2 1 2 1.0350 0.00 0.00 0.00 160.00 50.00 18.00 1.025 0.0000 0.0000 0.0000 0.0000 0 2
3 1 2 1.0350 0.00 0.00 0.00 100.00 50.00 13.80 1.025 0.0000 0.0000 0.0000 0.0000 0 3
4 1 0 1.0000 0.00 0.00 0.00 0.00 0.00 230.00 1.026 0.0000 0.0000 0.0000 0.0000 0 4
5 1 0 1.0000 0.00 200.00 80.00 0.00 0.00 0.00 0.996 0.0000 0.0000 0.0000 0.6000 0 5
6 1 0 1.0000 0.00 230.00 77.00 0.00 0.00 0.00 1.013 0.0000 0.0000 0.0000 0.7000 0 6
7 1 0 1.0000 0.00 0.00 0.00 0.00 0.00 230.00 1.026 0.0000 0.0000 0.0000 0.0000 0 7
8 1 0 1.0000 0.00 200.00 70.00 0.00 0.00 0.00 1.016 0.0000 0.0000 0.0000 0.3000 0 8
9 1 0 1.0000 0.00 0.00 0.00 0.00 0.00 16.50 1.040 0.0000 0.0000 0.0000 0.0000 0 9
10 1 0 1.0000 0.00 0.00 0.00 0.00 0.00 230.00 1.032 0.0000 0.0000 0.0000 0.0000 0 10
11 1 3 1.0400 0.00 0.00 0.00 200.00 100.00 230.00 1.032 0.0000 0.0000 0.0000 0.0000 0 11];

%支路数据表
% 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
% 从 到 区 区 电 类 电阻 电抗 电纳 支路额 支路额 支路额 控制 位 变压器最 移相器最 最小 最大 步长 最小 最大 支路
% 号 号 路 型 定功率 定功率 定功率 母线号 置 终传输比 终移相角 变比 变比 电压 电压 号
Branch=[11 4 1 1 1 0 0.0 0.0576 0.0 0. 0. 0. 0 0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 1
2 7 1 1 1 0 0.0 0.0625 0.0 0. 0. 0. 0 0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 2
3 9 1 1 1 1 0.0 0.0586 0.0 0. 0. 0. 0 0 1.07 0.0 0.0 0.0 0.0 0.0 0.0 3
10 1 1 1 1 1 0.0 0.0600 0.0 0. 0. 0. 0 0 1.025 0.0 0.0 0.0 0.0 0.0 0.0 4
4 5 1 1 1 0 0.010 0.085 0.0422 0. 0. 0. 0 0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 5
4 6 1 1 1 0 0.017 0.092 0.0380 0. 0. 0. 0 0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 6
5 7 1 1 1 0 0.032 0.161 0.0734 0. 0. 0. 0 0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 7
6 9 1 1 1 0 0.039 0.170 0.0860 0. 0. 0. 0 0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 8
7 8 1 1 1 0 0.0085 0.072 0.0358 0. 0. 0. 0 0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 9
8 9 1 1 1 0 0.0119 0.1008 0.0502 0. 0. 0. 0 0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 10
8 10 1 1 1 0 0.0357 0.3024 0.1506 0. 0. 0. 0 0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 11
8 10 1 1 1 0 0.0357 0.3024 0.1506 0. 0. 0. 0 0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 12];

使用牛顿-拉夫森法进行电力系统潮流计算的步骤如下:

1.形成节点导纳矩阵

根据网络拓扑和支路参数(阻抗、导纳等),构建节点导纳矩阵$Y=G+jB$,其中$G$为电导矩阵,$B$为电纳矩阵。

初始化节点电压

  • PQ节点:电压幅值 $V$ 设为 $1.0 p.u.$,相角设为 0。
  • PV节点:电压幅值 $V$ 设为设定值,相角设为 0。
  • 平衡节点:电压幅值和相角固定,不参与迭代。

节点分类

1
2
3
4
n = size(Node, 1);                  % 节点总数
slack_node = find(Node(:,3) ==3); % 提取 Node 矩阵的第3列(平衡节点)
pv_nodes = find(Node(:,3) ==2); % PV节点索引
pq_nodes = find(Node(:,3) ==0); % PQ节点索引
  • size(A, dim) : 返回矩阵A在维度 dim 的大小(dim=1 为行数,dim=2 为列数)。
  • find(condition) : 返回满足逻辑条件 condition 的元素的索引。
  • deg2rad(degrees) : 将角度从度数转换为弧度。
  • A(:, columns) : 提取矩阵 A 的指定列(columns 可以是单列或范围)。
  • A(rows, columns) = val : 对矩阵 A 的指定行和列赋值。

电压初始化

1
2
V = Node(:,4);                  % 提取 Node 矩阵的第4列(初始电压幅值,标幺值)
theta = deg2rad(Node(:,5)); % 相角(转换为弧度)

功率标幺化

1
2
S_base = 100; 
Node(:,6:9) = Node(:,6:9)/S_base; % 负荷、发电机功率转为标幺值
  • 将实际功率(MW/MVar)除以基准功率,转换为标幺值。

构建导纳矩阵

导纳矩阵描述节点之间的电气连接关系。

  • 自导纳 $Y_{ii}$ 表示节点 $i$ 自身与所有连接的支路(包括对地导纳)的总导纳。表示当该节点电压变化时,其自身注入电流的能力。

  • 互导纳 $Y_{ij}$ 表示节点 $i$ 与节点 $j$ 之间的电气耦合关系。

    • 互导纳的负号表示电流从节点 $i$ 流出到节点 $j$ 。其绝对值即为支路导纳,反映节点间的直接电气连接强度。
  • 导纳矩阵的本质是 节点电压方程 的系数矩阵,满足基尔霍夫电流定律(KCL):
    $$
    I=YV
    $$

计算公式为:

  • 自导纳(对角线元素)
    $$
    Y_{ii} = \sum_{j \in \text{邻接节点}} y_{ij} + \sum_{k \in \text{接地支路}} y_{shunt,k}
    $$
  • 互导纳(非对角线元素)
    $$
    Y_{ij} = -y_{ij}
    $$
  • 支路导纳
    $$
    y_{ij}=\frac{1}{R_{ij}+jX_{ij}}
    $$
  • 支路对地导纳:来源于传输线路的电容效应,通常通过等效π模型描述。
    $$
    y_{shunt,k}=jB_{shunt,k}
    $$

节点并联导纳

  • 并联电导 $G_{shunt}$ 代表节点对地的有功损耗(如并联电阻)。
  • 并联电纳 $B_{shunt}$ 代表节点对地的无功补偿或充电电容(如并联电容器或电抗器)。

在构造节点导纳矩阵(Ybus)时,每个节点的对角元表示该节点的“自导纳”,即所有与该节点相连的导纳之和。对于直接并联于节点的支路(或称并联支路、节点并联导纳),它们直接连接在节点与地之间,因此只影响该节点自身,不会与其他节点形成互导纳,这就要求在构造 Ybus 时把这些并联导纳直接加到该节点的对角元上。

变压器模型的导纳矩阵(变比k:1)

  • 自导纳(对角线元素)
    $$
    Y_{ii} = \sum_{j \in \text{邻接节点}} y_{ij} + \sum_{k \in \text{接地支路}} y_{shunt,k}
    $$
  • 互导纳(非对角线元素)
    $$
    Y_{ij} = -y_{ij}
    $$

Matlab实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
% 初始化导纳矩阵
Y = zeros(n, n); % 初始化,n为节点数

for k = 1:size(Branch, 1)
from = Branch(k,1); % 支路起始节点
to = Branch(k,2); % 支路终止节点
type_br = Branch(k,6); % 支路类型(0-线路,1-变压器)
R = Branch(k,7); % 电阻(标幺值)
X = Branch(k,8); % 电抗(标幺值)
B_shunt = Branch(k,9); % 对地导纳(标幺值)
tap = Branch(k,15); % 变压器变比(仅变压器有效)

Z = R + 1i*X; % 支路阻抗
if type_br == 0 % 线路
Y_series = 1/Z; % 线路导纳
Y_shunt = 1i*B_shunt/2; % 对地导纳(平分到两端)
% 更新导纳矩阵
Y(from, from) = Y(from, from) + Y_series + Y_shunt;
Y(to, to) = Y(to, to) + Y_series + Y_shunt;
Y(from, to) = Y(from, to) - Y_series;
Y(to, from) = Y(to, from) - Y_series;
elseif type_br == 1 % 变压器
Y_series = 1/Z;
% 考虑变比修正
Y(from, from) = Y(from, from) + Y_series / (tap^2);
Y(to, to) = Y(to, to) + Y_series;
Y(from, to) = Y(from, to) - Y_series / tap;
Y(to, from) = Y(to, from) - Y_series / tap;
end
end

% 添加节点并联导纳
for i = 1:n
G_shunt = Node(i,14); % 提取并联电导
B_shunt = Node(i,15); % 提取并联电纳
Y_shunt = G_shunt + 1i*B_shunt; % 节点对地导纳
Y(i,i) = Y(i,i) + Y_shunt; % 添加到自导纳
end

G = real(Y); % 电导矩阵
B = imag(Y); % 电纳矩阵

计算得到的导纳矩阵

2.计算功率误差

根据当前电压值,计算各节点的注入功率$P_i$和$Q_i$,并计算功率误差:

$$
P_i = \sum_{j=1}^n V_i V_j \left( G_{ij}\cos\theta_{ij} + B_{ij}\sin\theta_{ij} \right)
$$

$$
Q_i = \sum_{j=1}^n V_i V_j \left( G_{ij}\sin\theta_{ij} - B_{ij}\cos\theta_{ij} \right)
$$
其中 $\theta_{ij} = \theta_i - \theta_j$,$Y_{ij}=G_{ij}+jB_{ij}$ 为导纳矩阵元素。

Matlab代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
function [P, Q] = calculate_power(V, theta, G, B, Node, n)
P = zeros(n,1);
Q = zeros(n,1);
for i = 1:n
% 节点并联导纳
G_shunt = Node(i,14); % 并联电导
B_shunt = Node(i,15); % 并联电纳

for j = 1:n
theta_ij = theta(i) - theta(j);
P(i) = P(i) + V(i)*V(j)*(G(i,j)*cos(theta_ij) + B(i,j)*sin(theta_ij));
Q(i) = Q(i) + V(i)*V(j)*(G(i,j)*sin(theta_ij) - B(i,j)*cos(theta_ij));
end
end
end

3.构建雅可比矩阵

在电力系统潮流计算中,我们需要求解非线性功率平衡方程。牛顿-拉夫森法的基本思想就是将这些非线性方程在当前点做泰勒展开,忽略高阶项,从而用雅各比矩阵来描述局部线性关系,迭代求解更新量。

对于电力系统,设功率平衡方程为:

$$ F(\theta, V)= \begin{bmatrix} \Delta P \\ \Delta Q \\ \end{bmatrix}=0 $$
* 其中, $\Delta P$ 和 $\Delta Q$ 分别为有功和无功功率的偏差。

牛顿-拉夫森迭代公式写作:

$$ J \cdot \begin{bmatrix} \Delta \theta \\ \Delta V \end{bmatrix} = - \begin{bmatrix} \Delta P \\ \Delta Q \\ \end{bmatrix} $$

这里的雅可比矩阵 $J$,由四个子矩阵构成。

$$ J = \begin{bmatrix} \frac{\partial \Delta P}{\partial \theta} & \frac{\partial \Delta P}{\partial V} \\ \frac{\partial \Delta Q}{\partial \theta} & \frac{\partial \Delta Q}{\partial V} \\ \end{bmatrix} =\begin{bmatrix} H & N \\ J & L \\ \end{bmatrix} $$

每个部分反映了功率平衡方程中各变量间的敏感度,帮助确定如何调整节点电压和相角,使得功率偏差趋于零。

雅各比矩阵的构建

  • H矩阵 : $\Delta P$ 对 $\theta$ 的偏导数
    $$
    H_{ii} = -\left( Q_i + B_{ii} V_i^2 \right)
    $$

$$
H_{ij}=V_iV_j(G_{ij}sin\theta_{ij}-B_{ij}cos\theta_{ij})
$$

$$\theta_{ij}=\theta_{i}-\theta_{j}$$

  • N矩阵:$\Delta P$ 对电压$V$的偏导数(仅PQ节点)
    $$
    N_{ii} = \frac{P_i}{V_i} + G_{ii} V_i
    $$
    $$
    N_{ij} = V_i \left( G_{ij} \cos\theta_{ij} + B_{ij} \sin\theta_{ij} \right)
    $$

  • J矩阵 :$\Delta Q$ 对相角$\theta$的偏导数(仅PQ节点)
    $$
    J_{ii} = P_i - G_{ii} V_i^2
    $$
    $$
    J_{ij} = V_i V_j \left( G_{ij} \cos\theta_{ij} + B_{ij} \sin\theta_{ij} \right)
    $$

  • L矩阵 : $\Delta Q$ 对 $V$ 的偏导数
    $$
    L_{ii} = \frac{Q_i}{V_i} - B_{ii} V_i
    $$
    $$
    L_{ij} = V_i \left( G_{ij}\sin(\theta_i - \theta_j) - B_{ij}\cos(\theta_i - \theta_j) \right)
    $$

理解雅各比矩阵的意义

  • 局部线性化:
    在迭代求解过程中,非线性函数在当前解附近可以被近似为线性函数,雅各比矩阵提供了这种线性近似的斜率信息。

  • 灵敏度分析:
    雅各比矩阵的各个元素反映了各个变量(如电压幅值、相角)变化对功率偏差的影响程度,是进行灵敏度分析和优化的重要依据。

  • 求解更新量:
    通过求解线性方程组 $J\Delta x=-F(x)$ ,可以得到下一次迭代的修正量 $\Delta x$ ,进而更新解,直至收敛。

Matlab代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
function J = build_jacobian(V, theta, G, B, Node, non_slack, pq_nodes, P, Q)
n_non_slack = length(non_slack); % 非平衡节点数量(θ变量数)
n_pq = length(pq_nodes); % PQ节点数量(V变量数)
% 初始化雅可比矩阵(维度:n_non_slack + n_pq)
J = zeros(n_non_slack + n_pq, n_non_slack + n_pq);

% 提取所有节点的并联导纳(用于雅各比矩阵修正)
G_shunt = Node(:,14);
B_shunt = Node(:,15);

% ========== 填充H和N矩阵(ΔP的偏导) ==========
for i = 1:n_non_slack
node_i = non_slack(i); % 当前非平衡节点

% --- H矩阵(ΔP对θ的偏导) ---
for j = 1:n_non_slack
node_j = non_slack(j); % 目标节点编号
if node_i == node_j
% 对角元素
H = Q(node_i) - B(node_i,node_i)* V(node_i)^2;
else % 非对角元素
theta_ij = theta(node_i) - theta(node_j);
H = V(node_i)*V(node_j)*(G(node_i,node_j)*sin(theta_ij) - B(node_i,node_j)*cos(theta_ij));
end
% 填充H矩阵
J(i,j) = H;
end

% --- N矩阵(ΔP对V的偏导,仅PQ节点) ---
for j = 1:n_pq
node_v = pq_nodes(j); % 目标PQ节点编号
if node_i == node_v
% 对角元素
N = (P(node_i)/V(node_i) + G(node_i, node_i) * V(node_i));
else
% 非对角元素
theta_iv = theta(node_i) - theta(node_v);
N = V(node_i) * (G(node_i, node_v)*cos(theta_iv) + B(node_i, node_v)*sin(theta_iv));
end
% 填充N矩阵
J(i, n_non_slack + j) = N;
end
end

% ========== 填充J和L矩阵(ΔQ的偏导) ==========
for i = 1:n_pq
node_i = pq_nodes(i); % 当前PQ节点编号

% --- J矩阵(ΔQ对θ的偏导) ---
for j = 1:n_non_slack
node_j = non_slack(j); % 目标节点编号
theta_ij = theta(node_i) - theta(node_j);
if node_i == node_j
% 对角元素
J_val = (P(node_i) - G(node_i, node_i)* V(node_i)^2);
else
% 非对角元素
J_val = V(node_i)*V(node_j)*(G(node_i, node_j)*cos(theta_ij) + B(node_i, node_j)*sin(theta_ij));
end
% 填充J矩阵
J(n_non_slack + i, j) = J_val;
end

% --- L矩阵(ΔQ对V的偏导) ---
for j = 1:n_pq
node_v = pq_nodes(j); % 目标PQ节点编号
theta_iv = theta(node_i) - theta(node_v);
if node_i == node_v
% 对角元素
L = (Q(node_i)/V(node_i) - B(node_i, node_i) * V(node_i));
else
% 非对角元素
L = V(node_i)*(G(node_i, node_v)*sin(theta_iv) - B(node_i, node_v)*cos(theta_iv));
end
% 填充L矩阵
J(n_non_slack + i, n_non_slack + j) = L;
end
end
end

输入参数

  • V: 电压幅值向量(标幺值)
  • theta: 电压相角向量(弧度)
  • G, B: 导纳矩阵的实部(电导)和虚部(电纳)
  • Node: 节点数据表(含并联导纳)
  • non_slack: 非平衡节点索引(需计算θ的节点)
  • pq_nodes: PQ节点索引(需计算V的节点)
  • P, Q: 节点注入功率计算值

计算得到的雅各比矩阵

4.迭代循环

4.1 解修正方程

修正方程为:
$$
J
\begin{bmatrix}
\Delta \theta \[0.5em]
\Delta V
\end{bmatrix}=\begin{bmatrix}
\Delta P \[0.5em]
\Delta Q
\end{bmatrix}
$$

其中:

  • J 是雅各比矩阵。
  • $\Delta \theta$ 是相角修正量。
  • $\Delta V$ 是电压幅值修正量。
  • $\Delta P$ 和 $\Delta Q$ 是功率误差。

Matlab实现

1
2
3
4
5
6
% 解线性方程组 J * dx = mismatch
dx = J \ mismatch; % 反斜杠运算符(LU分解)

% 分解修正量
d_theta = dx(1:n_non_slack); % 相角修正量(非平衡节点)
d_V = dx(n_non_slack+1:end); % 电压修正量(PQ节点)
  • mismatch 是功率误差向量,维度为 $\Delta P$ 和 $\Delta Q$ 的拼接。
    • MATLAB的 \ 运算符会自动选择高效的数值方法(如LU分解)求解线性方程组。

计算功率误差向量

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
function [deltaP, deltaQ] = build_mismatch(Node, non_slack, pq_nodes, P, Q)
% 提取发电机出力和负荷功率(标幺值)
P_gen = Node(:, 8); % 第8列:发电机有功出力(标幺值)
P_load = Node(:, 6); % 第6列:有功负荷(标幺值)
Q_gen = Node(:, 9); % 第9列:发电机无功出力(标幺值)
Q_load = Node(:, 7); % 第7列:无功负荷(标幺值)

% 初始化误差向量(长度与雅可比矩阵的方程数一致)
deltaP = zeros(length(non_slack), 1); % ΔP(非平衡节点)
deltaQ = zeros(length(pq_nodes), 1); % ΔQ(PQ节点)

% 计算ΔP(非平衡节点PV和PQ)
for i = 1:length(non_slack)
node = non_slack(i);
deltaP(i) = (P_gen(node) - P_load(node)) - P(node); % ΔP = P_sch - P
end

% 计算ΔQ(PQ节点)
for i = 1:length(pq_nodes)
node = pq_nodes(i);
deltaQ(i) = (Q_gen(node) - Q_load(node)) - Q(node); % ΔQ = Q_sch - Q
end
end

4.2 更新变量

理论公式:
$$
\theta^{(k+1)}=\theta^{k}+\Delta \theta
$$

$$
V^{(k+1)}=V^{k}+\Delta V \quad \text{仅PQ节点}
$$

  • PQ节点:电压幅值 $V$ 设为 $1.0 p.u.$,更新相角和幅值。
  • PV节点:电压幅值 $V$ 设为设定值,仅更新相角。
  • 平衡节点:电压幅值和相角固定,不参与更新。

Matlab实现

1
2
3
4
5
6
7
8
% 更新相角(非平衡节点PQ和PV)
theta(non_slack) = theta(non_slack) + d_theta;

% 更新电压幅值(PQ)
V(pq_nodes) = V(pq_nodes) + d_V;

% PV节点电压重置为设定值
V(pv_nodes) = Node(pv_nodes, 4); % 第4列为设定电压

4.3 收敛判断

理论条件:
若所有功率误差的绝对值小于预设阈值(例如预设阈值为 $\epsilon=10^{-5}$ ),则收敛。
$$
\max (|\Delta P|,|\Delta Q|)<\epsilon
$$

不收敛,则返回第三步。

Matlab实现

1
2
3
4
5
6
7
8
% 计算最大功率误差
max_error = max(abs(mismatch));

% 判断收敛
if max_error < tolerance
converged = true;
break; % 退出迭代循环
end

完整的迭代循环

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
% ---------------------- 牛顿-拉夫森迭代 ----------------------
max_iter = 20; % 最大迭代次数
tolerance = 1e-5; % 收敛阈值
converged = false; % 收敛标志
iter = 0; % 当前迭代次数

% 关键参数
n = size(Node, 1); % 节点总数
n_non_slack = length(non_slack); % 非平衡节点数
n_pq = length(pq_nodes); % PQ节点数

while ~converged && iter < max_iter
% 1. 计算功率误差
[P, Q] = calculate_power(V, theta, G, B, Node, n); % 包含并联导纳修正的功率计算
[deltaP, deltaQ] = build_mismatch(Node, non_slack, pq_nodes, P, Q);
mismatch = [deltaP; deltaQ];

% 2. 收敛判断
max_error = max(abs(mismatch));
fprintf('迭代 %d,最大误差:%e\n', iter, max_error);

if max_error < tolerance
converged = true;
fprintf('收敛于 %d 次迭代,最大误差:%e\n', iter, max_error);
break;
end

% 3. 构建雅可比矩阵
J = build_jacobian(V, theta, G, B, Node, non_slack, pq_nodes, P, Q);

% 4. 解修正方程
if rcond(J) < 1e-12
error('雅可比矩阵接近奇异,迭代终止');
end
dx = J \ mismatch;
d_theta = dx(1:n_non_slack);
d_V = dx(n_non_slack+1:end);

% 5. 更新变量
theta(non_slack) = theta(non_slack) + d_theta;
V(pq_nodes) = V(pq_nodes) + d_V;
V(pv_nodes) = Node(pv_nodes, 11); % PV电压重置(期望电压列)

iter = iter + 1;
end
% ---------------------- 输出结果 ----------------------
if ~converged
fprintf('未收敛,最大误差:%e\n', max_error);
end

注释

  • ~converged:~ 是逻辑非运算符,表示取反。

5.更新节点数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
% 更新节点数据
Node(:,4) = V;
Node(:,5) = rad2deg(theta);

% 输出关键结果
fprintf('\n======= 收敛结果 =======\n');
fprintf('平衡节点(节点 %d)功率:P = %.2f MW, Q = %.2f MVar\n', ...
slack_node, P(slack_node)*S_base, Q(slack_node)*S_base);

% 输出 PQ 节点详细结果
pq_results = [pq_nodes, V(pq_nodes), rad2deg(theta(pq_nodes)), P(pq_nodes)*S_base, Q(pq_nodes)*S_base];
disp('PQ 节点结果:');
disp(array2table(pq_results, 'VariableNames', {'节点号', '电压(pu)', '相角(度)', 'P注入(MW)', 'Q注入(MVar)'}));

% 保存更新后的数据
save('power_flow_results.mat', 'Node', 'Branch', 'P', 'Q');

输出结果

6. 结果评价(检验)

收敛只是验证算法在数值上达到了某种收敛标准,但这并不一定意味着计算结果在物理和工程上是正确的。

PQ 节点功率注入接近零:

对于 PQ 节点来说,它们的指定功率通常为“发电 - 负荷”。
如果一个 PQ 节点没有装机发电机(也就是说只有负荷),那么它的指定功率就是 发电 − 负荷

  • 在潮流计算中,计算出来的功率注入 $𝑃$ 应该与这个指定值一致,也就是计算得到的 $𝑃$ 应该接近 − 负荷
    • 当把“指定功率减去计算功率”的不平衡量 $\Delta P$ 计算出来时,它会接近零。
    • 这表明在该节点,实际计算出来的功率注入与负荷完全匹配,没有多余或不足的功率误差。

平衡节点吸收剩余功率:

平衡节点(Slack 节点)的作用是为整个系统提供一个参考,其电压和相角通常被固定,且它承担系统中所有未被其他节点平衡的功率。

  • 所有 PV 和 PQ 节点的功率注入总和加上平衡节点的功率注入应该满足功率平衡(即总发电等于总负荷加上线路损耗)
  • 如果其他节点已经严格平衡(即它们的计算功率与指定功率差值很小),那么系统的总功率不平衡主要体现在平衡节点上。平衡节点的功率计算值就会等于“剩余”未平衡的那部分功率,从而保证整个系统的功率平衡。

具体分析

在潮流计算中,每个节点的有功注入定义为
$$
P_i = P_{\text{gen},i} - P_{\text{load},i},
$$

其中 $P_{\text{gen},i}$表示节点 (i) 的发电机出力,有功负荷 $P_{\text{load},i}$ 通常为正值,因此对于仅负荷的 PQ 节点,指定的功率为
$$
P_{\text{spec},i} = - P_{\text{load},i}.
$$

对于所有非平衡节点(即所有 PV 和 PQ 节点),它们的总有功注入为
$$
P_{\text{total, non-slack}} = \sum_{i \in \text{PV}} \left(P_{\text{gen},i} - P_{\text{load},i}\right) + \sum_{i \in \text{PQ}} \left(P_{\text{gen},i} - P_{\text{load},i}\right).
$$
本例的数据中,节点类型分别为:

  • PV 节点:节点 1、2、3
  • PQ 节点:节点 4、5、6、7、8、9、10
  • Slack 节点:节点 11

1. PV 节点

根据数据:

节点 $P_{\text{gen}}$ (MW) $P_{\text{load}}$ (MW)
1 160 0
2 160 0
3 100 0

因此,

$$
P_{\text{spec},1} = 160,\quad P_{\text{spec},2} = 160,\quad P_{\text{spec},3} = 100.
$$

PV 节点总和为

$$
\sum_{i\in \text{PV}} P_{\text{spec},i} = 160 + 160 + 100 = 420 , \text{MW}.
$$

同理,
$$
\sum_{i\in \text{PV}} Q_{\text{spec},i} = 30 + 50 + 50 = 130 , \text{MW}.
$$

2. PQ 节点

对于 PQ 节点(无发电机出力),根据数据:

节点 $P_{\text{gen}}$ (MW) $P_{\text{load}}$ (MW)
4 0 0
5 0 200
6 0 230
7 0 0
8 0 200
9 0 0
10 0 0

所以,

$$
P_{\text{spec},4} = 0,\quad P_{\text{spec},5} = -200,\
P_{\text{spec},6} = -230,\quad P_{\text{spec},7} = 0,\quad\
P_{\text{spec},8} = -200,\quad P_{\text{spec},9} = 0,\
P_{\text{spec},10} = 0.
$$

PQ 节点总和为

$$
\sum_{i\in \text{PQ}} P_{\text{spec},i} = -200 -230 -200 = -630 , \text{MW}.
$$
同理,
$$
\sum_{i\in \text{PQ}} Q_{\text{spec},i} = -80 -77 -77 = -227 , \text{MW}.
$$

3. 非平衡节点总和及 Slack 节点补偿

将 PV 和 PQ 节点的总和相加,

$$
P_{\text{total, non-slack}} = 420 + (-630) = -210 , \text{MW}.
$$
$$
Q_{\text{total, non-slack}} = 130 + (-227) = -97 , \text{MW}.
$$
这意味着所有非平衡节点(PV+PQ)整体需要消耗 210 MW 的有功功率和-97 MW 的无功功率。

为了实现全系统功率平衡,总功率应满足

$$
\sum_{i=1}^{N} P_i = 0.
$$

$$
\sum_{i=1}^{N} Q_i = 0.
$$

因此,Slack 节点必须补偿这一缺口,提供约

$$
P_{\text{slack}} \approx -\left(P_{\text{total, non-slack}}\right) \approx 210 , \text{MW}.
$$

$$
Q_{\text{slack}} \approx -\left(Q_{\text{total, non-slack}}\right) \approx -97 , \text{MW}.
$$
计算得到的Slack 节点显示:

$$ P = 228.01 MW $$
$$ P = 109.76 MW $$

这可能由于线路损耗或数值误差导致略有差异,但整体上符合系统平衡的要求。

markdown 表格居中

参考博客

现在.md文件的开头插入:

1
2
3
4
5
6
7
8
9
<style>
.center
{
width: auto;
display: table;
margin-left: auto;
margin-right: auto;
}
</style>

然后在需要居中的表格:

1
2
3
<div class="center">
/*Table*/
</div>

牛顿-拉夫森法潮流计算
http://zoechen04616.github.io/2025/03/23/牛顿-拉夫森法潮流计算/
作者
Yunru Chen
发布于
2025年3月23日
许可协议