用Python的Numpy求解线性方程组
原文链接:http://tecdat.cn/?p=8445
在本文中,您将看到如何使用Python的Numpy库解决线性方程组。
什么是线性方程组?
维基百科将线性方程组定义为:
在数学中,线性方程组(或线性系统)是两个或多个涉及同一组变量的线性方程的集合。
解决线性方程组的最终目标是找到未知变量的值。这是带有两个未知变量的线性方程组的示例,x
并且y
:
等式1:
4x + 3y = 20-5x + 9y = 26
为了解决上述线性方程组,我们需要找到x
和y
变量的值。解决此类系统的方法有多种,例如消除变量,克莱默规则,行缩减技术和矩阵解决方案。在本文中,我们将介绍矩阵解决方案。
在矩阵解中,要求解的线性方程组以矩阵形式表示AX = B
。例如,我们可以用矩阵形式表示等式1,如下所示:
A = [[ 4 3] [-5 9]]X = [[x] [y]]B = [[20] [26]]
要查找的值x
和y
变量方程1,我们需要找到在矩阵中的值X
。为此,我们可以采用矩阵逆的点积A
和矩阵B
,如下所示:
X = inverse(A).B
用numpy求解线性方程组
要求解线性方程组,我们需要执行两个操作:矩阵求逆和矩阵点积。Python的Numpy库支持这两种操作。如果尚未安装Numpy库,则可以使用以下pip
命令:
$ pip install numpy
现在让我们看看如何使用Numpy库解决线性方程组。
使用inv()和dot()方法
首先,我们将找到A
在上一节中定义的矩阵逆。
首先让我们A
在Python中创建矩阵。要创建矩阵,array
可以使用Numpy模块的方法。矩阵可以视为列表列表,其中每个列表代表一行。
在以下脚本中,我们创建一个名为的列表m_list
,其中进一步包含两个列表:[4,3]
和[-5,9]
。这些列表是矩阵中的两行A
。要A
使用Numpy 创建矩阵,请将m_list
传递给array
方法,如下所示:
import numpy as npm_list = [[4, 3], [-5, 9]]A = np.array(m_list)
为了找到矩阵的逆,将矩阵传递给linalg.inv()
Numpy模块的方法:
inv_A = np.linalg.inv(A)print(inv_A)
下一步是找出矩阵的逆矩阵之间的点积A
和矩阵B
。重要的是要提一下,只有在矩阵的内部尺寸相等的情况下,才可能在矩阵之间获得矩阵点积,即,左矩阵的列数必须与右矩阵的行数匹配。
要使用Numpy库查找点积,请使用该linalg.dot()
函数。
B = np.array([20, 26])X = np.linalg.inv(A).dot(B)print(X)
输出:
[2. 4.]
这里,2
和4
是未知的各个值x
和y
在等式1。验证一下,如果在方程式中插入2
未知数x
并4
替换未知数,您将看到结果为20。y4x + 3y
现在,让我们解决由三个线性方程组成的系统,如下所示:
4x + 3y + 2z = 25-2x + 2y + 3z = -103x -5y + 2z = -4
可以使用Numpy库按以下方式求解以上方程式:
公式2:
print(X)
在上面的脚本中,linalg.inv()
和linalg.dot()
方法链接在一起。该变量X
包含方程式2的解,并打印如下:
[ 5. 3. -2.]
未知数x
,,y
和的值分别是5、3 z
和-2。您可以将这些值代入公式2并验证其正确性。
使用solve()方法
在前两个示例中,我们使用linalg.inv()
和linalg.dot()
方法来找到方程组的解。但是,Numpy库包含该linalg.solve()
方法,该方法可用于直接找到线性方程组的解:
print(X2)
输出:
[ 5. 3. -2.]
您可以看到输出与以前相同。
一个真实的例子
让我们看看如何使用线性方程组来解决实际问题。
假设有一个卖水果的人一天就卖出了20个芒果和10个橘子,总价为350元。第二天,他以500元的价格出售了17个芒果和22个橙子。如果这两天的水果价格都保持不变,那么一个芒果和一个橙子的价格是多少?
使用两个线性方程组可以轻松解决此问题。
假设一个芒果x
的价格为,一个橙子的价格为y
。上面的问题可以这样转换:
20x + 10y = 35017x + 22y = 500
上面的方程组的解决方案如下所示:
X = np.linalg.solve(A,B)print(X)
这是输出:
[10. 15.]
输出显示,一个芒果的价格为10元,一个橙子的价格为15元。
结论
本文介绍了如何使用Python的Numpy库解决线性方程组。您可以链式使用linalg.inv()
和linalg.dot()
方法来求解线性方程组,也可以简单地使用该solve()
方法。该solve()
方法是首选方法。
- 设置输入延时约束
- MySQL 死锁与日志二三事
- 一千个不用 Null 的理由
- TensorFlow强化学习入门(1.5)——上下文赌博机
- 以太坊·代币开发详解
- JSON Web Token - 在Web应用间安全地传递信息
- TensorFlow强化学习入门(2)——基于策略的Agents
- 用ABAP 生成二维码 QR Code
- CDS view注解解析 - @Environment.systemField
- Document flow API in SAP CRM and C4C
- Python基础知识4:文件操作
- Python基础知识6:格式化字符、颜色
- 给自定义控件(Web Control)添加事件的几种方法。前两种方法可以不实现IPostBackEventHandler
- 【开源】QuickPager ASP.NET2.0分页控件 v2.0.0.2版本。
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 每日打卡 373. 查找和最小的K对数字
- IE11出现"__doPostBack”未定义
- latex()、ploy2sym()、symsum()的妙用
- 性能最佳实践:MongoDB数据建模和内存大小调整
- 节省你生命的一个小技术No.193
- K8S 生态周报| Traefik v2.3.0-rc2 发布
- 如何从 Notion 批量导出 Markdown?
- 【LeetCode】1518. 换酒问题
- OBS推流工具使用说明
- Python多进程
- app反编译遇到360加固,傻瓜式脱壳
- Java底层-本地接口(JNI)
- 如何从最坏、平均、最好的情况分析复杂度?
- 利用Python进行MR栅格数据处理
- 利用Sql处理MR栅格数据