MATLAB中linsolve函数用法

目录

语法

说明

​示例

线性系统求解

隐藏矩阵条件警告


linsolve函数的功能是对线性系统求解。

语法

cpp 复制代码
X = linsolve(A,B)
X = linsolve(A,B,opts)
[X,r] = 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 不会发出警告。

​示例

线性系统求解

使用 mldivide 和 linsolve 求解线性系统以比较性能。

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

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

cs 复制代码
A = tril(magic(1e4));
opts.LT = true;

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

cs 复制代码
b = ones(size(A,2),1);

使用 mldivide 求解线性系统 Ax=b,并对计算计时。

cs 复制代码
tic
x1 = A\b; 
t1 = toc
t1 = 0.0847

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

cs 复制代码
tic
x2 = linsolve(A,b,opts);
t2 = toc
t2 = 0.0188

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

cs 复制代码
speedup = t1/t2
speedup = 4.4970

隐藏矩阵条件警告

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

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

cpp 复制代码
A = hilb(20);

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

cpp 复制代码
b = ones(20,1);
x = linsolve(A,b);


Warning: Matrix is close to singular or badly scaled. Results may be inaccurate. RCOND =  5.628781e-20.

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

cs 复制代码
[x,r] = linsolve(A,b)
x = 20×1
109 ×

   -0.0000
    0.0000
   -0.0004
    0.0071
   -0.0592
    0.2819
   -0.7821
    1.1830
   -0.7030
   -0.1061
      ⋮

r = 5.6288e-20

提示

  • linsolve 的速度优势可能因矩阵结构和基本算法的相对优化而异。在某些情况下(例如使用小矩阵时),速度相比 mldivide 可能没有任何提高。linsolve 的速度优势在于它处理大型矩阵时不必花费大量时间检查其属性,或在于它相比 mldivide 选择了一种更适合输入的算法。
相关推荐
十年Java程序媛8 分钟前
JVM 基础与 GC 垃圾回收详解|可达性分析、分代模型、垃圾收集器、STW
java·开发语言·jvm·spring boot·后端·面试
估值探索者9 分钟前
【Python量化选股流水线 #03】候选股怎么排序?动量+低波+流动性三因子打分取 Top-N
开发语言·python·接口·api接口·股票数据接口·数据接口·股票数据api接口
骑士雄师10 分钟前
supervisor 中关于上下文多轮信息维护常用到的python语法
开发语言·python
机器学习之心16 分钟前
给地铁牵引系统做一次“体检“:灰色聚类 + 正态云模型的MATLAB完整实现
matlab·数据挖掘·聚类
青少儿编程课堂17 分钟前
蓝桥杯·全国青少年信息素养大赛·电子学会Python/C/C++考级:任意进制互转与大数多进制加法解析
c++·python·算法·bfs·信息学竞赛
曹牧19 分钟前
C#:字符串占位符与值数量不一致
开发语言·数据库·c#
迅猛龙办公室27 分钟前
Python函数实现反转一个只有3位数的整数
开发语言·前端·python
“AI国潮设计-小江”30 分钟前
《【AIGC实战】Python+SDXL批量生成“英歌舞树莓香草布丁”IP,附保持角色一致性的代码逻辑》
开发语言·人工智能·python·prompt·aigc
闻缺陷则喜何志丹35 分钟前
【C++特性及类库】多线程
开发语言·c++·多线程·语言特性·系统库
多弗朗皮卡丘36 分钟前
C++ 哈希(下)
c++·算法·哈希算法