线性代数-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.mzph.cn/news/137833.shtml

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

相关文章

比较PID控制和神经网络控制在机器人臂上的应用

机器人臂是自动化领域中常见的机器人形式&#xff0c;其精确控制对于实现复杂任务具有重要意义。在机器人臂的控制中&#xff0c;PID控制和神经网络控制是两种常用的控制方法。本文将比较PID控制和神经网络控制在机器人臂控制方面的应用&#xff0c;包括控制原理、优缺点以及在…

Angular 由一个bug说起之一:List / Grid的性能问题

在angular中&#xff0c;MatTable构建简单&#xff0c;使用范围广。但某些时候会出现卡顿 卡顿情景&#xff1a; 1&#xff1a;一次性请求太多的数据 2&#xff1a;一次性渲染太多数据&#xff0c;这会花费CPU很多时间 3&#xff1a;行内嵌套复杂的元素 4&#xff1a;使用过多的…

【Docker】Docker 网络

引言 Docker是一个开源的应用容器引擎&#xff0c;它允许开发者将应用及其依赖打包到一个可移植的容器中&#xff0c;然后发布到任何流行的Linux机器或Windows机器上&#xff0c;也可以实现虚拟化。Docker的主要优势之一是其网络功能&#xff0c;而网络功能的核心就是网络驱动…

HTTP协议详解-下(Tomcat)

如何构造 HTTP 请求 对于 GET 请求 地址栏直接输入点击收藏夹html 里的 link script img a…form 标签 通过 form 标签构造GET请求 <body><!-- 表单标签, 允许用户和服务器之间交互数据 --><!-- 提交的数据报以键值对的结果来组织 --><form action&quo…

18 Linux 阻塞和非阻塞 IO

一、阻塞和非阻塞 IO 1. 阻塞和非阻塞简介 这里的 IO 指 Input/Output&#xff08;输入/输出&#xff09;&#xff0c;是应用程序对驱动设备的输入/输出操作。当应用程序对设备驱动进行操作的时候&#xff0c;如果不能获取到设备资源&#xff0c;那么阻塞式 IO 就会将对应应用…

Zynq-Linux移植学习笔记之65- 国产ZYNQ在linux下usleep时间精度不准问题解决

1、背景介绍 采用复旦微的ZYNQ&#xff0c;跑linux操作系统&#xff0c;在应用程序中使用usleep进行延时时&#xff0c;发现存在10ms以下采用usleep试验都为10ms的情况 2、解决办法 使能设备树中的PS TTC设备&#xff0c;默认不是打开的 timere0024000 {compatible "s…

一题三解(暴力、二分查找算法、单指针):鸡蛋掉落

涉及知识点 暴力、二分查找算法、单指针 题目 给你 k 枚相同的鸡蛋&#xff0c;并可以使用一栋从第 1 层到第 n 层共有 n 层楼的建筑。 已知存在楼层 f &#xff0c;满足 0 < f < n &#xff0c;任何从 高于 f 的楼层落下的鸡蛋都会碎&#xff0c;从 f 楼层或比它低的…

GEE ——errors & debuggings (2023GEE峰会总结)

简介&#xff1a; 在gee中有三种错误&#xff0c;一种就是系统错误&#xff0c;也就是我们看到的会在JavaScript code editor中出现的错误&#xff0c;也就是在程序还没有启动之前就会提示的错误&#xff0c;而客户端错误则主要是会提示一些在代码过程中的错误&#xff0c;比如…

远程电脑未连接显示器时分辨率太小的问题处理

背景&#xff1a;单位电脑显示器坏了&#xff0c;使用笔记本通过向日葵远程连接&#xff0c;发现分辨率只有800*600并且不能修改&#xff0c;网上找了好久找到了处理方法这里记录一下&#xff0c;主要用到的是一个虚拟显示器软件usbmmidd_v2 1)下载usbmmidd_v2 2&#xff09;…

asp.net core mvc之模型绑定、特性约束模型绑定、模型验证(服务器/客户端/远程)

一、不用模型绑定 数据类型都是string 1、UserController.cs public class UserController : Controller {public IActionResult Register(){return View();}[HttpPost]public IActionResult DoRegister(){//不用模型绑定 以前的方法取表单数据或Url的参数//数据类型都是s…

软件测试项目实战经验附视频以及源码【商城项目,app项目,电商项目,银行项目,医药项目,金融项目】(web+app+h5+小程序)

前言&#xff1a; ​​大家好&#xff0c;我是阿里测试君。 最近很多小伙伴都在面试&#xff0c;但是对于自己的项目经验比较缺少。阿里测试君再度出马&#xff0c;给大家找了一个非常适合练手的软件测试项目&#xff0c;此项目涵盖web端、app端、h5端、小程序端&#xff0c;…

Anaconda Powershell Prompt和Anaconda Prompt的区别

先说结论&#xff1a;主要功能应该一样。区别在于powershell支持的命令更多。比如查询路径的命令pwd和列表命令ls。 Anaconda PowerShell Prompt和Anaconda Prompt是Anaconda发行版中两个不同的命令提示符工具。 Anaconda Prompt是Anaconda发布的默认命令提示符工具&#xff0…

FFMPEG库实现mp4/flv文件(H264+AAC)的封装与分离

ffmepeg 4.4&#xff08;亲测可用&#xff09; 一、使用FFMPEG库封装264视频和acc音频数据到 mp4/flv 文件中 封装流程 1.使用avformat_open_input分别打开视频和音频文件&#xff0c;初始化其AVFormatContext&#xff0c;使用avformat_find_stream_info获取编码器基本信息 2.使…

react之Component存在的2个问题

问题 只要执行setState()&#xff0c;即使不改变状态数据&#xff0c;组件也会重新render()只当前组件重新render()&#xff0c;就会自动重新render子组件 原因 Component中的shouldComponentUpdate()总是返回true 思路 只有当组件的state或props数据发生改变时才重新rend…

听GPT 讲Rust源代码--library/core/src

题图来自 The first unofficial game jam for Rust lang![1] File: rust/library/core/src/hint.rs rust/library/core/src/hint.rs文件的作用是提供了一些用于提示编译器进行优化的函数。 在Rust中&#xff0c;编译器通常会根据代码的语义进行自动的优化&#xff0c;以提高程序…

React【axios、全局处理、 antd UI库、更改主题、使用css module的情况下修改第三方库的样式、支持sass less】(十三)

文件目录 Proxying in Development http-proxy-middleware fetch_get fetch 是否成功 axios 全局处理 antd UI库 更改主题 使用css module的情况下修改第三方库的样式 支持sass & less Proxying in Development 在开发模式下&#xff0c;如果客户端所在服务器跟后…

华为交换机端口 access、trunk和hybrid收发数据规则

文章目录 1. 三个端口类型处理数据帧的汇总表2. access 端口3. trunk端口4. Hybrid 端口&#xff08;交换机的默认端口类型&#xff09;5.常用命令 1. 三个端口类型处理数据帧的汇总表 端口类型收到不带VLAN标签的帧的处理规则收到带VLAN标签的帧的处理规则发送帧时的处理规则…

54基于matlab的包络谱分析

基于matlab的包络谱分析&#xff0c;目标信号→希尔伯特变换→得到解析信号→求解析信号的模→得到包络信号→傅里叶变换→得到Hilbert包络谱&#xff0c;包络谱分析能够有效地将这种低频冲击信号进行解调提取。程序已调通&#xff0c;可直接运行。 54matlab包络谱分析信号解调…

轻量日志管理方案-[EFK]

使用FileBeat进行日志文件的数据收集&#xff0c;并发送到ES进行存储&#xff0c;最后Kibana进行查看展示&#xff1b; 这个应该是最简单&#xff0c;轻量的日志收集方案了。 最总方案为&#xff1a;FileBeatESKibana ; 【Kibana过于强大&#xff0c;感觉可以无限扩展】 文章目…

msvcp140_CODECVT_IDS.dll丢失怎么办?msvcp140_CODECVT_IDS.dll丢失5个解决办法详解

首先&#xff0c;我要讲述一下我是如何遇到这个问题的。那时候&#xff0c;我正在打开一个电脑的应用程序&#xff0c;使用软件&#xff08;ps&#xff09;进行编程。在打开软件时候&#xff0c;突然发现程序无法正常启动&#xff0c;弹出了一个错误提示框&#xff0c;显示msvc…