秋分到了,深圳还是那么热。“秋天的第一杯奶茶”不知为何在朋友圈流传起来。

做为一只抽了三次工程硕士数学都没抽中的非酋菜鸡,不能和同龄人一起学习,只能默默自学。

废话不多说,今天先自学线性方程组的直接求解法。公式和推导相关参考书都有,这里主要关注怎么用Python实现这些数值计算方法。能力有限,如有误请反馈于我及时修改。另外,以下代码没有考虑是否达到时间复杂度最优,只是可以运行得到理想的结果。

一、线性方程组的直接求解法

1.高斯消元法

算法实现思路:

1.第一步,将增广矩阵消元形成上三角矩阵;

2.第二步,从下向上回带进行解方程。

参考《数值分析》(李庆扬等)的第145页的推导公式。对代码的解释放在了代码的注释当中。只使用Numpy工具包。

以下是实现消元成上三角矩阵的代码。

def getTriangularMatrix(matA):

'''

matA:增广矩阵;array格式,且数值类型必须为浮点数,否则可能出现失真。

该函数为输入一个增广矩阵,输出为一个消元后的上三角矩阵

'''

if matA[0,0]==0: # 第一个元素为0的情况

print('不符合要求!需要换行操作。')

else:

numRows = matA.shape[0] # 获得总行数

for row in np.arange(0,numRows-1): # 前n-1行,row代表第几行

for k in range(row+1,numRows): # 在第row行的情况下,遍历剩下的行

if matA[k,row] != 0:

#第k(k小于row)行的新值等于该行减去第row行的值乘于一个系数。这个系数存在目的就是消元

matA[k,:]=matA[k,:]-(matA[k,row]/matA[row,row])*matA[row,:]

return matA # 此时输入的矩阵也被改变

以下是回代求解的代码

# 回代求解

def Gauss_solve(matA):

numRows = matA.shape[0] # 获得总行数

X = np.zeros((numRows,1)) # 建一个n*1的0列向量,来存结果

A = matA[0:numRows,0:numRows] # 为了方便表示,取出A

b = matA[0:numRows,-1] # 为了方便表示,取出b

if A[-1,-1] != 0: # 简单判断一下

X[numRows-1,0]=b[-1]/A[-1,-1] # 这里先求最后的那个解,目前我没想到不先求这个解的代码写法

for row_ in np.arange(numRows-2,-1,-1): # 着手求其它解

if A[row_,row_] != 0: # 简单判断一下

temp = np.dot(A[row_,row_+1:numRows],X[row_+1:numRows]) # 这一步花了很多时间去想。其思想在后面的图中。

X[row_,0] = (b[row_]-np.sum(temp))/A[row_,row_] # 有了上一行代码的基础,这一行就是简单的推导公式

return X

来两个例子测试一下效果。首先,先生成两个不同的测试矩阵。

import numpy as np

test_mat1 = np.array([[2,0,6,20],[1,4,3,18],[3,2,1,10]],dtype=float)

test_mat1 = array([[ 2., 0., 6., 20.],

[ 1., 4., 3., 18.],

[ 3., 2., 1., 10.]])

test_mat2 = np.array([[2,1,0,3,16],[0,2,0,4,20],[5,0,1,2,16],[1,1,2,2,17]],dtype=float)

test_mat2 = array([[ 2., 1., 0., 3., 16.],

[ 0., 2., 0., 4., 20.],

[ 5., 0., 1., 2., 16.],

[ 1., 1., 2., 2., 17.]])

开始运行函数计算结果,代码如下:

X1 = Gauss_solve(getTriangularMatrix(test_mat1))

X1 = array([[1.],

[2.],

[3.]])

X2 = Gauss_solve(getTriangularMatrix(test_mat2))

X2 = array([[1.],

[2.],

[3.],

[4.]])

得到两组结果,你可以代入验算,结果是正确的。暂时没有再做更多算例测试。

这里再展示一个Python的scipy库中直接求解线性方程组的函数。

from scipy import linalg

A = test_mat2[0:4,0:4] # 取出第二个算例的A

b = test_mat2[0:4,-1] # 取出第二个算例的b

x = inalg.solve(A,b)

# 解得

x = array([1., 2., 3., 4.])

2.列主元消去法

夜已深,明天继续........

今日结语:

虽然我知道我花这么多时间写这些对我的发展并没有什么用,即拿不到学分,也对之后的科研没有帮助。但是写代码时进行的逻辑思考的推理验证使我快乐。我并不打算做一名程序员,因为我知道写代码当成爱好是快乐,当成工作就只能是折磨了哈哈哈。

python遍历二维秋天_只要一杯秋天的奶茶,就能学会Python数值分析(1)相关推荐

  1. python遍历二维数组_在Python中遍历二维数组?

    你需要告诉我们一些事情:dataset = datas.values 它可能是一个二维数组,因为它来自一个csv负载.但是什么形状和数据类型?甚至可能是阵列的一个样本. 这是函数中的data参数吗? ...

  2. python 构件二维数组_通过这四个构件块来升级您的javascript数组

    python 构件二维数组 Arrays in JavaScript are something special, as they leverage the prototype feature of ...

  3. python画二维图_使用python绘制二维图形示例

    我就废话不多说了,直接上代码吧! import matplotlib.pyplot as plt #也可以使用 import pylab as pl import matplotlib.font_ma ...

  4. python绘制二维图形_使用python绘制二维图形示例

    我就废话不多说了,直接上代码吧! import matplotlib.pyplot as plt #也可以使用 import pylab as pl import matplotlib.font_ma ...

  5. python遍历二维数组

    最近正好需要读取nc数据,对数据进行插值.首先需要遍历二维数据,复习一下二维数组遍历的操作,操作时要注意数组每行的长度是否是一致的. 具体实例如下所示: # 要读取的nc数据是二维数组 EVEL_0h ...

  6. 用python制作二维码_使用python制作二维码

    python-qrcode是个用来生成二维码图片的第三方模块,主要依赖的是 PIL 模块和 qrcode 库.(PIL模块只支持python2.7及以下版本,python3之后无法使用,官方推荐pyt ...

  7. python生成二维码_使用python生成二维码

    1.python-qrcode是个用来生成二维码图片的第三方模块,依赖于 PIL 模块和 qrcode 库. 首先,我们要安装三个模块,qrcode,image,PIL. pip install qr ...

  8. python制作二维码_利用Python制作二维码

    利用简单的Python代码制作二维码 友情链接:饿了么外卖大红包限时领取 一.制作工具 安装Python环境 + PyCharm编译器. 二.电脑系统 本人win10 + Python3.7.0 + ...

  9. 用python制作二维码_用python做一个可视化生成二维码的工具

    用python做一个可视化生成二维码的工具 环境 pip install gooey pip install MyQR 源代码 from gooey import GooeyParser,Gooey ...

  10. python生成二维码_用python生成二维码

    python中有一个好玩的库,不仅可以生成各种花色的二维码,还可以生成动态二维码. MyQR是一个能够生成自定义二维码的第三方库,可以根据需要生成普通二维码.带图片的艺术二维码,也可以生成动态二维码 ...

最新文章

  1. 使用CEfSharp之旅(7)CEFSharp 拦截 http 请求 websocket 内容
  2. java tcp 三次握手_用Java代码分析TCP的三次握手四次挥手过程
  3. 全球及中国食品色素行业供应前景与发展趋势研究报告2022版
  4. IIS部署时提示:InvalidOperationException:未能映射路径“/”
  5. vue模板html,VueJS模板
  6. 17 | 跳表:为什么Redis一定要用跳表来实现有序集合?
  7. WEB消息推送-comet4j
  8. 设计模式——通过简单工厂模式推出工厂方法模式
  9. Maven 无法下载依赖包的解决方法---三步dao!!!
  10. 图解Transformer(完整版)
  11. cad转dxf格式文件太大_如何将DWG DXF互转,一招教你解决难题
  12. pytorch时空数据处理4——图像转文本/字幕Image-Captionning(二)
  13. 毕业设计 - 基于JAVA的小区/园区停车管理系统(简便易上手)
  14. matlab希尔伯特变换,希尔伯特变换和傅里叶变换MATLAB仿真
  15. 安卓自动化实战项目(AutoJs)-抖音自动取关脚本
  16. 如何用计算机设置热点,Win7如何在笔记本电脑设置热点wifi?
  17. android 局域网聊天工具(可发送文字/语音)
  18. vue修饰符——.lazy
  19. 读书笔记(二十二):前端安全
  20. Android 网络检测

热门文章

  1. Little_Women6.txt
  2. QQ飞车手游设计分析
  3. spssχ2检验_医学统计中常用的χ2检验在SPSS软件中的实现途径
  4. 用AliDDNS脚本实现动态域名
  5. aliddns ipv6_linux系统下配置阿里DDNS(IPv6)
  6. 目标客户画像_怎么进行目标人群的用户画像分析?
  7. EPIVAN | 基于预训练和注意力机制的启动子增强子相互作用预测
  8. 微信小程序上传代码, Error: 分包大小超过限制,main package source size 4732KB exceed max limit 2MB
  9. 安静的秋千 ,晚上不睡早晨不起精彩回帖汇总
  10. 智慧工厂大数据可视化平台