线性代数-Python-04:线性系统+高斯消元的实现

文章目录

  • 1 线性系统
  • 2 高斯-jordon消元法的实现
      • 2.1 Matrix
      • 2.2 Vector
      • 2.3 线性系统
  • 3 行最简形式
  • 4 线性方程组的结构
  • 5 线性方程组-通用高斯消元的实现
    • 5.1 global
    • 5.2 Vector-引入is_zero
    • 5.3 LinearSystem
    • 5.4 main

1 线性系统

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2 高斯-jordon消元法的实现

2.1 Matrix

from .Vector import Vectorclass Matrix:def __init__(self, list2d):self._values = [row[:] for row in list2d]@classmethoddef zero(cls, r, c):"""返回一个r行c列的零矩阵"""return cls([[0] * c for _ in range(r)])@classmethoddef identity(cls, n):"""返回一个n行n列的单位矩阵"""m = [[0]*n for _ in range(n)]for i in range(n):m[i][i] = 1;return cls(m)def T(self):"""返回矩阵的转置矩阵"""return Matrix([[e for e in self.col_vector(i)]for i in range(self.col_num())])def __add__(self, another):"""返回两个矩阵的加法结果"""assert self.shape() == another.shape(), \"Error in adding. Shape of matrix must be same."return Matrix([[a + b for a, b in zip(self.row_vector(i), another.row_vector(i))]for i in range(self.row_num())])def __sub__(self, another):"""返回两个矩阵的减法结果"""assert self.shape() == another.shape(), \"Error in subtracting. Shape of matrix must be same."return Matrix([[a - b for a, b in zip(self.row_vector(i), another.row_vector(i))]for i in range(self.row_num())])def dot(self, another):"""返回矩阵乘法的结果"""if isinstance(another, Vector):# 矩阵和向量的乘法assert self.col_num() == len(another), \"Error in Matrix-Vector Multiplication."return Vector([self.row_vector(i).dot(another) for i in range(self.row_num())])if isinstance(another, Matrix):# 矩阵和矩阵的乘法assert self.col_num() == another.row_num(), \"Error in Matrix-Matrix Multiplication."return Matrix([[self.row_vector(i).dot(another.col_vector(j)) for j in range(another.col_num())]for i in range(self.row_num())])def __mul__(self, k):"""返回矩阵的数量乘结果: self * k"""return Matrix([[e * k for e in self.row_vector(i)]for i in range(self.row_num())])def __rmul__(self, k):"""返回矩阵的数量乘结果: k * self"""return self * kdef __truediv__(self, k):"""返回数量除法的结果矩阵:self / k"""return (1 / k) * selfdef __pos__(self):"""返回矩阵取正的结果"""return 1 * selfdef __neg__(self):"""返回矩阵取负的结果"""return -1 * selfdef row_vector(self, index):"""返回矩阵的第index个行向量"""return Vector(self._values[index])def col_vector(self, index):"""返回矩阵的第index个列向量"""return Vector([row[index] for row in self._values])def __getitem__(self, pos):"""返回矩阵pos位置的元素"""r, c = posreturn self._values[r][c]def size(self):"""返回矩阵的元素个数"""r, c = self.shape()return r * cdef row_num(self):"""返回矩阵的行数"""return self.shape()[0]__len__ = row_numdef col_num(self):"""返回矩阵的列数"""return self.shape()[1]def shape(self):"""返回矩阵的形状: (行数, 列数)"""return len(self._values), len(self._values[0])def __repr__(self):return "Matrix({})".format(self._values)__str__ = __repr__

2.2 Vector

import math
from ._globals import EPSILON
class Vector:def __init__(self, lst):"""__init__ 代表类的构造函数双下划线开头的变量 例如_values,代表类的私有成员lst是个引用,list(lst)将值复制一遍,防止用户修改值"""self._values = list(lst)def underlying_list(self):"""返回向量的底层列表"""return self._values[:]def dot(self, another):"""向量点乘,返回结果标量"""assert len(self) == len(another), \"Error in dot product. Length of vectors must be same."return sum(a * b for a, b in zip(self, another))def norm(self):"""返回向量的模"""return math.sqrt(sum(e**2 for e in self))def normalize(self):"""归一化,规范化返回向量的单位向量此处设计到了除法: def __truediv__(self, k):"""if self.norm() < EPSILON:raise ZeroDivisionError("Normalize error! norm is zero.")return Vector(self._values) / self.norm()# return 1 / self.norm() * Vector(self._values)# return Vector([e / self.norm() for e in self])def __truediv__(self, k):"""返回数量除法的结果向量:self / k"""return (1 / k) * self@classmethoddef zero(cls, dim):"""返回一个dim维的零向量@classmethod 修饰符对应的函数不需要实例化,不需要 self 参数,但第一个参数需要是表示自身类的cls参数,可以来调用类的属性,类的方法,实例化对象等。"""return cls([0] * dim)def __add__(self, another):"""向量加法,返回结果向量"""assert len(self) == len(another), \"Error in adding. Length of vectors must be same."# return Vector([a + b for a, b in zip(self._values, another._values)])return Vector([a + b for a, b in zip(self, another)])def __sub__(self, another):"""向量减法,返回结果向量"""assert len(self) == len(another), \"Error in subtracting. Length of vectors must be same."return Vector([a - b for a, b in zip(self, another)])def __mul__(self, k):"""返回数量乘法的结果向量:self * k"""return Vector([k * e for e in self])def __rmul__(self, k):"""返回数量乘法的结果向量:k * selfself本身就是一个列表"""return self * kdef __pos__(self):"""返回向量取正的结果向量"""return 1 * selfdef __neg__(self):"""返回向量取负的结果向量"""return -1 * selfdef __iter__(self):"""返回向量的迭代器"""return self._values.__iter__()def __getitem__(self, index):"""取向量的第index个元素"""return self._values[index]def __len__(self):"""返回向量长度(有多少个元素)"""return len(self._values)def __repr__(self):"""打印显示:Vector([5, 2])"""return "Vector({})".format(self._values)def __str__(self):"""打印显示:(5, 2)"""return "({})".format(", ".join(str(e) for e in self._values))

2.3 线性系统

from .Matrix import Matrix
from .Vector import Vectorclass LinearSystem:def __init__(self, A, b):assert A.row_num() == len(b), "row number of A must be equal to the length of b"self._m = A.row_num()self._n = A.col_num()assert self._m == self._n  # TODO: no this restrictionself.Ab = [Vector(A.row_vector(i).underlying_list() + [b[i]])for i in range(self._m)]def _max_row(self, index_i, index_j, n):best, ret = abs(self.Ab[index_i][index_j]), index_ifor i in range(index_i + 1, n):if abs(self.Ab[i][index_j]) > best:best, ret = abs(self.Ab[i][index_j]), ireturn retdef _forward(self):n = self._mfor i in range(n):# Ab[i][i]为主元max_row = self._max_row(i, i, n)self.Ab[i], self.Ab[max_row] = self.Ab[max_row], self.Ab[i]# 将主元归为一self.Ab[i] = self.Ab[i] / self.Ab[i][i]  # TODO: self.Ab[i][i] == 0?for j in range(i + 1, n):self.Ab[j] = self.Ab[j] - self.Ab[j][i] * self.Ab[i]def _backward(self):n = self._mfor i in range(n - 1, -1, -1):# Ab[i][i]为主元for j in range(i - 1, -1, -1):self.Ab[j] = self.Ab[j] - self.Ab[j][i] * self.Ab[i]def gauss_jordan_elimination(self):self._forward()self._backward()def fancy_print(self):for i in range(self._m):print(" ".join(str(self.Ab[i][j]) for j in range(self._n)), end=" ")print("|", self.Ab[i][-1])

3 行最简形式

在这里插入图片描述

4 线性方程组的结构

在这里插入图片描述
在这里插入图片描述

5 线性方程组-通用高斯消元的实现

5.1 global

# 包中的变量,但是对包外不可见,因此使用“_”开头
EPSILON = 1e-8def is_zero(x):return abs(x) < EPSILONdef is_equal(a, b):return abs(a - b) < EPSILON

5.2 Vector-引入is_zero

import math
from ._globals import is_zero
class Vector:def __init__(self, lst):"""__init__ 代表类的构造函数双下划线开头的变量 例如_values,代表类的私有成员lst是个引用,list(lst)将值复制一遍,防止用户修改值"""self._values = list(lst)def underlying_list(self):"""返回向量的底层列表"""return self._values[:]def dot(self, another):"""向量点乘,返回结果标量"""assert len(self) == len(another), \"Error in dot product. Length of vectors must be same."return sum(a * b for a, b in zip(self, another))def norm(self):"""返回向量的模"""return math.sqrt(sum(e**2 for e in self))def normalize(self):"""归一化,规范化返回向量的单位向量此处设计到了除法: def __truediv__(self, k):"""if is_zero(self.norm()):raise ZeroDivisionError("Normalize error! norm is zero.")return Vector(self._values) / self.norm()# return 1 / self.norm() * Vector(self._values)# return Vector([e / self.norm() for e in self])def __truediv__(self, k):"""返回数量除法的结果向量:self / k"""return (1 / k) * self@classmethoddef zero(cls, dim):"""返回一个dim维的零向量@classmethod 修饰符对应的函数不需要实例化,不需要 self 参数,但第一个参数需要是表示自身类的cls参数,可以来调用类的属性,类的方法,实例化对象等。"""return cls([0] * dim)def __add__(self, another):"""向量加法,返回结果向量"""assert len(self) == len(another), \"Error in adding. Length of vectors must be same."# return Vector([a + b for a, b in zip(self._values, another._values)])return Vector([a + b for a, b in zip(self, another)])def __sub__(self, another):"""向量减法,返回结果向量"""assert len(self) == len(another), \"Error in subtracting. Length of vectors must be same."return Vector([a - b for a, b in zip(self, another)])def __mul__(self, k):"""返回数量乘法的结果向量:self * k"""return Vector([k * e for e in self])def __rmul__(self, k):"""返回数量乘法的结果向量:k * selfself本身就是一个列表"""return self * kdef __pos__(self):"""返回向量取正的结果向量"""return 1 * selfdef __neg__(self):"""返回向量取负的结果向量"""return -1 * selfdef __iter__(self):"""返回向量的迭代器"""return self._values.__iter__()def __getitem__(self, index):"""取向量的第index个元素"""return self._values[index]def __len__(self):"""返回向量长度(有多少个元素)"""return len(self._values)def __repr__(self):"""打印显示:Vector([5, 2])"""return "Vector({})".format(self._values)def __str__(self):"""打印显示:(5, 2)"""return "({})".format(", ".join(str(e) for e in self._values))

5.3 LinearSystem

from .Matrix import Matrix
from .Vector import Vector
from ._globals import is_zeroclass LinearSystem:def __init__(self, A, b):assert A.row_num() == len(b), "row number of A must be equal to the length of b"self._m = A.row_num()self._n = A.col_num()# assert self._m == self._n  # TODO: no this restrictionself.Ab = [Vector(A.row_vector(i).underlying_list() + [b[i]])for i in range(self._m)]self.pivots = []def _max_row(self, index_i, index_j, n):best, ret = abs(self.Ab[index_i][index_j]), index_ifor i in range(index_i + 1, n):if abs(self.Ab[i][index_j]) > best:best, ret = abs(self.Ab[i][index_j]), ireturn retdef _forward(self):i, k = 0, 0while i < self._m and k < self._n:# 看Ab[i][k]位置是否可以是主元max_row = self._max_row(i, k, self._m)self.Ab[i], self.Ab[max_row] = self.Ab[max_row], self.Ab[i]if is_zero(self.Ab[i][k]):k += 1else:# 将主元归为一self.Ab[i] = self.Ab[i] / self.Ab[i][k]for j in range(i + 1, self._m):self.Ab[j] = self.Ab[j] - self.Ab[j][k] * self.Ab[i]self.pivots.append(k)i += 1def _backward(self):n = len(self.pivots)for i in range(n - 1, -1, -1):k = self.pivots[i]# Ab[i][k]为主元for j in range(i - 1, -1, -1):self.Ab[j] = self.Ab[j] - self.Ab[j][k] * self.Ab[i]def gauss_jordan_elimination(self):"""如果有解,返回True;如果没有解,返回False"""self._forward()self._backward()for i in range(len(self.pivots), self._m):if not is_zero(self.Ab[i][-1]):return Falsereturn Truedef fancy_print(self):for i in range(self._m):print(" ".join(str(self.Ab[i][j]) for j in range(self._n)), end=" ")print("|", self.Ab[i][-1])

5.4 main

from playLA.Matrix import Matrix
from playLA.Vector import Vector
from playLA.LinearSystem import LinearSystemif __name__ == "__main__":A = Matrix([[1, 2, 4], [3, 7, 2], [2, 3, 3]])b = Vector([7, -11, 1])ls = LinearSystem(A, b)ls.gauss_jordan_elimination()ls.fancy_print()print()# [-1, -2, 3]A2 = Matrix([[1, -3, 5], [2, -1, -3], [3, 1, 4]])b2 = Vector([-9, 19, -13])ls2 = LinearSystem(A2, b2)ls2.gauss_jordan_elimination()ls2.fancy_print()print()# [2, -3, -4]A3 = Matrix([[1, 2, -2], [2, -3, 1], [3, -1, 3]])b3 = Vector([6, -10, -16])ls3 = LinearSystem(A3, b3)ls3.gauss_jordan_elimination()ls3.fancy_print()print()# [-2, 1, -3]A4 = Matrix([[3, 1, -2], [5, -3, 10], [7, 4, 16]])b4 = Vector([4, 32, 13])ls4 = LinearSystem(A4, b4)ls4.gauss_jordan_elimination()ls4.fancy_print()print()# [3, -4, 0.5]A5 = Matrix([[6, -3, 2], [5, 1, 12], [8, 5, 1]])b5 = Vector([31, 36, 11])ls5 = LinearSystem(A5, b5)ls5.gauss_jordan_elimination()ls5.fancy_print()print()# [3, -3, 2]A6 = Matrix([[1, 1, 1], [1, -1, -1], [2, 1, 5]])b6 = Vector([3, -1, 8])ls6 = LinearSystem(A6, b6)ls6.gauss_jordan_elimination()ls6.fancy_print()print()# [1, 1, 1]A7 = Matrix([[1, -1, 2, 0, 3],[-1, 1, 0, 2, -5],[1, -1, 4, 2, 4],[-2, 2, -5, -1, -3]])b7 = Vector([1, 5, 13, -1])ls7 = LinearSystem(A7, b7)ls7.gauss_jordan_elimination()ls7.fancy_print()print()A8 = Matrix([[2, 2],[2, 1],[1, 2]])b8 = Vector([3, 2.5, 7])ls8 = LinearSystem(A8, b8)if not ls8.gauss_jordan_elimination():print("No Solution!")ls8.fancy_print()print()A9 = Matrix([[2, 0, 1],[-1, -1, -2],[-3, 0, 1]])b9 = Vector([1, 0, 0])ls9 = LinearSystem(A9, b9)if not ls9.gauss_jordan_elimination():print("No Solution!")ls9.fancy_print()print()

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/188751.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Mac安装与配置eclipse

目录 一、安装Java&#xff1a;Mac环境配置&#xff08;Java&#xff09;----使用bash_profile进行配置&#xff08;附下载地址&#xff09; 二、下载和安装eclipse 1、进入eclipse的官网 (1)、点击“Download Packages ”​编辑 (2)、找到macOS选择符合自己电脑的框架选项…

Python之函数进阶-闭包原理

Python之函数进阶-闭包原理 闭包 自由变量&#xff1a;未在本地作用域中定义的变量&#xff0c;例如定义在内层函数外的外层函数的作用域中的变量闭包&#xff1a;就是一个概念&#xff0c;出现在嵌套函数中&#xff0c;指的是内层函数引用到了外层函数的自由变量&#xff0c…

【已解决】ModuleNotFoundError: No module named ‘sklearn‘

问题描述 Traceback (most recent call last): File "/home/visionx/nickle/temp/SimCLR/linear_evaluation.py", line 210, in <module> from sklearn.manifold import TSNE ModuleNotFoundError: No module named sklearn 解决办法 pip install numpy…

【Git】中Gui的使用和SSH协议的讲解及IDEA开发中使用git

目录 一、Gui使用 1. 使用 2. 功能 二、SSH协议 1. 讲解 2. 生成密钥 3. 远程仓库绑定公钥 三、IDEA使用 1. IDEA配置git 2. IDEA安装gitee 3. IDEA中登入Git 4. 项目分享 5. 克隆分享的项目 6. idea上传远程 一、Gui使用 (Gui) 是指图形用户界面&#xff0c;它…

centos7部署Canal与Canal集成使用

1、简介 canal [kə’nl]&#xff0c;译意为水道/管道/沟渠&#xff0c;主要用途是基于 MySQL 数据库增量日志解析&#xff0c;提供增量数据订阅和消费 早期阿里巴巴因为杭州和美国双机房部署&#xff0c;存在跨机房同步的业务需求&#xff0c;实现方式主要是基于业务 trigge…

如何关闭Windows Defender(亲测可行!!非常简单)

一、背景 Windows Defender&#xff08;简称WD&#xff09;真的太讨厌了&#xff0c;经常给你报你下载的文件是病毒&#xff0c;且不说真的是不是病毒&#xff0c;它都不询问直接删。 另外聚资料显示WD还会不合时宜地执行扫描导致系统变慢&#xff08;不会在合适的、空闲的时…

操作系统 | proc文件系统

&#x1f308;个人主页&#xff1a;Sarapines Programmer&#x1f525; 系列专栏&#xff1a;《操作系统实验室》&#x1f516;少年有梦不应止于心动&#xff0c;更要付诸行动。 目录结构 1. 操作系统实验之proc文件系统 1.1 实验目的 1.2 实验内容 1.3 实验步骤 1.4 实验…

【Kurbernetes集群】Pod资源、Pod资源限制和Pod容器的健康检查(探针)详解

Pod资源 一、Pod概述1.1 Pod的定义1.2 一个Pod能包含几个容器&#xff1f;1.3 Pod的分类1.3.1 控制器管理的Pod1.3.2 自主式Pod1.3.3 静态Pod 1.4 Pod中容器的分类1.4.1 Pause容器1.4.2 初始化容器1.4.3 应用容器 1.5 Pod常见的状态 二、Pod中的策略2.1 镜像拉取策略2.2 Pod中容…

对Mysql和应用微服务做TPS压力测试

1.对Mysql 使用工具&#xff1a;mysqlslap工具 使用命令&#xff1a; mysqlslap -uroot pGG8697000!#--auto generate sql -auto generate sql-load typemixed-concurrency100,200 - number of queries1000-iterations10 - number-int-cols7 - number-charcols13auto genera…

单片机启动流程

存储器 ​ 一个单片机中存在rom和ram&#xff0c;Soc也有rom和ram&#xff08;ddrx&#xff09;&#xff0c;部分Soc还包含MMU&#xff08;Memory Manage Unit 内存管理单元&#xff09;— &#xff08;用于系统内存管理&#xff0c;比如说虚拟内存空间&#xff0c;内存区间的…

【电路笔记】-节点电压分析和网状电流分析

节点电压分析和网状电流分析 文章目录 节点电压分析和网状电流分析1、节点电压分析1.1 概述1.2 示例 2、网格电流分析2.1 概述2.2 示例 3、总结 正如我们在上一篇介绍电路分析基本定律的文章中所看到的&#xff0c;基尔霍夫电路定律 (KCL) 是计算任何电路中未知电压和电流的强大…

企业计算机中了mkp勒索病毒怎么办,服务器中了勒索病毒如何处理

计算机技术的不断发展给企业的生产生活提供了极大便利&#xff0c;但也为企业带来了网络安全威胁。近期&#xff0c;云天数据恢复中心陆续接到很多企业的求助&#xff0c;企业的计算机服务器遭到了mkp勒索病毒攻击&#xff0c;导致企业的所有工作无法正常开展&#xff0c;给企业…

Jenkins 部署.net core 项目 - NU1301错误

/root/.jenkins/workspace/householdess/services/host/fdbatt.monitor.HttpApi.Host/fdbatt.monitor.HttpApi.Host.csproj : error NU1301: 本地源“/root/.jenkins/workspace/householdess/​http:/x.x.x.x:9081/repository/nuget.org-proxy/index.json”不存在。 [/root/.je…

SpringBoot_01

Spring https://spring.io/ SpringBoot可以帮助我们非常快速的构建应用程序、简化开发、提高效率。 SpringBootWeb入门 需求&#xff1a;使用SpringBoot开发一个web应用&#xff0c;浏览器发起请求/hello后&#xff0c;给浏览器返回字符串"Hello World~~~"。 步骤…

2022ICPC济南站

K Stack Sort 题意&#xff1a;给你一个长度为n的排列&#xff0c;设有m个栈&#xff0c;你需要将这n个数按出现顺序入栈&#xff0c;每次入栈操作从m个栈中选择一个栈从栈顶入栈。当所有元素入栈完成后&#xff0c;需要不断选择栈&#xff0c;将栈中元素弹空。需满足出栈顺序…

Flutter笔记 - 关于 fit 属性以及相关知识的总结

Flutter笔记 关于 fit 属性以及相关知识的总结 作者&#xff1a;李俊才 &#xff08;jcLee95&#xff09;&#xff1a;https://blog.csdn.net/qq_28550263 邮箱 &#xff1a;291148484163.com 本文地址&#xff1a;https://blog.csdn.net/qq_28550263/article/details/13434451…

任正非说:到现在我们终于可以说没有失败,但我们还不能说成功。

你好&#xff01;这是华研荟【任正非说】系列的第36篇文章&#xff0c;让我们聆听任正非先生的真知灼见&#xff0c;学习华为的管理思想和管理理念。 华研荟导语&#xff1a;今天的任正非先生讲话主要节选了他在2001-2004年的几个关于IPD、ISC的论述&#xff0c;可能大家会发现…

网络运维Day10

文章目录 SHELL基础查看有哪些解释器使用usermod修改用户解释器BASH基本特性 shell脚本的设计与运行编写问世脚本脚本格式规范执行shell脚本方法一方法二实验 变量自定义变量环境变量位置变量案例 预定义变量 变量的扩展运用多种引号的区别双引号的应用单引号的应用反撇号或$()…

Python环境安装、Pycharm开发工具安装(IDE)

Python下载 Python官网 Python安装 Python安装成功 Pycharm集成开发工具下载&#xff08;IDE&#xff09; PC集成开发工具 Pycharm集成开发工具安装&#xff08;IDE&#xff09; 安装完成 添加环境变量&#xff08;前面勾选了Path不用配置&#xff09; &#xff08;1&…

在程序中链接静态库

现在我们把上面src目录中的add.cpp、div.cpp、mult.cpp、sub.cpp编译成一个静态库文件libcalc.a。 add_library(库名称 STATIC 源文件1 [源文件2] ...) link_libraries(<static lib> [<static lib>...]) 参数1&#xff1a;指定出要链接的静态库的名字 可以是全…