甲 乙 丙 丁 某食品
蛋白质(%) 20 16 10 15 15
脂肪(%) 3 8 2 5 5
碳水化合物(%) 10 25 20 5 12
第10讲 线性方程组
作者:欧新宇(Xinyu OU)
本章要点
1. 线性方程概述
2. 线性方程组解的几何意义 3. 高斯消元法与行阶梯方程组 4. 矩阵的初等变换
5. 线性方程组应用实例(Python)
1. 线性方程组概述
【例5.1】食品配方的应用
某食品厂收到某种食品的订单,要求这种食品由甲、乙、丙、丁四种原料做成,且该食品中含蛋白质、
脂肪和碳水化合物的比例分别为15%、5%和12%。而甲、乙、丙、丁原料中含蛋白质、脂肪和碳水化 合物的百分比由下表给出。那么,如何用这四种原料配置出满足要求的食品呢?
解出上述方程组的解,即可获得四种原料的配比。
线性代数的重要任务之一——解方程
【定义】 若线性方程组无解,则称该方程组是不相容的;如果线性方程组至少存在一个解,则称该方程 是相容的。
2. 线性方程组解的几何意义
2.1 适定二元线性方程组的求解
(a) 有唯一解的方程
对于该等式,可以由下而上地回代解出 ,这是解线性方程组的规范方法。
(b) 无解的方程
该等式为矛盾方程,无解。
(c) 有无穷解的方程
该等式有无穷解。
2.2 超定二元方程组的近似解
三个方程,只有两个变量。它们所对应的三根直线并不共点,即方程组不相容,称为超定方程组。它没 有精确解,但有近似解——最小二乘解。
2.3 三元方程组的求解
1. 从第2个方程中减去第1个方程的2倍,得到 x 系数为零的新的第2个方程,再从第3个方程中减去第 1个方程的-5倍,得到 x 系数为零的新的第3个方程。
2. 再将第2个方程乘7/5与第3个方程相加,在第3个方程中消去 y。于是形成了阶梯形的结构。可以由 下而上地回代解出z, y, x,这是解线性方程组的规范方法。
这三个方程在笛卡尔坐标系中的图形是三个平面,方程组的解就是它们的交点坐标。
若将第三个方程改一下,消元后剩了两个方程,交点就成了交线,说明有无数个解,构成了一根直线。
与二元方程类似,三元方程也存在如下的解空间:共线、无解、两两共线。
对于更多元的线性方程组,不可能想象出其空间的几何图形,但关于欠定、适定和不相容方程(超定)
的基本概念是一脉相承的,它们的解的特性也都可以推广到高维空间。
3. 高斯消元法与行阶梯方程组
3.1 高斯消元法
将求解方法推广到高阶系统,需要借助于矩阵,并用计算机进行求解,这是线性代数与初等代数的区 别。设 为方程的个数, 为未知数的个数,则 元线性方程组可以表示为:
线性方程组中解的全体称为方程组的解集(solution set)。解方程组就是求其全部解,即解集。一般情况 下,变量的个数 与方程的个数 不一定相等。
适定方程组 (m=n):存在着唯一的一组解;
欠定方程组 (m<n):其解存在,但不唯一;
超定方程组 (m>n):不存在精确解,可以求出其近似解。
【定义】 若两个含有相同变量的方程组具有相同的解集,则称它们是等价的,这两个方程被称为同解方 程组。
考虑以下两个方程组:
( ) ( )
不难得到它们的解都是(-2, 3, 2),因此这两个方程称为同解方程组。
【定义】消元法: 通过消元变换把方程组化为容易求解的阶梯形结构的同解方程组。
【例5.2】 利用消元法求解方程组
求解方程组 (I)
解:对(I)式进行消元变化可以得到(II), (III)式。
求行最简形
(II)
(III)
1. 将(I)式中的第一个方程分别乘以-3/3及-2/3,加到第二、三方程上,可以消去后两个方程中的变量 ;
2. 将(II)式中的第二个方程乘-2/3,加到第三个方程中,消去其中的 ,得到第(III)个方程组;
3. 第(III)个方程组称为行阶梯形方程组。这样的阶梯形方程组可以用回代法方便地逐个求出它的解。
回代过程如下:
(IV)
(V)
(VI)
1. 由最后一个方程解出 2. 代入第二个方程,解得:
3. 再将 代入第一个方程,得到: 。
最后的行阶梯形方程组(VI)只保留了系数均为1的对角项。得到它就等于求出了方程组的解。
3.2 行阶梯矩阵
【定义】 若一个矩阵满足
(1)每一个非零行中的第一个非零元为1;
(2)第k行的元不全为零时,第k+1行首变量之前零的个数多于第k行首变量之前零的个数;
(3)所有元素均为零的行必在不全为零的行之后,
则称其为行阶梯形矩阵。
【例5.3】 下列矩阵为行阶梯形矩阵
【例5.4】 下列矩阵不是行阶梯形矩阵
3.3 消元法的三种同解变换
在消元过程中,主要对原方程组进行了三种变换: 1. 互换两个方程的位置;称为位置变换。 2. 用一个非零数 k 乘某个方程;称为数乘变换。
3. 把一个方程的 k 倍加到另一个方程上。称为消元变换。
这三种变换称为线性方程组的同解变换。因为对方程组而言,这些变换不会改变方程组的解。 消元法规则刻板,容易程序化,其计算量又是最少的,所以可以利用计算机程序实现。消元法是一 切线性方程组求解的基础。
4. 矩阵的初等变换
重新审视【例5.2】 可以发现,从方程组(I)变换到方程组(VI)的全过程中,方程组中的变量 并没有 参与任何运算,参与运算的只是方程组的系数和常数。于是可省略变量,只提取方程组等式左端的系数 和右端常数,分别写成如下系数矩阵 和常数向量 。
其中,矩阵 的行号表示方程的序号,列号表示变量 的序号。由矩阵 很容易恢复出方程组原型。所 以,可以通过这两个矩阵来研究线性方程组。学习线性代数的主要目标就是,要学会利用矩阵来描述系 统,并用矩阵软件工具去解决各种问题
4.1 基于增广矩阵的方程组
【定义】 由线性方程组所有系数所构成的矩阵,称为线性方程组的系数矩阵。系数矩阵为 阶方阵的方 程组也称为 阶方程组。
在 【例5.2】 中, 是三阶线性方程组的系数矩阵。把 并排起来组成的矩阵 ,称为方程组的增广 矩阵,知道了 也就知道了线性方程组的全部参数。所有针对方程组所做的消元变换,都可以表示为对 系数增广矩阵的行变换。
4.2 矩阵的初等行变换
【定义】 下面三种变换称为矩阵的初等行变换:以下的 r表示行(row) 1. 交换两行的位置(交换第 行,记作 );
2. 以非零数 乘某行(以k乘第i行,记作 );
3. 把某一行的 倍加到另一行上(把第 行的 倍加到第 行上,记作 )
矩阵的这三种初等行变换就对应于方程组的三种初等变换(位置、数乘和消元)。它们都是可逆的,且其 逆变换是同一类型的初等变换,由此可知,初等行变换是同解变换。
如果矩阵 经有限次初等行变换变成矩阵 ,就称矩阵 与矩阵 等价。
方程消元等价于行变换 线性方程组和它的增广矩阵是一一对应的,对线性方程组进行初等行变换就是对 其增广矩阵进行初等行变换。于是解方程组的过程可用矩阵的初等行变换来一一对照。
前向消元过程
系数矩阵
对最后一个矩阵按照消元回代的思想继续进行初等行变换,最终可以获得一个对角矩阵;之后再将各行 除以对角元素,最终可以获得一个单位矩阵,此时最右一列就是方程组的解。
4.3 行最简形矩阵
事实上,在进行消元变化的时候,如果给出的原始矩阵不是满秩的方阵,则所获得的矩阵将不再是一个 单位矩阵,而是行最简形矩阵。这意味着对于系数矩阵为非适定矩阵或奇异矩阵的方式组来说,方程组 将无法获得唯一解。
【定义】若一个矩阵满足
(1)矩阵式行阶梯型的;
(2)每一行的第一个非零元是该列唯一的非零元,
则称该矩阵为行最简形矩阵(reduced row echelon form)。
下列矩阵为行最简形:
5. 线性方程组应用实例(Python)
Numpy.linalg库
numpy.linalg是Numpy库中提供的线性代数库,主要包括矩阵的点积、内积、矩阵积、行列式、逆矩阵 和求解矩阵方程的函数。其中np.linalg.solve(A,b)可以实现线性方程的求解。但对于非适定方程或系数矩 阵为奇异矩阵时,该库无法进行运算。
那如何解决呢?使用符号矩阵进行运算。
1. 将方程式转换为系数增广矩阵
2. 使用Sympy库将增广矩阵化简为行最简形 3. 根据输出结果获得未知数的解空间
Sympy 库
SymPy是一个符号计算的Python库。它的目标是成为一个全功能的计算机代数系统,同时保持代码简 洁、易于理解和扩展。它完全由Python写成,不依赖于外部库。
此处,我们使用sympy库中最基本的运算函数:
解线性方程组(求阶梯矩阵):Sympy.Matrix.rref()
求矩阵的秩: Sympy.Matrix.rank()
【计算题】求解线性方程组
【例5.3】 求下列方程组的解
不难发现,该方程组是一个适定方程,因此我们尝试使用两种方法进行求解。
(1) numpy.linalg.solve() (2) sympy.matrix.rref()
import numpy as np import sympy
A = np.array([[2,-2,2,6],[2,-1,2,4],[3,-1,4,4],[1,1,-1,3]]) b = np.array([[-16],[-10],[-11],[-12]])
out1= np.linalg.solve(A,b) print('out1=\n{}'.format(out1))
# 将系数矩阵合并为增广矩阵,并转换为sympy.Matrix格式 M = sympy.Matrix(np.concatenate((A,b), axis=1)) out2 = M.rref()
print('out2=\n{}'.format(out2))
【结果分析】
numpy.linalg.solve()方法可以直接输出方程组的解空间矩阵,但该方法对于超定矩阵和欠定矩阵 会给出维度不匹配的信息;
sympy.matrix.rref()方法利用矩阵变换的方法,将系数增广矩阵化简为行最简形矩阵,此时最右 边的一列就是解空间矩阵。
【计算题】求解线性方程组
【例5.4】 设方程组的系数矩阵𝑨,𝒃如下,判断它的解的性质及𝑨的秩。
out1=
[[11.]
[-8.]
[-6.]
[-7.]]
out2=
(Matrix([
[1, 0, 0, 0, 11], [0, 1, 0, 0, -8], [0, 0, 1, 0, -6],
[0, 0, 0, 1, -7]]), (0, 1, 2, 3))
import numpy as np import sympy
A = np.array([[-2,-2,2,-2,2], [1,-5,1,-1,-3], [-1,2,-5,5,6], [-1,2,1,-1,0]]) b = np.array([[-2],[-1],[2],[0]])
# 将系数矩阵合并为增广矩阵,并转换为sympy.Matrix格式 M = sympy.Matrix(np.concatenate((A,b), axis=1))
print('rank ={}'.format(M.rank())) print('out = {}'.format(M.rref())) display(M.rref()[0])
rank =4
out = (Matrix([
[1, 0, 0, 0, 0, -2/9], [0, 1, 0, 0, 0, 2/9], [0, 0, 1, -1, 0, -2/3],
[0, 0, 0, 0, 1, -1/3]]), (0, 1, 2, 4))
0 1 2 3
3 0 -1 6
【结果分析】
在本例中,方程组是一个欠定矩阵,因此无法使用 numpy.linalg.solve() 方法进行求解。因此,在后续 的例题中,我们都将使用基于行最简形矩阵化简的方法rref()完成。
函数 sympy.matrix.rref() 方法的输出是一个2维元组,其中:
第一项为,化简后的行最简形矩阵;
第二项为,行最简形中“1”所在列的序号。此例中,该项的的长度为4,说明原矩阵4个主元和主元 行,即矩阵的秩 。该结论也可以通过M.rank()方法进行验证。
【应用题】计算插值多项式
【例5.5】 求插值多项式 的各系数,使它能通过下表中各点。并求多项式 在 时的值。
解:根据题目列出要求,列出方程组:
x=A\b
【结果分析】
以上代码给出了插值方程的解,将其带入多项式可以得到完整的插值多项式:
。
当 时,
import sympy
A = sympy.Matrix([[1,0,0,0,3], [1,1,1,1,0], [1,2,4,8,-1], [1,3,9,27,6]])
out = A.rref()
print('out = {}'.format(out[0]))
t = 1.5
res = out[0][0,4] + out[0][1,4]*1.5 + out[0][2,4]*1.5**2 + out[0][3,4]*1.5**3 print('p = {:.3f}'.format(res))
out = Matrix([[1, 0, 0, 0, 3], [0, 1, 0, 0, -2], [0, 0, 1, 0, -2], [0, 0, 0, 1, 1]])
p = -1.125
。 插值的图例如下所示:
【应用题】平板稳态温度的计算
【例5.6】 如图所示,假设存在一个密度均匀的金属元器件,在其四周我们获得了8个点的瞬时温度。已 知元器件各点的温度等于其四周温度
的平均值,求abcd四个点的温度。
解:按要求得到abcd四点的温度程式,整理以后可以得到矩阵 :
【结果分析】
从程序输出结果可以得到abcd四个点的温度分别是:20度, 55/2度, 45/2度, 30度。
【应用题】交通流量分析 import sympy
A = sympy.Matrix([[4,-1,-1,0,30], [-1,4,0,-1,60], [-1,0,4,-1,40], [0,-1,-1,4,70]]) print('out = {}'.format(A.rref()))
out = (Matrix([
[1, 0, 0, 0, 20], [0, 1, 0, 0, 55/2], [0, 0, 1, 0, 45/2],
[0, 0, 0, 1, 30]]), (0, 1, 2, 3))
【例5.7】如图所示,某城市市区的交叉路口由两条单向车道组成。图中给出了在交通高峰时段每小时进 入和离开路口的车辆数。计算在四个交叉路口间车辆的数量。
解: 在每一个路口,必然存在进入的车辆与离开的车辆数相等,于是有:
节点A:
节点B:
节点C:
节点D:
【结果分析】
从结果不难看出,该方程是一个欠定方程组,其秩=3<未知数个数4。即得不出唯一解。如果设 为自由 变量,并将它移到增广项位置,就可以求出解。其物理意义是,给定任意 ,均可得到每个路口的交通 流量。例如,设 ,则:
$X=\begin{bmatrix} 330 \ 170 \ 210 \ 0 \end{bmatrix}
\begin{bmatrix} 1 \ 1 \ 1 \ 0 \end{bmatrix} x_4
= \begin{bmatrix} 330 \ 170 \ 210 \ 0 \end{bmatrix} + 150
= \begin{bmatrix} 480 \ 220 \ 360 \ 150 \end{bmatrix}
=> \left{\begin{aligned} x_1=480 \ x_2=220 \ x_3=360 \ x_4=150 \end{aligned} \right. $
【应用题】化学方程的配平 import sympy
A = sympy.Matrix([[1,-1,0,0,160], [0,1,-1,0,-40], [0,0,1,-1,210], [-1,0,0,1,-330]]) print('out = {}'.format(A.rref()))
out = (Matrix([
[1, 0, 0, -1, 330], [0, 1, 0, -1, 170], [0, 0, 1, -1, 210],
[0, 0, 0, 0, 0]]), (0, 1, 2))
【例5.8】 给定化学方程式,试将其进行配平。即通过设置系数,实现每个原子左右数量都相等。
为了配平化学方程式,可以设每一种元素为一个未知数,而分子中原子的个数为未知数的系数矩阵,则 我们可以得到以下等式:
四种物质的成分列向量:
待配平方程:
移项后得到系数矩阵和增广矩阵:
【结果分析】
从结果不难看出,该方程是一个欠定方程组,其秩=3<未知数个数4。即得不出唯一解。为了实现化学方 程式的配平,我们可以设 (通常取分母的最小公倍数),则方程的解可以变为唯一解。
取
由此,可以得到配平后的方程:
【应用题】电路图分析
【例5.9】 在一个电路中,可根据电阻大小和电源电压来确定电路中各分支的电流。如图所示,根据基尔 霍夫定律,
1. 任一节点上流出电流的量等于流入电流的量 2. 任一回路上电压的代数和等于各元件压降的代数和 3. 压降 满足欧姆定律
试求三条支路上的电流 。 import sympy
A = sympy.Matrix([[3,0,-1,0,0], [8,0,0,-2,0], [0,2,-2,-1,0]]) print('out = {}'.format(A.rref()))
out = (Matrix([
[1, 0, 0, -1/4, 0], [0, 1, 0, -5/4, 0],
[0, 0, 1, -3/4, 0]]), (0, 1, 2))
根据以上定律可以得到:
节 点 : 节 点 : 上 层 回 路 : 下 层 回 路 :
增 广 矩 阵
【结果分析】
从结果可以得出方程组的解集: ,即三个支路的电流:
import sympy
A = sympy.Matrix([[1,-1,1,0], [-1,1,-1,0], [4,2,0,8], [0,2,5,9]]) print('out = {}'.format(A.rref()))
out = (Matrix([
[1, 0, 0, 1], [0, 1, 0, 2], [0, 0, 1, 1],
[0, 0, 0, 0]]), (0, 1, 2))