Logo

郎哥编程

求解线性方程组

2024-10-21 21

矩阵与线性方程组

将类似于“2x + 3y = 1”这样的等式放在一起,并找出满足所有等式的x和y的值,就构成了线性方程组。

如下面的线性方程组:

求解该线性方程组的几何意义是:

解的情况分为以下三种:

两条直线相交于一点,此时方程组有一个解。

两条直线共线,即它们完全重合,这种情况下方程组有无数解。

两条直线平行,互不相交,此时方程组无解。

若从矩阵与向量的视角审视此问题,将会开启一种全新的解题思路。

可以把上面方程组的系数、未知数、常数用矩阵的方式来表示,这样求解线性方程组的问题就转换为矩阵运算的问题。

设系数矩阵为A,未知数为向量x,常数为向量b,则得到了更一般的形式:

Ax = b

这样就转换成了我们熟悉的Ax=b矩阵的乘法形式,求解向量x。解线性方程组问题就转化为空间映射问题,已知目标空间的向量b,和描述空间映射的矩阵A,去求解位于原空间映射过来的向量x。

如果方程组有解,满足Ax=b等式成立,向量b就是矩阵A各列与向量x的线性组合,因此向量b只有在矩阵A与向量A线性组合的列空间上,才能满足方程组有界。

使用NumPy解线性方程组

在Python的NumPy库中,求解线性方程组通常使用numpy.linalg.solve函数。给定一个线性方程组Ax = b,其中A 是一个系数矩阵,b 是一个常数向量,numpy.linalg.solve可以求解出未知数向量 x。

下面是一个使用numpy.linalg.solve求解线性方程组的示例:

# 导入NumPy库
import numpy as np
# 定义一个二维数组A,作为线性方程组的系数矩阵
# 这个例子中的方程组可以表示为:
# 2x + 3y = 1
# 1x - 1y = 2
A = np.array([[2, 3], [1, -1]])
# 定义一个一维数组b,作为线性方程组的常数项向量
# 即方程组右侧的值
b = np.array([1, 2])
# 使用NumPy的线性代数模块(linalg)中的solve函数来求解线性方程组Ax = b
# 这里,x是我们要找的解向量,使得A乘以x等于b
x = np.linalg.solve(A, b)
# 打印解向量x
# 对于这个特定的方程组,解应该是x和y的值,分别对应于x数组中的元素
print("解向量x:", x)
# 输出结果将是方程组的一个解,比如x和y的值,这取决于系数矩阵A和常数项向量b的具体值

这段代码首先通过np.array创建了两个NumPy数组:一个二维数组A作为线性方程组的系数矩阵,和一个一维数组b作为方程组的常数项。然后,它使用np.linalg.solve函数来求解这个线性方程组,找到满足Ax = b的x向量,并打印出解向量x。

需要注意的是,numpy.linalg.solve函数要求系数矩阵A必须是方阵,并且是可逆的(即,矩阵的行列式不为0)。如果A不是方阵或者不可逆,这个函数将会抛出异常。对于非方阵系统,可以使用numpy.linalg.lstsq函数求解最小二乘解。

求解线性方程组应用案例

假如猪肉、牛肉、鸡蛋的价格在一周内不发生变化,记录近三周内的价格。为计算简单起见,价格都设定为整数。

 

猪肉

牛肉

鸡蛋

第一周

15

28

5

第二周

12

31

6

第三周

13

29

7

设某个家庭每周对猪肉、牛肉、鸡蛋的需求分别为4千克、3千克、2千克,求这个家庭近三周对上述三种食品的需求开支?

一般计算过程为:

第一周:15 X 4 + 28 X 3 + 5 X 2 = 154

第二周:12 X 4 + 31 X 3 + 6 X 2 = 153

第三周:13 X 4 + 29 X 3 + 7 X 2 = 153

现在把上面的数据用矩阵来表示,矩阵A表示猪肉、牛肉、鸡蛋三周的价格,矩阵B表示某个家庭每周的需求。

 

下面用线性方程组求解。

设某家庭近三周每周对猪肉、牛肉、鸡蛋的需求分别为x千克、y千克、z千克,已知近三周每周猪肉、牛肉、鸡蛋的价格和某家庭近三周每周的消费,求x、y和z。

可以列三元一次方程组:

15x + 28y + 5z = 154

12x + 31y + 6z = 153

13x + 29y + 7z = 153

可以把上面方程组的系数、未知数、常数用矩阵的方式来表示,这样就可以使用矩阵运算来求解方程组。

求解三元一次方程组的问题就变为:

已知A矩阵,已知A矩阵和B矩阵的乘积C矩阵,求B矩阵的问题。Numpy库的 linalg模块的solve()函数可以使用矩阵求解线性方程组。

例 求解线性方程组

# 导入numpy库
import numpy as np
# 程序入口
if __name__ == '__main__':
    
   # 建立3X3矩阵
   ta = np.array([[15,28,5],
                  [12,31,6],
                  [13,29,67]
                  ])
   # 建立3维行向量
   tb = np.array([154,153,153])
   # 解线性方程组
   x = np.linalg.solve(ta,tb)
   # 输出x、y、z的值
   print("x = %.2f  y = %.2f  z = %.2f" % (x[0],x[1],x[2]))

代码在线纠错(通义千问 qwen-max)

支持粘贴多个代码文件,提交后由阿里云通义千问自动分析代码漏洞、语法错误、逻辑问题并给出修改建议。
您已解锁 AI 代码纠错功能,可正常使用!

评论区

登录 后发表评论
暂无评论