数学实践3 - C++下的稀疏矩阵(Sparse Matrix)迭代求解

目录

问题描述

稀疏矩阵的迭代求解(算法)

Jacobi求解法

原理

收敛性(Konvergenz)

终止条件

共轭梯度法(CG-Verfahren)

原理

收敛性

终止条件

C++下的算法实现

用哈希表储存稀疏矩阵

std::unordered_map

构造函数和析构函数(Konstruktor / Dekonstruktor)


问题描述

生活中在碰到某些特定问题,譬如处理偏微分方程(partielle Differentialgleichungen) ,Cholesky分解或者一些图像问题的时候,我们会碰到一些维度很大,但含有大量零元的矩阵,用一般的求解法,诸如高斯消元法,LR-、QR- 分解法虽然能直接求解精确值,但计算时间复杂度为 O(n^{3}) ,且需要大量的空间存储矩阵及可能产生的中间值,对计算机来说是个不小的负担。而即使利用高斯消元法也要考虑计算机本身以及一些不恰当的求解步骤产生的误差(schlecht konditioniert),不能保证计算结果绝对精确,有时还需要迭代法对结果进一步处理才能得到期望的近似值(Nachiteration)。

 

稀疏矩阵的迭代求解(算法)

稀疏矩阵是一种每一行的非零元个数显著小于列数的特殊矩阵,实际存储时可以通过只存储非零元的方式节省内存。迭代求解法(Iterationsverfahren)是一种通过逐步逼近精确值的方式得到误差范围内的近似值的方法,它的优势是:

  1. 处理大型矩阵时比直接求解法更高效,往往在很有限的步数就能得到比较精确的结果。
  2. 原矩阵在计算过程中基本没有变化,保留了稀疏矩阵的优势,且不需要建立中间矩阵,大大地节省内存空间。
  3. 对于某些矩阵(shlechte konditionierte Matrizen) 能得出比直接求解法更精确的值。

但是运用迭代求解法既要保证结果不断地逼近精确值(konvergiert),也要在每一步后对得到的中间向量进行误差分析,设置一个合适的停止条件(Abbruchbedingung),保证算法终止。这往往要求矩阵满足一些特殊条件。

接下来介绍两种算法:Jacobi求解法(Gesamtschrittverfahren)和共轭梯度法(Konjugierte Gradienten)。

Jacobi求解法

原理

Jacobi求解法属于Splitting求解的一种,Splitting的基本特征是在运算中把矩阵分解为上三角矩阵(obere Dreiecksmatrix)、下三角矩阵(untere Dreiecksmatrix)和对角矩阵(Diagonalmatrix):

A\in R^{n\times n}             A = A_{L}+D+A_{R}

可以对方程进行如下转化:

A\cdot x=b \\ \Leftrightarrow B^{-1}(B+(A-B))\cdot x=B^{-1}b \\ \Leftrightarrow x+B^{-1}(A-B)\cdot x=B^{-1}b \\ \Leftrightarrow x=B^{-1}(B-A)\cdot x + B^{-1}b \\ \Leftrightarrow x=(I-B^{-1}A)\cdot x+B^{-1}b \\ \Leftrightarrow x=(I-B^{-1}(A_{L}+D+A_{R}))\cdot x+B^{-1}b \\ \Leftrightarrow x=(I-B^{-1}D-B^{-1}(A_{L}+A_{R}))\cdot x + B^{-1}b

在Jacobi求解法中,取 B = D,得到:

x = D^{-1}(b-(A_{L}+A_{R})x)

此方程可以转化为递归方程:

x_{k+1} = D^{-1}(b-(A_{L}+A_{R})x_{k})

当由该递归方程定义的  lim_{k \to \infty}x_{k} 存在时(konvergiert),那个极值正好是方程组的解,因此任选一个起始值 x_{0},只要递归方程收敛,就能利用这个式子无限逼近精确值。

 

收敛性(Konvergenz)

问题:在Jacobi求解法中取 B = D 是什么意思?这和方程的收敛性有何联系?

直观一点理解:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值