lsqminnorm
线性方程的最小范数最小二乘解
说明
示例
求解具有无限个解的线性系统
使用反斜杠 (\
) 和 lsqminnorm
求解具有无限多个解的线性系统。使用解的 2-范数比较结果。
当 有无限多个解时,每个解都会使 最小化。反斜杠命令 (\
) 也可以计算出一个这样的解,但此解通常不会使 最小化。lsqminnorm
计算出的解不仅会使 norm(A*x-b)
最小,还会使 norm(x)
最小。
假设有一个简单的线性系统 ,其中包含一个方程和两个未知数。该方程组是欠定方程组,因为方程的个数少于未知数的个数。使用反斜杠和 lsqminnorm
求解该方程。
A = [2 3]; b = 8; x_a = A\b
x_a = 2×1
0
2.6667
x_b = lsqminnorm(A,b)
x_b = 2×1
1.2308
1.8462
两种方法得出不同的解,因为反斜杠只是要使 norm(A*x-b)
最小化,而 lsqminnorm
还要使 norm(x)
最小化。计算这些范数并将结果记录在表中,以便于比较。
s1 = {'Backslash'; 'lsqminnorm'}; s2 = {'norm_Ax_minus_b','norm_x'}; T = table([norm(A*x_a-b); norm(A*x_b-b)],[norm(x_a); norm(x_b)],'RowNames',s1,'VariableNames',s2)
T=2×2 table
norm_Ax_minus_b norm_x
_______________ ______
Backslash 0 2.6667
lsqminnorm 8.8818e-16 2.2188
下图说明了这种情况,并显示每个方法返回的解。蓝线表示方程 的无限多个解。橙色圆圈表示从原点到解线的最小距离,lsqminnorm
返回的解刚好在这条线与圆圈之间的切点上,指示它是离原点最近的解。
指定容差以减少含噪数据的影响
说明如何在 lsqminnorm
中指定用于计算秩的容差,才能有助于定义问题的范围,以使随机噪声不会破坏解。
创建秩为 5 的低秩矩阵和右侧向量 b
。
rng default % for reproducibility U = randn(200,5); V = randn(100,5); A = U*V'; b = U*randn(5,1) + 1e-4*randn(200,1);
使用 lsqminnorm
求解线性系统 。计算 A*x-b
和 x
的范数,以检查解的质量。
x = lsqminnorm(A,b); norm(A*x-b)
ans = 0.0014
norm(x)
ans = 0.1741
现在,在矩阵 A
中添加少量噪声,然后再次求解线性系统。噪声对线性系统的解向量 x
的影响不成比例。
Anoise = A + 1e-12*randn(200,100); xnoise = lsqminnorm(Anoise,b); norm(Anoise*xnoise - b)
ans = 0.0010
norm(xnoise)
ans = 1.1214e+08
解之间的巨大差异是因为噪声影响 A
的低秩逼近。换句话说,lsqminnorm
认为在 A
的 QR 分解中,位于 R
矩阵对角线上的小值很重要,而实际上这些值并没有那么重要。理想情况下,R
对角线上的这些小值应视为零。
绘制 Anoise
的 QR 分解中 R
矩阵的对角线元素。有大量对角线元素位于阶次 1e-10 处。
[Q,R,p] = qr(Anoise,0);
semilogy(abs(diag(R)),'o')
此问题的解决方案是增大 lsqminnorm
使用的容差,以便在计算中使用误差小于 1e-8 的 Anoise
低秩逼近。这样将使噪声对结果的影响大大减小。使用容差的解非常接近原来的解 x
。
xnoise = lsqminnorm(Anoise, b, 1e-8); norm(Anoise*xnoise - b)
ans = 0.0014
norm(xnoise)
ans = 0.1741
norm(x - xnoise)
ans = 1.0778e-14
切换显示低秩矩阵警告
在打开警告的情况下求解涉及低秩系数矩阵的线性系统。
创建一个秩为 2 的 3×3 矩阵。在此矩阵中,可以通过将前两列相加得出第三列。
A = [1 2 3; 4 5 9; 6 7 13]
A = 3×3
1 2 3
4 5 9
6 7 13
求问题 的最小范数最小二乘解,其中 等于 中的第二列。为 lsqminnorm
指定 'warn'
标志,以便在检测到 A
为低秩时显示警告。
b = A(:,2);
x = lsqminnorm(A,b,'warn')
Warning: Rank deficient, rank = 2, tol = 1.072041e-14.
x = 3×1
-0.3333
0.6667
0.3333
输入参数
A
— 系数矩阵
矩阵
系数矩阵。系数矩阵显示在线性系统的左侧,如 Ax = B。系数矩阵可以是满矩阵或稀疏矩阵。
数据类型: single
| double
复数支持: 是
B
— 输入数组
向量 | 矩阵
输入数组,指定为向量或矩阵。B
显示在线性系统的右侧,如 Ax = B。如果 B
是矩阵,则矩阵中的每一列代表右侧一个不同的向量。
数据类型: single
| double
复数支持: 是
tol
— 秩容差
非负标量
秩容差,指定为非负标量。指定容差有助于减少系数矩阵中随机噪声对解的干扰。默认情况下,lsqminnorm
基于 A
的 QR 分解来计算 tol
。
lsqminnorm
将 A
的秩计算为 QR 分解 [Q,R,p] = qr(A,0)
的 R
矩阵中的对角线元素数,绝对值大于 tol
。如果 A
的秩是 k
,则函数通过将 Q
的前 k
列乘以 R
的前 k
行来形成 A
的低秩逼近。更改容差会影响 A
的低秩逼近。
示例: X = lsqminnorm(A,B,1e-2)
数据类型: double
rankWarn
— 切换显示低秩矩阵警告
'nowarn'
(默认) | 'warn'
切换显示低秩矩阵警告,指定为 'nowarn'
或 'warn'
。指定 'warn'
将指示 lsqminnorm
在系数矩阵 A
秩亏时生成警告。
示例: X = lsqminnorm(A,B,'warn')
提示
当有多个解时,
lsqminnorm
计算的最小范数解具有特别的意义。只要A
欠定(行数少于列数)或低秩,方程 Ax = b 就有多个解。在计算线性系统的最小范数最小二乘解时,
lsqminnorm(A,B,tol)
的效率通常高于pinv(A,tol)*B
。lsqminnorm
使用完全正交分解 (COD) 来计算A
的低秩逼近,而pinv
使用的是奇异值分解 (SVD)。因此,pinv
和lsqminnorm
的结果不完全一致。对于稀疏矩阵,
lsqminnorm
使用与稠密矩阵不同的算法,因此会产生不同的结果。
扩展功能
C/C++ 代码生成
使用 MATLAB® Coder™ 生成 C 代码和 C++ 代码。
用法说明和限制:
代码生成不支持对此函数使用稀疏矩阵输入。
基于线程的环境
使用 MATLAB® backgroundPool
在后台运行代码或使用 Parallel Computing Toolbox™ ThreadPool
加快代码运行速度。
此函数完全支持基于线程的环境。有关详细信息,请参阅在基于线程的环境中运行 MATLAB 函数。
版本历史记录
在 R2017b 中推出
MATLAB 命令
您点击的链接对应于以下 MATLAB 命令:
请在 MATLAB 命令行窗口中直接输入以执行命令。Web 浏览器不支持 MATLAB 命令。
Select a Web Site
Choose a web site to get translated content where available and see local events and offers. Based on your location, we recommend that you select: .
You can also select a web site from the following list:
How to Get Best Site Performance
Select the China site (in Chinese or English) for best site performance. Other MathWorks country sites are not optimized for visits from your location.
Americas
- América Latina (Español)
- Canada (English)
- United States (English)
Europe
- Belgium (English)
- Denmark (English)
- Deutschland (Deutsch)
- España (Español)
- Finland (English)
- France (Français)
- Ireland (English)
- Italia (Italiano)
- Luxembourg (English)
- Netherlands (English)
- Norway (English)
- Österreich (Deutsch)
- Portugal (English)
- Sweden (English)
- Switzerland
- United Kingdom (English)