MATLAB中decomposition函数用法

目录

语法

说明

示例

求解多右端线性系统

选择分解类型

使用矩阵的三角部分

关闭矩阵条件警告


        decomposition函数的功能是求解线性系统的矩阵分解。

语法

dA = decomposition(A)
dA = decomposition(A,type)
dA = decomposition(A,type,triangularFlag)
dA = decomposition(___,Name,Value)

说明

        decomposition 创建可重用的矩阵分解(LU、LDL、Cholesky、QR 等),使您能够更高效地求解线性系统(Ax = b 或 xA = b)。例如,在计算 dA = decomposition(A) 后,调用 dA\b 会返回与 A\b 相同的向量,但通常要快得多。decomposition 对象非常适合计算需要重复解的问题,因为系数矩阵的分解不需要多次执行。

        可以将 decomposition 对象 dA 与许多同样适用于原始系数矩阵 A 的运算符结合使用:

  • 复共轭转置 dA'

  • 取反号 -dA

  • 使用 c*dA 或 dA/c 乘除标量。

  • 使用 x = dA\b 求解线性系统 Ax = b。

  • 使用 x = b/dA 求解线性系统 xA = b。

        dA = decomposition(A) 返回矩阵 A 的分解,可用于更高效地求解线性系统。基于输入矩阵的属性自动选择分解类型。

        dA = decomposition(A,type) 指定要进行的分解类型。type 可以是 'qr'、'cod'、'lu'、'ldl'、'chol'、'triangular'、'permutedTriangular'、'banded'、'hessenberg' 或 'diagonal'。

        dA = decomposition(A,type,triangularFlag) 指定在分解中仅使用 A 的上三角部分或下三角部分。triangularFlag 可以是 'upper' 或 'lower'。对于此语法,分解类型必须是 'ldl'、'chol' 或 'triangular'。

        dA = decomposition(___,Name,Value) 可使用上述任何语法,并使用一个或多个 Name,Value 对组参数指定其他选项。例如,dA = decomposition(A,'CheckCondition',false) 指定在对 dA\b 求解时,不根据 A 的条件发出警告。

示例

求解多右端线性系统

        说明使用 decomposition 对象可如何提高多右端方程 Ax=b 的求解效率。

        逆迭代是一种迭代特征值算法,可对多右端线性系统求解。该方法从相应特征向量的估计值开始,以迭代方式计算矩阵特征值。每次迭代先计算 x = A\x,然后按范数缩放 x。

创建稀疏矩阵 A 以及随机起始向量 x1 和 x2。

n = 1e3;
rng default % for reproducibility
A = sprandn(n,n,0.2) + speye(n);
x1 = randn(n,1);
x2 = x1;

        使用反斜杠应用逆迭代算法进行 100 次迭代,以计算 A 的特征值。

tic
for ii=1:100
    x1 = A \ x1;
    x1 = x1 / norm(x1);
end
toc
Elapsed time is 12.817421 seconds.
lambda = x1'*A*x1
lambda = -0.6707

        现在使用 decomposition 对象求解同一问题。

tic
dA = decomposition(A); 
for ii=1:100
    x2 = dA \ x2;
    x2 = x2 / norm(x2);
end
toc
Elapsed time is 1.134237 seconds.
lambda = x2'*A*x2
lambda = -0.6707

        由于矩阵 A 不需要在每次迭代期间进行分解,因此算法的性能大大提高。而且,虽然可以通过在 for 循环之前执行 A 的 LU 分解来改进反斜杠算法,但 decomposition 对象不需要您编写复杂的代码就能获得同样的性能增益。

选择分解类型

        选择一种分解类型,以覆盖基于输入矩阵自动选择的默认类型。创建一个系数矩阵,然后使用默认选择的分解类型来分解该矩阵。

A = ones(3);
dA = decomposition(A)
dA = 
  decomposition with properties:

    MatrixSize: [3 3]
          Type: 'lu'

  Show all properties

        求解以由 1 组成的向量为右端的线性系统。

b = ones(3,1);
x = dA\b
Warning: Matrix is singular to working precision.
x = 3×1

   NaN
   NaN
   NaN

        指定分解类型使用 'qr' 方法,而不是默认的 'ldl' 方法。这将强制反斜杠 (\) 求出问题的最小二乘解,而不是返回由 NaN 值组成的向量。

dA_qr = decomposition(A,'qr')
dA_qr = 
  decomposition with properties:

    MatrixSize: [3 3]
          Type: 'qr'

  Show all properties

x = dA_qr\b
Warning: Rank deficient, rank = 1, tol =  1.153778e-15.
x = 3×1

    1.0000
         0
         0

使用矩阵的三角部分

        指定 'upper',在分解中仅使用输入矩阵的上三角部分。

        创建一个系数矩阵。仅使用上三角部分构造矩阵的三角分解。在上三角矩阵和下三角矩阵存储在同一个矩阵中的情况下,此选项很有用。

A = randi([0 5],10)
A = 10×10

     4     0     3     4     2     1     4     5     2     0
     5     5     0     0     2     4     1     1     4     0
     0     5     5     1     4     3     3     4     3     3
     5     2     5     0     4     0     4     1     3     4
     3     4     4     0     1     0     5     5     5     5
     0     0     4     4     2     2     5     2     1     0
     1     2     4     4     2     5     3     1     4     3
     3     5     2     1     3     2     0     1     4     2
     5     4     3     5     4     3     0     3     2     0
     5     5     1     0     4     1     1     2     3     2

dA = decomposition(A,'triangular','upper')
dA = 
  decomposition with properties:

    MatrixSize: [10 10]
          Type: 'triangular'

  Show all properties

关闭矩阵条件警告

        在使用 decomposition 求解线性系统时,可以使用 'CheckCondition' 名称-值对组关闭基于系数矩阵条件的警告。

        创建一个病态系数矩阵。在此矩阵中,通过计算前两列的平均值得出第三列。

A = [1 2 1.5; 3 4 3.5; 5 6 5.5]
A = 3×3

    1.0000    2.0000    1.5000
    3.0000    4.0000    3.5000
    5.0000    6.0000    5.5000

        求解以由 1 组成的向量作为右端的线性系统 Ax=b。mldivide 生成与该系数矩阵的条件有关的警告。

b = ones(3,1);
x = A\b
Warning: Matrix is singular to working precision.
x = 3×1

   NaN
   Inf
  -Inf

        现在为该矩阵创建一个 decomposition 对象,然后求解同一线性系统。将 'CheckCondition' 指定为 false,这样 mldivide 将不检查系数矩阵的条件。虽然返回的解相同,但 mldivide 不显示警告消息。

dA = decomposition(A,'CheckCondition',false);
x = dA\b
x = 3×1

   NaN
   Inf
  -Inf

        使用 isIllConditioned 函数检查 decomposition 对象是否基于病态矩阵。

tf = isIllConditioned(dA)
tf = logical
   1

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值