Main Content

本页的翻译已过时。点击此处可查看最新英文版本。

linsolve

对线性方程组求解

说明

示例

X = linsolve(A,B) 使用以下方法之一求解线性方程组 AX = B

  • A方阵时,linsolve 使用 LU 分解和部分主元消去法。

  • 对于所有其他情况,linsolve 使用 QR 分解和列主元消去法。

如果 A 为病态(对于方阵)或秩亏(对于矩形矩阵),则 linsolve 发出警告。

示例

X = linsolve(A,B,opts) 使用由 options 结构体 opts 确定的合适的求解器。opts 中的字段是说明矩阵 A 的属性的逻辑值。例如,如果 A 是上三角矩阵,您可以设置 opts.UT = true 以使 linsolve 使用为上三角矩阵设计的求解器。linsolve 不再测试验证 A 是否具有 opts 中指定的属性。

示例

[X,r] = linsolve(___) 还返回 r,即 A 的条件数的倒数(对于方阵)或 A 的秩(对于矩形矩阵)。您可以使用上述语法中的任何输入参数组合。使用此语法时,如果 A 为病态或秩亏,linsolve 不会发出警告。

示例

全部折叠

使用 mldividelinsolve 求解线性方程组以比较性能。

mldivide 是在 MATLAB® 中求解大多数线性方程组的推荐方法。不过,该函数会对输入矩阵执行几项检查,以确定它是否具有任何特殊属性。如果您事先了解系数矩阵的属性,则可以使用 linsolve 来避免对大型矩阵进行耗时的检查。

创建一个 10000×10000 幻方矩阵,并提取下三角部分。将 opts 结构体的 LT 字段设置为 true 以指示 A 是下三角矩阵。

A = tril(magic(1e4));
opts.LT = true;

创建由 1 组成的向量作为线性方程 Ax=b 的右侧。Ab 中的行数必须相等。

b = ones(size(A,2),1);

使用 mldivide 求解线性方程组 Ax=b,并对计算计时。

tic
x1 = A\b; 
t1 = toc
t1 = 0.1195

现在,使用 linsolve 再次求解该方程组。指定 options 结构体,以便 linsolve 可以为下三角矩阵选择合适的求解器。

tic
x2 = linsolve(A,b,opts);
t2 = toc
t2 = 0.0469

比较执行时间,查看 linsolve 快了多少。与任何计时比较一样,不同计算机和不同版本的 MATLAB 产生的计时结果可能不同。

speedup = t1/t2
speedup = 2.5489

使用具有两个输出的 linsolve 求解线性方程组,以隐藏矩阵条件警告。

创建一个 20×20 Hilbert 测试矩阵。此矩阵接近奇异矩阵,最大奇异值比最小奇异值大 2e18 左右。

A = hilb(20);

使用 linsolve 求解涉及 A 的线性方程组。由于 A 接近奇异矩阵,linsolve 返回警告。

b = ones(20,1);
x = linsolve(A,b);
Warning: Matrix is close to singular or badly scaled. Results may be inaccurate. RCOND =  1.276108e-19.

现在,求解同一个线性方程组,但为 linsolve 指定两个输出。MATLAB® 隐藏警告,第二个输出 r 包含 A 的条件数倒数。您可以使用此语法处理代码中具有特殊情况的病态矩阵,而代码不会产生警告。

[x,r] = linsolve(A,b)
x = 20×1
108 ×

    0.0000
   -0.0000
    0.0008
   -0.0144
    0.1448
   -0.8567
    3.1338
   -7.1545
    9.9712
   -8.4571
      ⋮

r = 1.2761e-19

输入参数

全部折叠

系数矩阵。A 显示在线性方程组的左侧,如 AX = BA 中的行数必须等于 B 中的行数。

A 不能为稀疏矩阵。要求解涉及稀疏矩阵的线性方程组,请改用 mldividedecomposition

数据类型: single | double
复数支持:

输入数组,指定为向量或矩阵。B 显示在线性方程组的右侧,如 AX = B。如果 B 是矩阵,则矩阵中的每一列代表右侧一个不同的向量。

A 中的行数必须等于 B 中的行数。

数据类型: single | double
复数支持:

系数矩阵属性,指定为结构体。使用此结构体指定 A 的属性,linsolve 使用这些属性为线性方程组选择合适的求解器。结构体中的字段包含 true/false 值,以指示 A 是否具有各个属性。默认情况下,结构体中的所有字段都假定为 false。下表列出了 opts 中的可能字段及其对应的矩阵属性。

字段矩阵属性

LT

下三角矩阵(非零值仅出现在主对角线上或其下方)

UT

上三角矩阵(非零值仅出现在主对角线上或其上方)

UHESS

上 Hessenberg 矩阵(所有零值位于第一个次对角线下方)

SYM

实对称矩阵或复数 Hermitian 矩阵(矩阵等于其转置矩阵)

POSDEF

正定矩阵(所有特征值均为正值)

RECT

矩形矩阵(行数和列数不同)

TRANSA

共轭转置 - 指定函数是求解 A*X = B(当 opts.TRANSA = false 时)还是求解转置问题 A'*X = B(当 opts.TRANSA = true 时)

示例: opts.UT = true 指定 A 为上三角矩阵。

示例: opts.SYM = true, opts.POSDEF = true 设置两个字段,以指定 A 是对称正定矩阵。

有效组合

下表各行列出了 opts 中所有对 linsolve 有效的字段值组合。空单元格表示默认值 falsetrue/false 项表示 linsolve 接受两者中的任一值。

 

LT

UT

UHESS

SYM

POSDEF

RECT

TRANSA

A 是下三角矩阵

true

    

true/false

true/false

A 是上三角矩阵

 

true

   

true/false

true/false

A 是上 Hessenberg 矩阵

  

true

   

true/false

A 是对称矩阵

   

true

true/false

 

true/false

A 是矩形矩阵

     

true/false

true/false

用法说明

  • 如果 A 具有 opts 中的属性,则 linsolvemldivide 快,因为 linsolve 会立即调用合适的求解器,而不再执行任何测试以验证 A 是否具有指定的属性。

  • 如果 A 没有您在 opts 中指定的属性,则 linsolve 会返回不正确的结果并且不返回错误消息。因此,如果您不确定 A 是否具有指定的属性,请改用 mldividedecomposition

数据类型: struct

输出参数

全部折叠

线性方程组的解,返回为满足 AX = B(如果 opts.TRANSA = true,则满足 ATX = B)的向量或矩阵。X 的大小取决于是否满足 opts.TRANSA = true

  • 如果 Am×nBm×k,则 Xn×k 且是 AX = B 的解。

  • 如果 opts.TRANSA = true,则 Am×nBn×k。在本例中,Xm×k 且是 ATX = B 的解。

条件数倒数或秩,以标量形式返回。

  • 如果 A 是方阵,则 rA 的条件数倒数。

  • 如果 A 是矩形矩阵,则 rA 的秩。

  • 如果指定 opts,则 rA 的条件数倒数,除非 RECTtrue 并且 LTUT 均为 false,在这种情况下,r 给出 A 的秩。

提示

  • linsolve 的速度优势可能因矩阵结构和基本算法的相对优化而异。在某些情况下(例如使用小矩阵时),速度相比 mldivide 可能没有任何提高。linsolve 的速度优势在于它处理大型矩阵时不必花费大量时间检查其属性,或在于它相比 mldivide 选择了一种更适合输入的算法。

扩展功能

在 R2006a 之前推出