本篇为本科课程《电力系统稳态分析》的笔记。
潮流计算的牛顿-拉夫逊方法
牛顿-拉夫逊法的原理
牛顿-拉夫逊法是求解非线性方程的最好方法之一。先从一维非线性方程式的解来说明他的意义和推导过程。
牛顿-拉夫逊法的意义和推导
设一维方程为:
f
(
x
)
=
0
f(x)=0
f(x)=0。假设其准确解为
x
(
∗
)
x^{(*)}
x(∗),而
x
(
k
)
x^{(k)}
x(k)是其近似解,他和准确解之间的差值为
Δ
x
(
k
)
\Delta x^{(k)}
Δx(k),所以有:
x
(
∗
)
=
x
(
k
)
+
Δ
x
(
k
)
x^{(*)}=x^{(k)}+\Delta x^{(k)}
x(∗)=x(k)+Δx(k)
将上式带入方程中,可得:
f
(
x
(
∗
)
)
=
f
(
x
(
k
)
+
Δ
x
(
k
)
)
=
0
f(x^{(*)})=f(x^{(k)}+\Delta x^{(k)})=0
f(x(∗))=f(x(k)+Δx(k))=0
将上式在
x
(
k
)
x^{(k)}
x(k)处进行泰勒展开,得到:
f
(
x
(
k
)
+
Δ
x
(
k
)
)
=
f
(
x
(
k
)
)
+
f
′
(
x
(
k
)
)
Δ
x
(
k
)
+
⋯
=
0
f(x^{(k)}+\Delta x^{(k)})=f(x^{(k)})+f'(x^{(k)})\Delta x^{(k)}+\cdots=0
f(x(k)+Δx(k))=f(x(k))+f′(x(k))Δx(k)+⋯=0
略去上面展开的高次项,可得到线性部分:
f
(
x
(
k
)
)
+
f
′
(
x
(
k
)
)
Δ
x
(
k
)
=
0
f(x^{(k)})+f'(x^{(k)})\Delta x^{(k)}=0
f(x(k))+f′(x(k))Δx(k)=0
这一个方程就是修正方程,利用他可以解出:
Δ
x
(
k
)
=
−
f
(
x
(
k
)
)
f
′
(
x
(
k
)
)
\Delta x^{(k)}=-\frac{f(x^{(k)})}{f'(x^{(k)})}
Δx(k)=−f′(x(k))f(x(k))
而
Δ
x
(
k
)
\Delta x^{(k)}
Δx(k)被称为修正量。这样就可以得到迭代下一回的解,它有望更加接近于准确解:
x
(
k
+
1
)
=
Δ
x
(
k
)
+
x
(
k
)
x^{(k+1)}=\Delta x^{(k)}+x^{(k)}
x(k+1)=Δx(k)+x(k)
然后通过相同的接法求出 Δ x ( k + 1 ) \Delta x^{(k+1)} Δx(k+1),得到有望更加接近于准确解的 x ( k + 2 ) x^{(k+2)} x(k+2)。
上面就是牛顿拉夫逊法的步骤,这样继续迭代下去,直到满足$|\Delta x^{(k)}|\leqslant \varepsilon $ (精度),所求出来的解就是最终结果。
上面的迭代过程可以整理成下面的迭代形式:
Δ
x
(
k
)
=
−
f
(
x
(
k
)
)
f
′
(
x
(
k
)
)
x
(
k
+
1
)
=
Δ
x
(
k
)
+
x
(
k
)
(
k
=
0
,
1
,
⋯
)
\Delta x^{(k)}=-\frac{f(x^{(k)})}{f'(x^{(k)})}\\\\ x^{(k+1)}=\Delta x^{(k)}+x^{(k)}\\\\ (k=0,1,\cdots)
Δx(k)=−f′(x(k))f(x(k))x(k+1)=Δx(k)+x(k)(k=0,1,⋯)
初值
x
(
0
)
x^{(0)}
x(0)需要用户给定。
牛拉法的特点
- 它是迭代法,是逐步逼近的方法。
- 修正方程式线性化的方程,体现在把非线性方程在 x ( k ) x^{(k)} x(k)处进行泰勒展开,并略去了高阶小量。
- 它对于初值是敏感的,如果初始值远离准确解,会导致不收敛。
多变量非线性方程的解
设n维非线性方程组为:
{
f
1
(
x
1
,
x
2
,
⋯
,
x
n
)
=
0
f
2
(
x
1
,
x
2
,
⋯
,
x
n
)
=
0
⋮
f
n
(
x
1
,
x
2
,
⋯
,
x
n
)
=
0
\begin{cases} f_1\left(x_1,x_2,\cdots,x_n\right)=0\\ f_2\left(x_1,x_2,\cdots,x_n\right)=0\\ \vdots\\ f_n\left(x_1,x_2,\cdots,x_n\right)=0 \end{cases}
⎩
⎨
⎧f1(x1,x2,⋯,xn)=0f2(x1,x2,⋯,xn)=0⋮fn(x1,x2,⋯,xn)=0
假设初始值给定为
x
1
(
0
)
,
x
2
(
0
)
,
.
.
.
,
x
n
(
0
)
x_1^{(0)},x_2^{(0)},...,x_n^{(0)}
x1(0),x2(0),...,xn(0),并令各变量的修正量为
Δ
x
1
(
0
)
,
Δ
x
2
(
0
)
,
⋯
,
Δ
x
n
(
0
)
\Delta x_1^{(0)},\Delta x_2^{(0)},\cdots,\Delta x_n^{(0)}
Δx1(0),Δx2(0),⋯,Δxn(0),那么对于上面的n个方程,在初始值附近展开成泰勒级数,并忽略修正量二次和更高次数的项,得到:
f
1
(
x
1
(
0
)
,
x
2
(
0
)
,
⋯
x
n
(
0
)
)
+
(
∂
f
1
∂
x
1
∣
0
Δ
x
1
(
0
)
+
∂
f
1
∂
x
2
∣
0
Δ
x
2
(
0
)
+
⋯
+
∂
f
1
∂
x
n
∣
0
Δ
x
n
(
0
)
)
=
0
f
2
(
x
1
(
0
)
,
x
2
(
0
)
,
⋯
x
n
(
0
)
)
+
(
∂
f
2
∂
x
1
∣
0
Δ
x
1
(
0
)
+
∂
f
2
∂
x
2
∣
0
Δ
x
2
(
0
)
+
⋯
+
∂
f
2
∂
x
n
∣
0
Δ
x
n
(
0
)
)
=
0
⋮
f
n
(
x
1
(
0
)
,
x
2
(
0
)
,
⋯
x
n
(
0
)
)
+
(
∂
f
n
∂
x
1
∣
0
Δ
x
1
(
0
)
+
∂
f
n
∂
x
2
∣
0
Δ
x
2
(
0
)
+
⋯
+
∂
f
n
∂
x
n
∣
0
Δ
x
n
(
0
)
)
=
0
f_{1}\left(x_{1}^{(0)},x_{2}^{(0)},\cdots x_{n}^{(0)}\right)+\left(\frac{\partial f_{1}}{\partial x_{1}}\bigg|_{0}\Delta x_{1}^{(0)}+\frac{\partial f_{1}}{\partial x_{2}}\bigg|_{0}\Delta x_{2}^{(0)}+\cdots+\frac{\partial f_{1}}{\partial x_{n}}\bigg|_{0}\Delta x_{n}^{(0)}\right)=0\\\\ f_{2}\left(x_{1}^{(0)},x_{2}^{(0)},\cdots x_{n}^{(0)}\right)+\left(\frac{\partial f_{2}}{\partial x_{1}}\bigg|_{0}\Delta x_{1}^{(0)}+\frac{\partial f_{2}}{\partial x_{2}}\bigg|_{0}\Delta x_{2}^{(0)}+\cdots+\frac{\partial f_{2}}{\partial x_{n}}\bigg|_{0}\Delta x_{n}^{(0)}\right)=0\\\\ \vdots\\\\ f_{n}\left(x_{1}^{(0)},x_{2}^{(0)},\cdots x_{n}^{(0)}\right)+\left(\frac{\partial f_{n}}{\partial x_{1}}\bigg|_{0}\Delta x_{1}^{(0)}+\frac{\partial f_{n}}{\partial x_{2}}\bigg|_{0}\Delta x_{2}^{(0)}+\cdots+\frac{\partial f_{n}}{\partial x_{n}}\bigg|_{0}\Delta x_{n}^{(0)}\right)=0
f1(x1(0),x2(0),⋯xn(0))+(∂x1∂f1
0Δx1(0)+∂x2∂f1
0Δx2(0)+⋯+∂xn∂f1
0Δxn(0))=0f2(x1(0),x2(0),⋯xn(0))+(∂x1∂f2
0Δx1(0)+∂x2∂f2
0Δx2(0)+⋯+∂xn∂f2
0Δxn(0))=0⋮fn(x1(0),x2(0),⋯xn(0))+(∂x1∂fn
0Δx1(0)+∂x2∂fn
0Δx2(0)+⋯+∂xn∂fn
0Δxn(0))=0
其中, ∂ f i ∂ x j ∣ 0 \frac{\partial f_{i}}{\partial x_{j}}\bigg|_{0} ∂xj∂fi 0是函数 f i ( x 1 , x 2 , ⋯ , x n ) f_i(x_1,x_2,\cdots,x_n) fi(x1,x2,⋯,xn)对自变量 x j x_j xj的偏导数在 ( x 1 ( 0 ) , x 2 ( 0 ) , ⋯ , x n ( 0 ) ) (x_1^{(0)},x_2^{(0)},\cdots,x_n^{(0)}) (x1(0),x2(0),⋯,xn(0))处的值。
将上方程组表示为矩阵形式,可得:
[
f
1
(
x
1
(
0
)
,
x
2
(
0
)
,
⋯
,
x
n
(
0
)
)
f
1
(
x
1
(
0
)
,
x
2
(
0
)
,
⋯
,
x
n
(
0
)
)
⋮
f
n
(
x
1
(
0
)
,
x
2
(
0
)
,
⋯
,
x
n
(
0
)
)
]
=
−
[
∂
f
1
∂
x
1
∣
0
∂
f
1
∂
x
2
∣
0
.
.
.
∂
f
1
∂
x
n
∣
0
∂
f
2
∂
x
1
∣
0
∂
f
2
∂
x
2
∣
0
.
.
.
∂
f
2
∂
x
n
∣
0
⋮
∂
f
n
∂
x
1
∣
0
∂
f
n
∂
x
2
∣
0
.
.
.
∂
f
n
∂
x
n
∣
0
]
[
Δ
x
1
(
0
)
Δ
x
2
(
0
)
⋮
Δ
x
n
(
0
)
]
\begin{bmatrix} f_1(x_1^{(0)},x_2^{(0)},\cdots,x_n^{(0)})\\ f_1(x_1^{(0)},x_2^{(0)},\cdots,x_n^{(0)})\\ \vdots\\ f_n(x_1^{(0)},x_2^{(0)},\cdots,x_n^{(0)}) \end{bmatrix} =- \begin{bmatrix} \frac{\partial f_1}{\partial x_1}\Big|_0\frac{\partial f_1}{\partial x_2}\Big|_0&...&\frac{\partial f_1}{\partial x_n}\Big|_0\\ \frac{\partial f_2}{\partial x_1}\Big|_0\frac{\partial f_2}{\partial x_2}\Big|_0&...&\frac{\partial f_2}{\partial x_n}\Big|_0\\ \vdots\\ \frac{\partial f_n}{\partial x_1}\Big|_0\frac{\partial f_n}{\partial x_2}\Big|_0&...&\frac{\partial f_n}{\partial x_n}\Big|_0 \end{bmatrix} \begin{bmatrix}\Delta x_1^{(0)}\\\Delta x_2^{(0)}\\\vdots\\\Delta x_n^{(0)}\end{bmatrix}
f1(x1(0),x2(0),⋯,xn(0))f1(x1(0),x2(0),⋯,xn(0))⋮fn(x1(0),x2(0),⋯,xn(0))
=−
∂x1∂f1
0∂x2∂f1
0∂x1∂f2
0∂x2∂f2
0⋮∂x1∂fn
0∂x2∂fn
0.........∂xn∂f1
0∂xn∂f2
0∂xn∂fn
0
Δx1(0)Δx2(0)⋮Δxn(0)
使用向量
x
,
x
(
0
)
,
Δ
x
(
0
)
\boldsymbol{x},\boldsymbol{x}^{(0)},\Delta\boldsymbol{x}^{(0)}
x,x(0),Δx(0)分别代表变量、变量的初值和修正量所组成的向量,则将上面的矩阵可以化为:
J
(
0
)
Δ
x
(
0
)
=
−
f
(
x
(
0
)
)
\boldsymbol{J}^{(0)}\Delta\boldsymbol{x}^{(0)}=-\boldsymbol{f}(\boldsymbol{x}^{(0)})
J(0)Δx(0)=−f(x(0))
其中, J \boldsymbol{J} J是雅可比矩阵,为向量 f ( x ) \boldsymbol{f}(\boldsymbol{x}) f(x)对变量 x \boldsymbol{x} x的一阶偏导数矩阵。
上面这个方程就是修正量的线性方程。从上式中可以解出
Δ
x
1
(
0
)
,
Δ
x
2
(
0
)
,
⋯
,
Δ
x
n
(
0
)
\Delta x_1^{(0)},\Delta x_2^{(0)},\cdots,\Delta x_n^{(0)}
Δx1(0),Δx2(0),⋯,Δxn(0),然后就可以计算出修正后的值:
{
x
1
(
1
)
=
x
1
(
0
)
+
Δ
x
1
(
0
)
x
2
(
1
)
=
x
2
(
0
)
+
Δ
x
2
(
0
)
⋮
x
n
(
1
)
=
x
n
(
0
)
+
Δ
x
n
(
0
)
\begin{cases} x_1^{(1)}=x_1^{(0)}+\Delta x_1^{(0)}\\ x_2^{(1)}=x_2^{(0)}+\Delta x_2^{(0)}\\ \vdots\\ x_n^{(1)}=x_n^{(0)}+\Delta x_n^{(0)} \end{cases}
⎩
⎨
⎧x1(1)=x1(0)+Δx1(0)x2(1)=x2(0)+Δx2(0)⋮xn(1)=xn(0)+Δxn(0)
然后将求出来的 x 1 ( 1 ) , x 2 ( 1 ) , . . . , x n ( 1 ) x_1^{(1)},x_2^{(1)},...,x_n^{(1)} x1(1),x2(1),...,xn(1)作为新的初值,带入式子重新形成并求解新的修正方程式,这样就可以得到新的修正量 Δ x 1 ( 1 ) , Δ x 2 ( 1 ) , ⋯ , Δ x n ( 1 ) \Delta x_1^{(1)},\Delta x_2^{(1)},\cdots,\Delta x_n^{(1)} Δx1(1),Δx2(1),⋯,Δxn(1),然后按照同样的步骤继续。
那么整个过程可以总结为,给定
x
(
0
)
\boldsymbol{x}^{(0)}
x(0):
J
(
k
)
Δ
x
(
k
)
=
−
f
(
x
(
k
)
)
x
(
k
+
1
)
=
x
(
k
)
+
Δ
x
(
0
)
(
k
=
0
,
1
,
⋯
)
\boldsymbol{J}^{(k)}\Delta\boldsymbol{x}^{(k)}=-\boldsymbol{f}(\boldsymbol{x}^{(k)})\\\\ \boldsymbol{x}^{(k+1)}=\boldsymbol{x}^{(k)}+\Delta\boldsymbol{x}^{(0)}\\\\ (k=0,1,\cdots)
J(k)Δx(k)=−f(x(k))x(k+1)=x(k)+Δx(0)(k=0,1,⋯)
迭代的收敛判断依据为:
∣
∣
f
(
x
(
k
)
)
∣
∣
∞
=
max
i
∣
f
i
(
x
(
k
)
)
∣
⩽
ε
||\boldsymbol{f}(\boldsymbol{x}^{(k)})||_{\infty}=\max_i|f_i(\boldsymbol{x}^{(k)})|\leqslant \varepsilon
∣∣f(x(k))∣∣∞=imax∣fi(x(k))∣⩽ε
其中 ∣ ∣ f ( x ( k ) ) ∣ ∣ ∞ ||\boldsymbol{f}(\boldsymbol{x}^{(k)})||_{\infty} ∣∣f(x(k))∣∣∞代表的是向量 f ( x ( k ) ) \boldsymbol{f}(\boldsymbol{x}^{(k)}) f(x(k))无穷范数,即 f ( x ( k ) ) \boldsymbol{f}(\boldsymbol{x}^{(k)}) f(x(k))中绝对值最大的那个元素, ε \varepsilon ε为所给定的容许误差。
牛拉法主要计算量在于修正方程的求解,下面说明一般线性方程组的基本求解方法。对于n阶线性方程组
A
x
=
b
\boldsymbol{A}\boldsymbol{x}=\boldsymbol{b}
Ax=b,通过高斯消去,并记录消去过程中的因子,可以将系数矩阵
A
\boldsymbol{A}
A分解成两个三角矩阵的乘积,即:
A
=
L
U
\boldsymbol{A}=\boldsymbol{L}\boldsymbol{U}
A=LU
L = [ 1 l 21 1 ⋮ ⋱ ⋱ l n − 1 , 1 ⋯ l n − 1 , n − 2 1 l n , 1 l n , 2 ⋯ l n , n − 1 1 ] ; U = [ u 11 u 12 ⋯ u 1 , n − 1 , u 1 , n u 22 ⋯ u 2 , n − 1 u 2 , n ⋱ ⋱ ⋮ u n − 1 , n − 1 u n − 1 , n u n n ] L=\begin{bmatrix}1&&&&&\\ l_{21}&1&&&&\\ \vdots&\ddots&\ddots&&\\ l_{n-1,1}&\cdots&l_{n-1,n-2}&1&\\ l_{n,1}&l_{n,2}&\cdots&l_{n,n-1}&1 \end{bmatrix} ;U=\begin{bmatrix} u_{11}&u_{12}&\cdots&u_{1,n-1,}&u_{1,n}\\ &u_{22}&\cdots&u_{2,n-1}&u_{2,n}\\ &&\ddots&\ddots&\vdots\\ &&&u_{n-1,n-1}&u_{n-1,n}\\ &&&&u_{nn} \end{bmatrix} L= 1l21⋮ln−1,1ln,11⋱⋯ln,2⋱ln−1,n−2⋯1ln,n−11 ;U= u11u12u22⋯⋯⋱u1,n−1,u2,n−1⋱un−1,n−1u1,nu2,n⋮un−1,nunn
其中, L \boldsymbol{L} L是单位下三角矩阵, U \boldsymbol{U} U是上三角矩阵。
该分解为Doolittle分解,其分解过程为:
u
i
j
=
a
i
j
−
∑
k
=
1
i
−
1
l
k
u
k
j
(
j
=
i
,
⋯
,
n
)
l
j
i
=
(
a
j
i
−
∑
k
=
1
i
−
1
l
j
k
u
k
i
)
/
u
i
i
(
j
=
i
+
1
,
⋯
,
n
)
(
i
=
1
,
⋯
,
n
)
u_{ij}=a_{ij}-\sum_{k=1}^{i-1}l_{k}u_{kj}\quad(j=i,\cdots,n)\\\\ l_{ji}=\left(a_{ji}-\sum_{k=1}^{i-1}l_{jk}u_{ki}\right)/u_{ii}\quad(j=i+1,\cdots,n)\\\\ (i=1,\cdots,n)
uij=aij−k=1∑i−1lkukj(j=i,⋯,n)lji=(aji−k=1∑i−1ljkuki)/uii(j=i+1,⋯,n)(i=1,⋯,n)
这个分解过程需要乘除的运算次数为 n 3 − n 3 \frac{n^3-n}{3} 3n3−n。
利用上面的分解,线性方程组的求解就变成了对两个三角方程的相继求解:
L
y
=
b
U
x
=
y
\boldsymbol{L}\boldsymbol{y}=\boldsymbol{b}\\\\ \boldsymbol{U}\boldsymbol{x}=\boldsymbol{y}
Ly=bUx=y
上面第一个式子的求解称为前代,其求解过程为:
y
1
=
b
1
y
i
=
b
i
−
∑
j
=
1
i
−
1
l
i
j
y
j
(
i
=
2
,
⋯
,
n
)
y_{1}=b_{1}\\\\ y_{i}=b_{i}-\sum_{j=1}^{i-1}l_{ij}y_{j}\\\\ (i=2,\cdots,n)
y1=b1yi=bi−j=1∑i−1lijyj(i=2,⋯,n)
上面第二个式子的求解称为回代,其求解过程为:
x
n
=
y
n
/
u
m
x
i
=
(
y
i
−
∑
j
=
i
+
1
n
u
i
j
x
j
)
/
u
i
(
i
=
n
−
1
,
⋯
,
1
)
x_{n}=y_{n}/u_{m}\\\\ x_{i}=\left(y_{i}-\sum_{j=i+1}^{n}u_{ij}x_{j}\right)/u_{i}\\\\ (i=n-1,\cdots,1)
xn=yn/umxi=(yi−j=i+1∑nuijxj)/ui(i=n−1,⋯,1)
前代和回代总共需要乘除次数为 n 2 n^2 n2。
当 A \boldsymbol{A} A为对称矩阵的时候,其三角分解师可以简化为: A = L D L T \boldsymbol{A}=\boldsymbol{L}\boldsymbol{D}\boldsymbol{L}^T A=LDLT。其中, L \boldsymbol{L} L是单位下三角矩阵, D \boldsymbol{D} D是对角矩阵, D = d i a g { d 1 , d 2 , ⋯ , d n } \boldsymbol{D}=\mathrm{diag}\{d_1,d_2,\cdots,d_n\} D=diag{d1,d2,⋯,dn}。
该分解为Choleskey分解,其分解过程为:
d
i
=
a
i
−
∑
k
=
1
i
−
1
l
k
2
d
k
l
j
i
=
(
a
j
i
−
∑
k
=
1
i
−
1
l
k
d
k
l
j
i
)
/
d
i
(
j
=
i
+
1
,
⋯
,
n
)
(
i
=
1
,
⋯
,
n
)
d_{i}=a_{i}-\sum_{k=1}^{i-1}l_{k}^{2}d_{k}\\ l_{ji}=\left(a_{ji}-\sum_{k=1}^{i-1}l_{k}d_{k}l_{ji}\right)/d_{i}\left(j=i+1,\cdots,n\right)\\\\ (i=1,\cdots,n)
di=ai−k=1∑i−1lk2dklji=(aji−k=1∑i−1lkdklji)/di(j=i+1,⋯,n)(i=1,⋯,n)
利用上面的分解,线性方程组的求解就变成了如下两个三角方程的相继求解:
L
y
=
b
L
T
x
=
D
−
1
y
\boldsymbol{L}\boldsymbol{y}=\boldsymbol{b}\\\\ \boldsymbol{L}^T\boldsymbol{x}=\boldsymbol{D}^{-1}\boldsymbol{y}
Ly=bLTx=D−1y
上面第一个式子的求解前面已经介绍过,为前代。上面第二个式子的求解过程为:
x
n
=
y
n
/
d
n
x
i
=
y
i
/
d
i
−
∑
j
=
i
+
1
n
l
j
i
x
j
(
i
=
n
−
1
,
⋯
,
1
)
x_{n}=y_{n}/d_{n}\\\\ x_{i}=y_{i}/d_{i}-\sum_{j=i+1}^{n}l_{ji}x_{j}\left(i=n-1,\cdots,1\right)
xn=yn/dnxi=yi/di−j=i+1∑nljixj(i=n−1,⋯,1)