当前位置: 首页 > article >正文

Python求解线性方程组

文章目录

    • solve
    • 带状矩阵
    • 三角矩阵
    • 循环矩阵

scipy.linalg中封装了一系列用于求解矩阵方程的算法,列表如下

函数方程备注
solve(a, b) a x = b ax=b ax=b
solve_banded((l, u), ab, b) a x = b ax=b ax=ba为带状矩阵
solveh_banded(ab, b) a x = b ax=b ax=ba为厄密正定带状矩阵
solve_circulant(c, b) c x = b cx=b cx=bc是循环矩阵
solve_triangular(a, b) a x = b ax=b ax=ba是三角阵

solve

solve是一个功能十分强大的函数,可用于求解形如a@x=b之类的问题,其参数如下

solve(a, b, lower=False, overwrite_a=False, overwrite_b=False, check_finite=True, assume_a='gen', transposed=False)

其中assume_a是对矩阵a的特征描述,可选四个字符串

  • gen 普通矩阵(generic)
  • sym 对称矩阵(symmetric)
  • her 厄密特矩阵(hermitian)
  • pos 正定矩阵(postive define)

其他参数含义如下

  • lowerassume_a不为gen时可用,若为True,则只计算a的下三角部分,否则只计算上三角部分
  • overwrite_aTrue时允许覆盖a的数据
  • overwrite_bTrue时允许覆盖b的数据
  • check_finiteTrue时,检查数据是否全为有限值
  • transposedTrue时,计算a.T@x=b

如果允许覆盖a或者b的数据,则可以节省一点内存和运算时间。

import numpy as np
from scipy.linalg import solve
a = np.random.rand(10,10)
x = np.arange(10)
b = a @ x
x1 = solve(a, b)
print(x)
[0 1 2 3 4 5 6 7 8 9]
print(x1)
[-1.28900588e-14  1.00000000e+00  2.00000000e+00  3.00000000e+00
  4.00000000e+00  5.00000000e+00  6.00000000e+00  7.00000000e+00
  8.00000000e+00  9.00000000e+00]

带状矩阵

如果某个方阵的所有非零元素都集中在对角线附近的带状区域,则为带状矩阵。对于带状矩阵 A A A,若在 i > j + l i>j+l i>j+l时, a i j = 0 a_{ij}=0 aij=0,则 A A A的下带宽(lower bandwidth)为 l l l;若在 j > i + u j>i+u j>i+u时, a i j = 0 a_{ij}=0 aij=0,则 A A A的上带宽(upper bandwidth)为 u u u。例如下面的 5 × 5 5\times5 5×5矩阵中,下带宽 l = 1 l=1 l=1,上带宽 u = 2 u=2 u=2

[ ⋅ ⋅ ⋅ 0 0 ⋅ ⋅ ⋅ ⋅ 0 0 ⋅ ⋅ ⋅ ⋅ 0 0 ⋅ ⋅ ⋅ 0 0 0 ⋅ ⋅ ] \begin{bmatrix} ·&·&·&0&0\\ ·&·&·&·&0\\ 0&·&·&·&·\\ 0&0&·&·&·\\ 0&0&0&·&·\\ \end{bmatrix} 000000000

scipy.linalg中,solve_bandedsolveh_banded均用于 a a a为带状矩阵时的求解情况,二者均支持check_finite参数,并且可以选择是否覆盖ab, b等,其他参数列表如下

  • solve_banded((l,u), ab, b,)
  • solveh_banded(ab, b, lower=False,)

三角矩阵

scipy.linalg另外提供了对三角矩阵的求解方案solve_triangular,亦支持check_finite参数,以及可以选择是否覆盖a, b,其他参数列表如下

  • solve_triangular(a, b, trans=0, lower=False, unit_diagonal=False)

其中,unit_diagonalTrue时,则假定对角元素为1。

循环矩阵

所谓循环矩阵,其形式为

c = [ a 1 a 2 a 3 ⋯ a n a n a 1 a 3 ⋯ a n − 1 a n − 1 a 1 a 2 ⋯ a n − 2 ⋮ ⋮ ⋮ ⋮ a 2 a 3 a 4 ⋯ a 1 ] c=\begin{bmatrix} a_1&a_2&a_3&\cdots&a_n\\ a_n&a_1&a_3&\cdots&a_{n-1}\\ a_{n-1}&a_1&a_2&\cdots&a_{n-2}\\ \vdots&\vdots&\vdots&&\vdots&\\ a_2&a_3&a_4&\cdots&a_1\\ \end{bmatrix} c= a1anan1a2a2a1a1a3a3a3a2a4anan1an2a1

形如 c x = b cx=b cx=b这类求解问题,若 c c c是循环矩阵,则可通过快速傅里叶变换进行求解: x = F − 1 [ F [ b ] F [ c ] ] x=F^{-1}\big[\frac{F[b]}{F[c]}\big] x=F1[F[c]F[b]]。在scipy.linalg中,对此进行了封装

scipy.linalg.solve_circulant(c, b, singular='raise', tol=None, caxis=-1, baxis=0, outaxis=0)

除了c,b之外,其他参数含义如下

  • singularstr"raise"时,则弹出奇异值错误;为lstsq时,返回最小二乘解。
  • tol 表示精度
  • caxisc的维度大于1时,caxis表示循环向量所在轴。
  • baxisb的维度大于1时,baxis表示计算时代求向量所在轴
  • outaxisc,b维度大于1,则返回值也是多维的,此时outaxisx所在轴。

http://www.kler.cn/a/6940.html

相关文章:

  • 在MATLAB中导入TXT文件的若干方法
  • 网络安全之国际主流网络安全架构模型
  • 利用Python爬虫获取淘宝店铺详情
  • 28.<Spring博客系统⑤(部署的整个过程(CentOS))>
  • PyTorch——从入门到精通:PyTorch基础知识(张量)【PyTorch系统学习】
  • MySQL 中的数据排序是怎么实现的
  • DETR代码学习(五)之匈牙利匹配
  • 最大连通块之DFS,BFS
  • hydrus模型1D/2D/3D
  • 华为交换机 STP 协议
  • Hadoop(伪分布式)+Spark(local模式)搭建Hadoop和Spark组合环境
  • MagicBook安装Ubuntu
  • 数字化时代,企业的数据指标管理指南
  • 3036: 莫比乌斯最大值isUsefulAlgorithm(2023郑州轻工业大学校赛
  • 二分法模板以及例题 (三)
  • Weblogic RCE + confluence RCE + cacti RCE正反向代理靶场
  • 王炸!ChatGPT这算是彻底打脸马云。。。
  • 「解析」Jetson orin NX烧录系统
  • 腾讯云安装docker
  • 对闭包的理解?闭包使用场景?
  • 亿信华辰全力打造金融统一监管报送平台,你值得拥有
  • 【计算机网络复习】第二章 应用层 2
  • mysql8计算商家距离,按照由近及远排序
  • Hadoop分布式集群安装部署(Redhat 6.4 64位操作系统)
  • 【蓝桥杯嵌入式】蓝桥杯第十二届省赛程序真题,真题分析与代码讲解
  • 新办林业调查设计资质需要符合什么条件,多久能办下来?