数值线性代数最重要和共同的应用之一是可以以形式表示的线性系统的解决方案a * x = b
。什么时候A.
是一个大的稀疏矩阵,可以使用迭代方法解决线性系统,使您可以在计算的运行时间和解决方案的精度之间进行权衡。本主题介绍MATLAB中可用的迭代方法®解决方程a * x = b
。
求解线性方程有两种类型的方法a * x = b
:
直接方法是高斯消除的变体。这些方法直接使用单个矩阵元素,通过矩阵操作,例如LU,QR或Cholesky分解。您可以使用直接方法来解决具有高精度水平的线性方程,但在大稀疏矩阵上运行时,这些方法可能会慢。用直接方法求解线性系统的速度强烈取决于系数矩阵的密度和填充图案。
例如,该代码解决了一个小的线性系统。
a =魔术(5);b = sum(a,2);x = a \ b;常态(A * X-B)
ans = 1.4211e-14
Matlab通过矩阵分割运算符实现直接方法/
和\
以及诸如此类的功能分解
那lsqminnorm.
,和Linsolve.
。
迭代方法在有限的步骤之后为线性系统产生近似解决方案。这些方法对于大型方程式有用,在那里可以合理地对较短的运行时间进行权衡精度。迭代方法仅通过矩阵矢量产品或抽象线性操作员间接地使用系数矩阵。可以与任何矩阵一起使用迭代方法,但它们通常应用于大稀疏矩阵,用于直接求解速度。用间接方法求解线性系统的速度不依赖于系数矩阵的填充图案作为直接方法。然而,使用迭代方法通常需要调整每个特定问题的参数。
例如,该代码解决了具有对称正定系数矩阵的大型稀疏线性系统。
a = delsq(numgrid('L',400));b =α(大小(a,1),1);x = PCG(A,B,[],1000);常态(B-A * x)
PCG将迭代796融合到具有相对残留的9.9E-07的溶液。ans = 3.4285e-04
Matlab实现了各种迭代方法,这取决于系数矩阵的性质的不同优点和缺点A.
。
如果有足够的存储可用以将它们输出,直接方法通常比间接方法更快更普遍适用。一般来说,您应该尝试使用x = a \ b
首先。如果直接解决太慢,那么您可以尝试使用迭代方法。
解决线性方程的最迭代算法遵循类似的过程:
从初始猜测开始解决方案矢量X0.
。(这通常是零的向量,除非您指定更好的猜测。)
计算残余标准RES = NOM(B-A * X0)
。
将残余与指定的公差进行比较。如果res <= tol
,结束计算并返回计算的答案X0.
。
申请a * x0.
并更新向量的幅度和方向X0.
基于残差和其他计算量的值。这是大多数计算完成的步骤。
重复步骤2到4,直到值X0.
足以满足容忍度。
迭代方法在他们如何更新的幅度和方向的不同之处X0.
在步骤4中,有些在步骤2和3中具有略微不同的收敛标准,但这捕获了所有迭代求解器遵循的基本过程。
MATLAB有几种功能,可以实现线性方程系统的迭代方法。这些方法旨在解决A.X.=B.或最小化常态||B.-A.X.||。这些方法中的几种具有相似之处,并且基于相同的底层算法,但是每个算法在某些情况下都有益处[1]那[2]。
描述 |
注意事项 |
---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Matlab中的迭代求解器的这种流程图给出了每个求解器有用的情况的粗略概念。你通常可以使用GMRES.
几乎所有广场,非对称问题。Biconjugate梯度算法有一些情况(BICG.
那Bicgstab.
那CGS.
等等)比效率更高GMRES.
,但他们不可预测的收敛行为通常会产生GMRES.
更好的初始选择。
迭代方法的收敛速率取决于系数矩阵的光谱(特征值)。因此,您可以通过将线性系统转换为具有更有利的频谱(聚类特征值或附近的条件号)来改善大多数迭代方法的收敛性和稳定性。通过应用第二个矩阵来执行该转换,称为a预处理器,系统。该过程转换了线性系统
进入等同的系统
理想的预处理器转换系数矩阵A.进入身份矩阵,由于任何迭代方法将与这种预处理器的一次迭代收敛。在实践中,找到一个好的预处理者需要权衡。转换以三种方式之一执行:左侧预处理,右预处理或分割预处理。
第一个案例被称为离开预处理由于预处理器矩阵m出现在左边A.:
这些迭代求解器使用左侧预处理:
in.右预处理那m出现在右边A.:
这些迭代求解器使用右预处理:
最后,对于对称系数矩阵A.
那分裂预处理确保转换系统仍然对称。预处理器
拆分,因素出现在不同的两侧A.:
拆分后台系统的求解器算法基于上述等式,但实际上没有必要计算H.。求解器算法乘以和解决m
直接。
这些迭代求解器使用分裂预处理:
在所有情况下,预处理器m选择加速迭代方法的收敛。当迭代解决方案的剩余错误停止或在迭代之间进行了很少的进展时,通常意味着您需要生成一个预处理器矩阵以结合到问题中。
MATLAB中的迭代求解器允许您指定单个预处理器矩阵m或两个预处理器矩阵因子,使其如此m=m1m2。这使得简单地以其分解形式指定预处理器,例如m=L.你。请注意,在拆分预处理情况下,在哪里m=H.H.T.也持有,没有关系M1
和M2
投入和意见H.因素。
在某些情况下,预处理者在给定问题的数学模型中自然发生。在没有自然的预处理器的情况下,您可以使用该表中的一个不完整的分解构件之一来生成预处理器矩阵。不完全的因子基本上是不完整的直接解决,即快速计算。
看不完全的因素有关的更多信息ilu
和ichol.
。
将五点有限差分近似为LAPPALL在正方形,二维域上的等式。以下命令用预处理器使用预处理的共轭梯度(PCG)方法m = l * l'
,在哪里L.
是零填充不完整的弦系因子A.
。对于这个系统,PCG.
在不指定前提条件矩阵的情况下无法找到解决方案。
a = delsq(numgrid(',250));b =α(大小(a,1),1);tol = 1e-3;maxit = 100;l = iChol(a);x = PCG(a,b,tol,maxit,l,l');
PCG在迭代92融合到具有相对残留的0.00076的溶液。
PCG.
需要92个迭代来实现指定的公差。但是,使用不同的预处理器可以产生更好的结果。例如,使用ichol.
构建修改后的不完整的Cholesky允许PCG.
仅在39次迭代后满足指定的公差。
l = iChol(a,struct('类型'那'nofill'那'michol'那'开'));x = PCG(a,b,tol,maxit,l,l');
PCG将迭代39收敛到具有相对残留的0.00098的溶液。
对于计算棘手的问题,您可能需要更好的预处理器而不是由生成的持续矛盾者ilu
或者ichol.
直接。例如,您可能希望生成更好的质量预处理器或最小化正在完成的计算量。在这些情况下,您可以使用平衡使系数矩阵更加对角占主导地位(这可能导致更好的质量预处理器)和重新排序为了最小化矩阵因子中的非安利斯数量(这可以降低内存要求,并可以提高后续计算的效率)。
如果使用平衡和重新排序以生成预处理器,则该过程是:
以下是一个使用平衡和重新排序以生成用于稀疏系数矩阵的预处理器的示例。
创建系数矩阵A.
和一个矢量B.
对于线性方程的右侧。计算条件号的估计A.
。
加载West0479.;A = West0479;b =α(大小(a,1),1);恩誉(a)
ans = 1.4244e + 12
使用平衡
改善系数矩阵的条件数。
[p,r,c] =平衡(a);自身= r * p * a * c;bnew = r * p * b;恩惠(重新)
ans = 5.1042e + 04
使用重新排序平衡矩阵解剖
。
q =解剖(重新);自述=重新(q,q);bnew = bnew(q);
使用不完整的LU分解生成预处理器。
[l,u] = ilu(重新);
解决线性系统GMRES.
使用预处理器矩阵,容忍1E-10
,50个最大外部迭代和30个内部迭代。
tol = 1e-10;maxit = 50;重启= 30;[Xnew,Flag,Relres] = GMRES(重新,BNew,Restart,Tol,Maxit,L,U);x(q)= xnew;x = c * x(:);
现在,比较雷
相对残留返回GMRES.
(包括预处理器)到没有预处理者的相对残差夺回
和无需平衡的相对残差res.
。结果表明,即使线性系统都是等效的,不同的方法也适用于每个元素的不同权重,这可以显着影响残差的值。
RERRES RESNEW = NORM(简单* XNEW - BNEW)/ NORM(BNEW)RES = NOM(a * x - b)/ norm(b)
Relres = 8.7537E-11 Resnew = 3.6805E-08 Res = 5.1415e-04
Matlab中的迭代溶剂不会要求您提供了一个数字矩阵A.
。由于求解器执行的计算使用矩阵矢量乘法的结果a * x.
或者A'* x
,您可以改为提供一个计算这些线性操作结果的函数。计算这些数量的函数通常被称为a线性运营商。
除了使用线性运算符而不是系数矩阵A.
,您还可以使用线性运算符而不是预处理程序的矩阵m
。在这种情况下,该功能需要计算m \ x.
或者m'\ x
,如解决方案的参考页面所示。
使用线性运算符使您能够利用模式A.
或者m
为了更有效地计算线性操作的值,而不是如果求解器明确地使用矩阵来执行完整的矩阵矢量乘法。这也意味着您不需要存储系数或预处理器矩阵的存储器,因为线性操作员通常计算矩阵矢量乘法的结果而不形成矩阵。
例如,考虑系数矩阵
a = [2 -1 0 0 0 0;-1 2 -1 0 0 0;0 -1 2 -1 0 0;0 0 -1 2 -1 0;0 0 0 -1 2 -1;0 0 0 0 -1 2];
什么时候A.
乘以向量,得到的矢量中的大多数元素是零。结果中的非零元素对应于非零三角形元素A.
。所以,对于给定的向量X.
,线性操作员功能只需添加三个向量来计算值a * x.
:
函数y = linearoperatora(x)y = -1 * [0;x(1:end-1)] ... + 2 * x ... + -1 * [x(2:结束);0];结束
大多数迭代求解器需要线性操作员功能A.
返回价值a * x.
。同样,对于前提者矩阵m
,该功能一般必须计算m \ x.
。对于求解器LSQR.
那QMR.
,和BICG.
,线性操作员功能也必须返回值A'* x
或者m'\ x
当请求时。有关线性操作员功能的示例和描述,请参阅迭代求解器参考页面。
[1] Barrett,R.,M. Berry,T. F. Chan等人,用于线性系统解决方案的模板:用于迭代方法的构建块,暹罗,费城,1994年。
[2] Saad,Yousef,稀疏线性方程的迭代方法。PWS出版公司,1996年。