联立线性方程组的求解是技术计算中最重要的问题之一。
在矩阵表示法中,一般问题的形式如下:给定两个矩阵一个而且b,是否存在唯一矩阵x,因此一个x=b或x一个=b?
考虑一个1 × 1的例子是有指导意义的。例如,这个方程
7x= 21
有唯一解吗?
答案当然是肯定的。这个方程有唯一解x= 3。解很容易通过除法得到:
x= 21/7 = 3。
解决方案是不通常通过计算7的倒数得到,也就是71= 0.142857……,then multiplying 71由21。这将是更多的工作,如果71表示为有限数量的数字,精度较低。类似的考虑也适用于具有多个未知数的线性方程组;MATLAB®不用计算矩阵的逆就能解出这样的方程。
尽管它不是标准的数学符号,MATLAB使用标量情况中熟悉的除法术语来描述一般联立方程组的解。这两个除法符号,削减, /,和反斜杠, \对应两个MATLAB函数mrdivide
而且mldivide
.这些算子用于两种情况,未知矩阵出现在系数矩阵的左边或右边:
|
表示矩阵方程的解xA=b,使用 |
|
表示矩阵方程的解斧头=b,使用 |
想象一下等式两边的“除”斧头=b或xA=b通过一个.系数矩阵一个
总是在分母上。
的尺寸兼容条件x = A\b
需要两个矩阵一个
而且b
要有相同的行数。解决方案x
则有相同的列数b
它的行维数等于的列维数一个
.为x = b/A
,行和列的角色互换。
在实践中,线性方程的形式斧头=b发生的频率比形式的更频繁xA=b.因此,反斜杠的使用频率远高于斜杠。本节的其余部分集中讨论反斜杠操作符;斜杠操作符的相应属性可以从标识符中推断出来:
(b/A)' = (A'\b')。
系数矩阵一个
不必是方形的。如果一个
有大小米——- - - - - -n,那么有三种情况:
M = n |
广场系统。求精确解。 |
M > n |
超定系统,方程多于未知数。求最小二乘解。 |
M < n |
欠定系统,方程比未知数少。找到一个最基本的解米非零组件。 |
的mldivide
算子使用不同的求解器来处理不同类型的系数矩阵。通过检查系数矩阵,可以自动诊断各种病例。有关更多信息,请参阅的“算法”部分mldivide
参考页面。
线性方程组的通解斧头=b描述所有可能的解决方案。万博 尤文图斯你可以通过以下方法找到通解:
求解相应的齐次方程组斧头=0.使用零
命令,通过键入零(A)
.这将返回解空间的基斧头=0.任何解都是基向量的线性组合。
求非齐次方程组的特解斧头=b.
你可以写出任意的解斧头=b作为特解的和斧头=b,加上第一步中的基向量的线性组合。
本节其余部分介绍如何用MATLAB求特解斧头=b,如步骤2所示。
最常见的情况涉及到平方系数矩阵一个
和一个右边的列向量b
.
如果矩阵一个
非奇异的,那么解,x = A\b
的大小和b
.例如:
A = pascal(3);U = [3;1;4);x = A\u x = 10 -12
这是可以证实的* x
正好等于u
.
如果一个
而且b
都是正方形,大小相同,x = A \ b
也是这个尺寸:
B =魔术(3);X = A\b X = 19 -3 -1 -17 4 13 6 0 -6
这是可以证实的* x
正好等于b
.
这两个例子都有精确的整数解。万博 尤文图斯这是因为系数矩阵被选择为帕斯卡(3)
,它是一个全秩矩阵(非奇异)。
一个方阵一个如果它没有线性无关的列,它就是奇异的。如果一个是奇异的,解是斧头=b要么不存在,要么不是唯一的。反斜杠运算符,一个\ b
,如果一个
是否接近奇异,或者是否检测到精确的奇点。
如果一个是单数斧头=b有一个解,你可以找到一个不是唯一的特解,输入
P = pinv(A)*b
pinv (A)
的伪逆是一个.如果斧头=b没有精确的解吗pinv (A)
返回最小二乘解。
例如:
A = [1 3 7 -1 4 4 1 10 18]
是否为单数,您可以输入
rank(A) ans = 2
自一个不是满秩,它有一些奇异值等于零。
确切的解决方万博 尤文图斯案。为b = (5; 2; 12)
,方程斧头=b有精确解吗
pinv(A)*b ans = 0.3850 -0.1103 0.7066
验证pinv b (A) *
输入是精确解吗
A*pinv(A)*b ans = 5.0000 2.0000 12.0000
最小二乘解。万博 尤文图斯然而,如果B = [3;6;0]
,斧头=b没有精确的解。在这种情况下,pinv b (A) *
返回最小二乘解。如果你打字
A*pinv(A)*b ans = -1.0000 4.0000 2.000
你不会得到原来的向量b
.
你可以确定是否斧头=b通过求增广矩阵的行简化阶梯形有精确解吗[b]
.在本例中,输入
rref([A b]) ans = 1.0000 2.2857 00 1.000 1.5714 0000 0 1.000
因为底行除了最后一项外都是0,所以方程没有解。在这种情况下,pinv (A)
返回最小二乘解。
这个例子说明了在各种实验数据的曲线拟合中如何经常遇到过定系统。
一个数量,y
,是在几个不同的时间值下测量的,t
,得出以下结论。您可以输入数据,并使用以下语句在表中查看数据。
T = [0 .3 .8 1.1 1.6 2.3]';Y = [.]82 .72 .63 .60 .55 .50]';B = table(t,y)
B =6×2表T y ___ ____ 0 0.82 0.3 0.72 0.8 0.63 1.1 0.6 1.6 0.55 2.3 0.5
尝试用衰减指数函数对数据建模
.
前面的等式说向量y
应该近似为另外两个向量的线性组合。一个是包含所有1的常数向量,另一个是有分量的向量exp (- t)
.未知系数,而且,可以通过进行最小二乘拟合来计算,该拟合将模型中数据偏差的平方和最小化。两个未知数中有六个方程,用一个6 × 2矩阵表示。
E = [ones(size(t)) exp(-t)]
E =6×21.000 1.000 1.0000 0.7408 1.0000 0.4493 1.0000 0.3329 1.0000 0.2019 1.0000 0.1003
使用反斜杠运算符得到最小二乘解。
c = E\y
c =2×10.4760 - 0.3413
换句话说,与数据拟合的最小二乘是
下面的语句以有规律间隔的增量计算模型t
,然后将结果与原始数据作图:
T = (0:0.1:2.5)';Y = [ones(size(T)) exp(-T)]*c;情节(T Y“- - -”、t、y,“o”)
E * c
不完全等于y
,但差异很可能小于原始数据中的测量误差。
一个矩形矩阵一个
如果它没有线性无关的列,则为秩亏。如果一个
秩是亏的,那么最小二乘解是Ax = b
不是唯一的。一个\ B
发出警告,如果一个
秩不足,产生最小二乘解。你可以用lsqminnorm
寻找解决方案X
它在所有解中具有最小范数。万博 尤文图斯
这个例子说明了欠定系统的解是如何不唯一的。欠定线性系统比方程包含更多的未知数。在MATLAB中,矩阵左除法运算得到一个基本的最小二乘解,该解具有最多的最小二乘解米
an的非零分量米
——- - - - - -n
系数矩阵。
下面是一个随机的小例子:
R = [6 8 7 3;1] rng(0);B = randi(8,2,1)
R = 6 8 7 3 3 5 4 1 b = 7 8
线性系统Rp = b
包含两个方程,四个未知数。由于系数矩阵包含小整数,因此使用格式
命令以合理的格式显示解。得到特解
格式老鼠p = R\b
P = 0 17/7 0 -29/7
其中一个非零分量是(2页)
因为R (: 2)
的列R
最大范数。另一个非零分量是(4页)
因为R (: 4)
后占主导地位R (: 2)
就被消除了。
欠定系统的完整通解可以用加来表征p
到零空间向量的任意线性组合,它可以用零
功能与选项要求一个合理的基础。
Z = null(R,“r”)
Z = -1/2 -7/6 -1/2 /2 1 0 0 1
这是可以证实的R * Z
这是零和余数吗R*x - b
对任何向量都是小的x
,在那里
x = p + Z*q
因为Z
零空间向量是乘积吗Z *问
是这些向量的线性组合:
为了说明这一点,请选择任意一个问
和构建x
.
Q = [-2;1);x = p + Z*q;
计算残差的范数。
格式短范数(R*x - b)
Ans = 2.6645e-15
当有无穷多个解时,具有最小范数的解特别有意万博 尤文图斯义。你可以用lsqminnorm
求最小范数最小二乘解。这个解的值最小常模(p)
.
p = lsqminnorm(R,b)
P = -207/137 365/137 79/137 -424/137
有些问题与求解具有相同系数矩阵的线性系统有关一个
,但右手边不同b
.的不同值时b
都是同时可用的,你可以构造吗b
作为一个有几列的矩阵,同时用一个反斜杠命令求解所有方程组:X = A\[b1 b2 b3…]
.
然而,有时不同的价值观b
并不是所有的都在同一时间可用,这意味着你需要连续求解几个方程组。当您使用斜杠(/)或反斜杠(\)求解其中一个方程组时,运算符对系数矩阵进行因式分解一个
然后用这个矩阵分解来计算解。然而,每次你解一个类似的方程组,有一个不同的b
,算符计算相同的分解一个
,这是一个冗余的计算。
这个问题的解决方法是预先计算的分解一个
,然后再利用因子求解的不同值b
.然而,在实践中,以这种方式预计算分解可能很困难,因为您需要知道要计算哪种分解(LU、LDL、Cholesky等等),以及如何将这些因素相乘以解决问题。例如,使用LU分解,你需要解决两个线性系统来解决原始系统Ax = b:
[L,U] = lu(A);x = U \ (L \ b);
相反,对于解有几个连续右边的线性系统,推荐的方法是用分解
对象。这些对象使您能够利用预计算矩阵分解的性能优势,但是它们不需要知道如何使用矩阵因子。您可以将前面的LU分解替换为:
dA =分解(A,“陆”);x = dA\b;
如果您不确定要使用哪种分解,分解(一)
的属性选择正确的类型一个
,类似于反斜杠。
下面是对这种方法可能带来的性能好处的一个简单测试。该测试使用反斜杠(\)和解决相同的稀疏线性系统100次分解
.
N = 1e3;A = sprand(n,n,0.2) + speye(n);B = ones(n,1);反斜杠解决方案抽搐为x = A\b;结束toc
运行时间为9.006156秒。
%分解溶液tic dA =分解(A);为k = 1:100 x = dA\b;结束toc
运行时间为0.374347秒。
对于这个问题,分解
解决方案比单独使用反斜杠快得多,但语法仍然简单。
如果系数矩阵一个是大而稀疏的,因式分解方法一般效率不高。迭代的方法生成一系列近似解。万博 尤文图斯MATLAB提供了几种迭代方法来处理大型、稀疏的输入矩阵。
MATLAB支万博1manbetx持多线程计算一些线性代数和元素智能数值函数。这些函数在多个线程上自动执行。为了让一个函数或表达式在多个cpu上执行得更快,必须满足以下条件:
该函数执行的操作很容易划分为并发执行的部分。这些部分必须能够在进程之间很少通信的情况下执行。它们应该需要很少的连续操作。
数据量足够大,因此并发执行的任何优点都超过了划分数据和管理独立执行线程所需的时间。例如,大多数函数只有在数组包含数千个或更多元素时才会加速。
该操作不受内存限制;处理时间不受内存访问时间的支配。一般来说,复杂的函数比简单的函数更快。
发票
,lscov
,linsolve
,mldivide
当启用多线程时,在大型双精度数组(10,000个或更多元素的数量级)上显示速度的显著提高。
分解
|lsqminnorm
|mldivide
|mrdivide
|pinv