numpy的linalg模块中solve函数解可逆系数矩阵的线性方程组。该函数的调用接口为
solve(A, b)
\text{solve(A, b)}
solve(A, b)
参数A表示系数矩阵
A
\boldsymbol{A}
A,b表示常数矩阵
b
\boldsymbol{b}
b。若A表示的系数矩阵可逆,返回方程组
A
x
=
b
\boldsymbol{Ax}=\boldsymbol{b}
Ax=b的解,否则报错。
例1 下图中(a)表示一电路网络,每条线上标出的数值是电阻,E点接地。向X,Y,Z和U四点通入电流,强度均为
100
100
100安培。求X,Y,Z,U四点处的电位。
解:设定进入X,Y,Z,U四点流向电路的电路为
I
1
I_1
I1,
I
2
I_2
I2,
I
3
I_3
I3,
I
4
I_4
I4,
I
5
I_5
I5,
I
6
I_6
I6,
I
7
I_7
I7,
I
8
I_8
I8(见图中(b))。运用基尔霍夫定律知,
{
I
1
+
I
2
−
I
3
=
100
I
3
+
I
4
−
I
5
=
100
I
5
+
I
6
−
I
7
=
100
I
7
+
I
8
−
I
1
=
100
.
\begin{cases} I_1+I_2-I_3=100\\I_3+I_4-I_5=100\\I_5+I_6-I_7=100\\I_7+I_8-I_1=100 \end{cases}.
⎩
⎨
⎧I1+I2−I3=100I3+I4−I5=100I5+I6−I7=100I7+I8−I1=100.
设X,Y,Z,U四点处的电位分别为
V
X
V_X
VX,
V
Y
V_Y
VY,
V
Z
V_Z
VZ,
V
U
V_U
VU。由欧姆定律知
I
=
V
R
I=\frac{V}{R}
I=RV,其中I,R,V分别表示电流,电阻,电位。于是,
I
1
=
V
X
−
V
U
I_1=V_X-V_U
I1=VX−VU,
I
2
=
6
V
X
I_2=6V_X
I2=6VX,
I
3
=
2
V
Y
−
2
V
X
I_3=2V_Y-2V_X
I3=2VY−2VX,
I
4
=
7
V
Y
I_4=7V_Y
I4=7VY
I
5
=
3
V
Z
−
3
V
Y
I_5=3V_Z-3V_Y
I5=3VZ−3VY,
I
6
=
8
V
Z
I_6=8V_Z
I6=8VZ,
I
7
=
4
V
U
−
4
V
Z
I_7=4V_U-4V_Z
I7=4VU−4VZ,
I
8
=
5
V
U
I_8=5V_U
I8=5VU
代入电流方程组得
{
9
V
X
−
2
V
Y
−
V
U
=
100
−
2
V
X
+
12
V
Y
−
3
V
Z
=
100
−
3
V
Y
+
15
V
Z
−
4
V
U
=
100
−
V
X
−
4
V
Z
+
10
V
U
=
100
.
\begin{cases} \quad9V_X-2V_Y\quad\quad\quad-V_U=100\\-2V_X+12V_Y-3V_Z\quad\quad\quad=100\\\quad\quad\quad-3V_Y+15V_Z-4V_U=100\\-V_X\quad\quad\quad\quad-4V_Z+10V_U=100 \end{cases}.
⎩
⎨
⎧9VX−2VY−VU=100−2VX+12VY−3VZ=100−3VY+15VZ−4VU=100−VX−4VZ+10VU=100.
该方程组的系数矩阵为
A
=
(
9
−
2
0
−
1
−
2
12
−
3
0
0
−
3
15
−
4
−
1
0
−
4
10
)
\boldsymbol{A}=\begin{pmatrix}9&-2&0&-1\\-2&12&-3&0\\0&-3&15&-4\\-1&0&-4&10\end{pmatrix}
A=
9−20−1−212−300−315−4−10−410
,常数矩阵
b
=
(
100
100
100
100
)
\boldsymbol{b}=\begin{pmatrix}100\\100\\100\\100\end{pmatrix}
b=
100100100100
。用下列代码计算该方程组的解。
import numpy as np #导入numpy
from fractions import Fraction as F #导入Fraction
np.set_printoptions(formatter={'all':lambda x:
str(F(x).limit_denominator())})
A=np.array([[9,-2,0,-1], #系数矩阵A
[-2,12,-3,0],
[0,-3,15,-4],
[-1,0,-4,10]])
b=np.array([100,100,100,100]) #常数矩阵b
X=np.linalg.solve(A, b) #解方程
print(X.reshape(4,1)) #输出解
程序的第5~8行设置方程组的系数矩阵A,第9行设置常数矩阵b,第10行调用numpy.linalg的solve函数,传递参数A和b,计算方程组 A x = b \boldsymbol{Ax}=\boldsymbol{b} Ax=b的解X。运行程序,输出
[[210100/12907]
[188400/12907]
[183300/12907]
[223400/12907]]
即即X,Y,Z,U四点处电位
V
X
=
210100
12907
V_X=\frac{210100}{12907}
VX=12907210100,
V
Y
=
188400
12907
V_Y=\frac{188400}{12907}
VY=12907188400,
V
Z
=
183300
12907
V_Z=\frac{183300}{12907}
VZ=12907183300,
V
U
=
223400
12907
V_U=\frac{223400}{12907}
VU=12907223400。
写博不易,敬请支持:
如果阅读本文于您有所获,敬请点赞、评论、收藏,谢谢大家的支持!
代码诚可贵,原理价更高。若为AI学,读正版书好。