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 下图中\emph{(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。
写博不易,敬请支持:
如果阅读本文于您有所获,敬请点赞、评论、收藏,谢谢大家的支持!