数值分析第五章节 用Python实现解线性方程组的直接解法

参考书籍:数值分析 第五版 李庆杨 王能超 易大义编 第5章 解线性方程组的直接解法

文章声明:如有发现错误,欢迎批评指正

文章目录

引言与预备知识

5.1.1:关于线性方程组的数值解法一般有两类:直接法和迭代法。5.1.2向量和矩阵:非奇异矩阵:设 A ∈ R n × n A\in R^{n\times n} A∈Rn×n, B ∈ R n × n B\in R^{n\times n} B∈Rn×n。如果 A B = B A = I AB=BA=I AB=BA=I,则称 B B B是 A A A的逆矩阵,记为 A − 1 A^{-1} A−1,且 ( A − 1 ) T = ( A T ) − 1 (A^{-1})^T=(A^T)^{-1} (A−1)T=(AT)−1。如果 A − 1 A^{-1} A−1存在,则称 A A A为非奇异矩阵。如果 A , B ∈ R n × n A,B\in R^{n\times n} A,B∈Rn×n均为非奇异矩阵,则 ( A B ) − 1 = B − 1 A − 1 (AB)^{-1}=B^{-1}A^{-1} (AB)−1=B−1A−1。其他跳过。5.1.3矩阵的特征值与谱半径: A A A的全体特征值称为 A A A的谱,记作 σ ( A ) \sigma(A) σ(A),即 σ ( A ) = { λ 1 , λ 2 , ... , λ n } \sigma(A)=\{\lambda_1,\lambda_2,\dots,\lambda_n\} σ(A)={λ1,λ2,...,λn}。记 ρ ( A ) = max ⁡ 1 ≤ i ≤ n ∣ λ i ∣ \rho(A)=\max\limits_{1\leq i\leq n}|\lambda_i| ρ(A)=1≤i≤nmax∣λi∣,称为矩阵 A A A的谱半径。其他跳过。5.1.4特殊矩阵:直接跳过。都是高等代数知识,所以我们直接跳过。

高斯消去法

5.2.1高斯消去法:十分简单大家都会,注意一下使用条件。定理:约化的主元素 a i i ( i ) ≠ 0 ( i = 1 , 2 , ... , k ) a_{ii}^{(i)}\neq0(i=1,2,\dots,k) aii(i)=0(i=1,2,...,k)的充要条件是矩阵 A A A的顺序主子式 D i ≠ 0 ( i = 1 , 2 , ... , k ) D_i\neq0(i=1,2,\dots,k) Di=0(i=1,2,...,k)(挺重要的,挺好证的)。矩阵的初等行变换其实就是左乘一个矩阵。 L ( 1 ) A ( 0 ) = A ( 1 ) , ... , L ( n ) A ( n − 1 ) = A ( n ) 。 L = L ( n − 1 ) × ⋯ × L ( 1 ) , U = A ( n ) L^{(1)}A^{(0)}=A^{(1)},\dots,L^{(n)}A^{(n-1)}=A^{(n)}。L=L^{(n-1)}\times\dots\times L^{(1)},U=A^{(n)} L(1)A(0)=A(1),...,L(n)A(n−1)=A(n)。L=L(n−1)×⋯×L(1),U=A(n)。 5.2.3列主元法:我们使用列主元法进行演示。5.2.2矩阵的三角分解:定理(矩阵的LU分解):设 A A A为 n n n阶矩阵,如果 A A A的顺序主子式 D i ≠ 0 ( i = 0 , 1 , ... , n − 1 ) D_i\neq0(i=0,1,\dots,n-1) Di=0(i=0,1,...,n−1),则 A A A可分解为一个单位下三角矩阵 L L L和一个上三角矩阵 U U U的乘积,且这种分解是唯一的。5.2.1,5.2.3,5.2.2的顺序更有条理。

列主元消去法

我感觉我写得挺好,可以算作通用代码,前提必须保证有解。caozuo1是交换,caozuo2是归0。你把caozuo1删除了,就是高斯消去。这是第五章节例4,书上每步全都采用4位近似,我的更加准确一点。

python 复制代码
def caozuo1(lt,x):
    global m
    a,b=x,abs(lt[x][x])
    for i in range(x+1,m):
        if abs(lt[i][x])>b:
            a,b=i,abs(lt[i][x])
    lt[x],lt[a]=lt[a],lt[x]
    return lt
def caozuo2(lt,x):
    global m,n
    for i in range(x+1,m):
        k=-lt[i][x]/lt[x][x];lt[i][x]=0
        for j in range(x+1,n):
            lt[i][j]+=lt[x][j]*k
    return lt
def solve(lt):
    global m,n
    x=[]
    for i in range(m-1,-1,-1):
        cnt=lt[i][n-1]
        for j in range(len(x)):
            cnt-=lt[i][n-j-2]*x[j]
        x.append(cnt/lt[i][i])
    return x[::-1]
m,n=map(eval,input().strip().split())
lt=[]
for _ in range(m):
    lt.append([eval(_) for _ in input().strip().split()])
for i in range(m-1):
    lt=caozuo1(lt,i)
    lt=caozuo2(lt,i)
print(solve(lt))

矩阵三角分解法

5.3.1直接三角分解法:1.不选主元的三角分解法。(杜利特尔分解法)2.选主元的三角分解法。我们使用杜利特尔分解法进行演示。

我感觉我写得挺好,可以算作通用代码,前提必须保证有解。这是第五章节例5,与书上的一摸一样。

杜利特尔分解法

python 复制代码
def L(lt1,lt2,x):
    for i in range(x+1,n):
        cnt=0
        for j in range(x):
            cnt+=lt1[i][j]*lt2[j][x]
        lt1[i][x]=(lt[i][x]-cnt)/lt2[x][x]
    return lt1
def U(lt1,lt2,x):
    global lt,n
    for i in range(x,n):
        cnt=0
        for j in range(x):
            cnt+=lt1[x][j]*lt2[j][i]
        lt2[x][i]=lt[x][i]-cnt
    return lt2
n=int(input("系数方阵的行列数"))
lt1=[[0 for _ in range(n)] for _ in range(n)]
for _ in range(n):
    lt1[_][_]=1
lt2=[[0 for _ in range(n)] for _ in range(n)]
lt=[]
for _ in range(n):
    lt.append([eval(_) for _ in input().strip().split()])
for i in range(n-1):
    lt2=U(lt1,lt2,i)
    lt1=L(lt1,lt2,i)
lt2=U(lt1,lt2,n-1)
print("===============L===============")
for i in lt1:
    for j in i:
        print("{:>8.2f}".format(j),end="")
    print()
print("===============U===============")
for i in lt2:
    for j in i:
        print("{:>8.2f}".format(j),end=" ")
    print()

我们使用之前写的列主元消去法求解。y,x如下。

y:

x:

5.3.2平方根法。定理:设 A A A为 n n n阶对称矩阵,且 A A A的所有顺序主子式均不为零,则 A A A可分解为 A = L D L T A=LDL^T A=LDLT,其中 A A A为单位下三角矩阵, D D D为对角矩阵。定理:如果 A A A为 n n n阶对称正定矩阵,则存在一个实的非奇异下三角矩阵 L L L,使 A = L L T A=LL^T A=LLT,当限定 L L L的对角元素为正时,这种分解是唯一的。我们对它进行演示。

平方根法

自己随便捏的对称正定矩阵。代码变量LT是L的转置意思。

python 复制代码
def caozuo(LT,x):
    global lt,n
    cnt=0
    for i in range(x):
        cnt+=pow(LT[i][x],2)
    LT[x][x]=pow(lt[x][x]-cnt,0.5)
    for i in range(x+1,n):
        cnt=0
        for j in range(x):
            cnt+=LT[j][x]*LT[j][i]
        LT[x][i]=(lt[x][i]-cnt)/LT[x][x]
    return LT
n=int(input("系数矩阵的行列数"))
lt=[]
for _ in range(n):
    lt.append([eval(_) for _ in input().strip().split()])
LT=[[0 for _ in range(n)] for _ in range(n)]
for i in range(n):
    LT=caozuo(LT,i)
for i in LT:
    for j in i:
        print("{:>8.2f}".format(j),end=" ")
    print()

5.3.3 追赶法:追赶法更简单,我们就不演示。

向量和矩阵的范数

5.4.1向量范数:向量的 p p p范数: ∣ ∣ x ∣ ∣ p = ( ∑ i = 1 n ∣ x i ∣ p ) 1 p , p ∈ [ 1 , ∞ ) ||x||p=(\sum\limits{i=1}^n|x_i|^p)^{\frac{1}{p}},p\in[1,\infty) ∣∣x∣∣p=(i=1∑n∣xi∣p)p1,p∈[1,∞)。其他东西我们不管。5.4.2 矩阵范数: ∣ ∣ A ∣ ∣ ∞ = max ⁡ 1 ≤ i ≤ n ∑ j = 1 n ∣ a i j ∣ ||A||{\infty}=\max\limits{1\leq i\leq n}\sum\limits_{j=1}^n|a_{ij}| ∣∣A∣∣∞=1≤i≤nmaxj=1∑n∣aij∣(行范数)。 ∣ ∣ A ∣ ∣ 1 = max ⁡ 1 ≤ j ≤ n ∑ i = 1 n ∣ a i j ∣ ||A||1=\max\limits{1\leq j\leq n}\sum\limits_{i=1}^n|a_{ij}| ∣∣A∣∣1=1≤j≤nmaxi=1∑n∣aij∣(列范数)。 ∣ ∣ A ∣ ∣ 2 = λ max ⁡ ( A T A ) ||A||2=\sqrt{\lambda{\max}(A^TA)} ∣∣A∣∣2=λmax(ATA) 。其他东西我们不管。求范数的程序简单所以我们不作演示。

误差分析

定义:设 A A A为非奇异矩阵,称数 c o n d ( A ) v = ∣ ∣ A − 1 ∣ ∣ v ∣ ∣ A ∣ ∣ v ( v = 1 , 2 , ∞ ) cond(A)_v=||A^{-1}||_v||A||v(v=1,2,\infty) cond(A)v=∣∣A−1∣∣v∣∣A∣∣v(v=1,2,∞)为矩阵A的条件数。 c o n d ( A ) 2 = ∣ ∣ A − 1 ∣ ∣ 2 ∣ ∣ A ∣ ∣ 2 = λ max ⁡ ( A T A ) λ min ⁡ ( A T A ) cond(A)2=||A^{-1}||2||A||2=\sqrt{\frac{\lambda{\max}(A^TA)}{\lambda{\min}(A^TA)}} cond(A)2=∣∣A−1∣∣2∣∣A∣∣2=λmin(ATA)λmax(ATA) 当 A A A为对称矩阵时 c o n d ( A ) 2 = ∣ λ 1 ∣ ∣ λ 2 ∣ cond(A)2=\frac{|\lambda_1|}{|\lambda_2|} cond(A)2=∣λ2∣∣λ1∣, c o n d ( A ) ∞ = ∣ ∣ A − 1 ∣ ∣ ∞ ∣ ∣ A ∣ ∣ ∞ cond(A){\infty}=||A^{-1}||{\infty}||A||{\infty} cond(A)∞=∣∣A−1∣∣∞∣∣A∣∣∞。 c o n d ( A ) cond(A) cond(A)越大方程越病态。

相关推荐
算法小白(真小白)1 小时前
低代码软件搭建自学第二天——构建拖拽功能
python·低代码·pyqt
唐小旭1 小时前
服务器建立-错误:pyenv环境建立后python版本不对
运维·服务器·python
007php0071 小时前
Go语言zero项目部署后启动失败问题分析与解决
java·服务器·网络·python·golang·php·ai编程
Chinese Red Guest1 小时前
python
开发语言·python·pygame
骑个小蜗牛2 小时前
Python 标准库:string——字符串操作
python
黄公子学安全4 小时前
Java的基础概念(一)
java·开发语言·python
程序员一诺5 小时前
【Python使用】嘿马python高级进阶全体系教程第10篇:静态Web服务器-返回固定页面数据,1. 开发自己的静态Web服务器【附代码文档】
后端·python
小木_.5 小时前
【Python 图片下载器】一款专门为爬虫制作的图片下载器,多线程下载,速度快,支持续传/图片缩放/图片压缩/图片转换
爬虫·python·学习·分享·批量下载·图片下载器
Jiude5 小时前
算法题题解记录——双变量问题的 “枚举右,维护左”
python·算法·面试