线性代数-Python-05:矩阵的逆+LU分解

文章目录

  • [1 矩阵的逆](#1 矩阵的逆)
    • [1.1 求解矩阵的逆](#1.1 求解矩阵的逆)
  • [2 初等矩阵](#2 初等矩阵)
    • [2.1 初等矩阵和可逆性](#2.1 初等矩阵和可逆性)
  • [3 矩阵的LU分解](#3 矩阵的LU分解)
    • [3.1 LU分解的实现](#3.1 LU分解的实现)

1 矩阵的逆


1.1 求解矩阵的逆

c 复制代码
def inv(A):

    if A.row_num() != A.col_num():
        return None

    n = A.row_num()
    
    """矩阵A+单位矩阵"""
    ls = LinearSystem(A, Matrix.identity(n))
    
    """对线性系统进行高斯消元,如果没有解,返回none"""
    if not ls.gauss_jordan_elimination():
        return None
        
	"""高斯消元有解的话,把线性系统的右部分取出,重新构成矩阵,得到矩阵的逆"""
    invA = [[row[i] for i in range(n, 2*n)] for row in ls.Ab]
    
    return Matrix(invA)

2 初等矩阵


2.1 初等矩阵和可逆性



3 矩阵的LU分解

3.1 LU分解的实现

cpp 复制代码
from .Matrix import Matrix
from .Vector import Vector
from ._globals import is_zero


def lu(matrix):

    assert matrix.row_num() == matrix.col_num(), "matrix must be a square matrix"

    n = matrix.row_num() 
    
	"""A是原矩阵的副本"""
    A = [matrix.row_vector(i) for i in range(n)]
    
	"""初始化L,使对角线元素为1"""
    L = [[1.0 if i == j else 0.0 for i in range(n)] for j in range(n)]

    for i in range(n):
        """看A[i][i]位置是否可以是主元"""
        if is_zero(A[i][i]):
            return None, None
        else: """将主元以下的j位置变为0"""
            for j in range(i + 1, n):
                p = A[j][i] / A[i][i] """求加减的系数"""
                A[j] = A[j] - p * A[i] """将第j行的位置经过加减运算变成0"""
                L[j][i] = p """将L矩阵相应位置变成相应变换的值"""

    return Matrix(L), Matrix([A[i].underlying_list() for i in range(n)])
相关推荐
databook3 小时前
Manim实现闪光轨迹特效
后端·python·动效
Juchecar5 小时前
解惑:NumPy 中 ndarray.ndim 到底是什么?
python
用户8356290780515 小时前
Python 删除 Excel 工作表中的空白行列
后端·python
Json_5 小时前
使用python-fastApi框架开发一个学校宿舍管理系统-前后端分离项目
后端·python·fastapi
数据智能老司机11 小时前
精通 Python 设计模式——分布式系统模式
python·设计模式·架构
数据智能老司机13 小时前
精通 Python 设计模式——并发与异步模式
python·设计模式·编程语言
数据智能老司机13 小时前
精通 Python 设计模式——测试模式
python·设计模式·架构
数据智能老司机13 小时前
精通 Python 设计模式——性能模式
python·设计模式·架构
c8i13 小时前
drf初步梳理
python·django
每日AI新事件13 小时前
python的异步函数
python