技术计算中最重要的问题之一是联立线性方程组的解。
在矩阵表示法中,一般问题采用以下形式:给定两个矩阵一种和B.,是否存在一个唯一的矩阵X, 以便一种X=B.要么X一种=B.还是
考虑一个逐个一个例子是有益的。例如,等式
7.X= 21.
有一个独特的解决方案?
当然,答案是肯定的。等式具有唯一的解决方案X= 3.通过划分容易获得解决方案:
X= 21/7 = 3。
解决方案是不通过计算7的逆,即71= 0.142857 ...,然后乘以71由21。这将是更多的工作,如果71表示为有限数量的数字,不太准确。类似的考虑适用于具有多个未知的线性方程组;马铃薯®解决这些等式而不计算矩阵的倒数。
虽然它不是标准的数学符号,但MATLAB使用标量案例熟悉的句术语来描述同时方程的一般系统的解决方案。两分行符号,削减, /, 和反斜杠,\,对应于两个MATLAB函数Mrdivide.
和mldivide
.这些算子用于未知矩阵出现在系数矩阵的左侧或右侧的两种情况:
|
为矩阵方程的解xA=B.,使用 |
|
为矩阵方程的解斧头=B.,使用 |
想想“分开”等式的两侧斧头=B.要么xA=B.经过一种.系数矩阵一种
总是在“分母”中。
维度兼容性条件x = A \ b
要求两个矩阵一种
和B.
拥有相同数量的行。解决方案X
然后具有与相同数量的列B.
它的行维数等于的列维数一种
.为了x = b / a
,行和列的角色互换。
在实践中,线性方程的形式斧头=B.比表格更频繁地发生xA=B..因此,反斜杠比斜杠使用得更频繁。本节的其余部分集中讨论反斜杠操作符;从标识可以推断出斜杠操作符的相应属性:
(b / a)'=('\ b')。
系数矩阵一种
不需要是正方形。如果一种
有规模m-经过-N,然后有三种情况:
m = n |
方形系统。寻求确切的解决方案。 |
M> N. |
超定系统,方程比未知数多。求最小二乘解。 |
M |
未确定的系统,方程较少而不是未知数。找到最多的基本解决方案m非零组件。 |
这mldivide
操作员采用不同的求解器来处理不同种类的系数矩阵。通过检查系数矩阵自动诊断各种情况。有关更多信息,请参阅“算法”部分mldivide
参考页面。
线性方程系统的一般解决方案斧头=B.描述所有可能的解决方案。万博 尤文图斯你可以通过以下方法找到通解:
解决相应的均匀系统斧头=0..使用这件事无效的
命令键入null(a)
.这将返回解决方案空间的基础斧头=0..任何解决方案都是基础向量的线性组合。
找到非均匀系统的特定解决方案斧头=B..
然后你可以写下任何解决方案斧头=B.作为特定解决方案的总和斧头=B.,从步骤2,加上步骤1的基载体的线性组合。
本节的其余部分描述了如何使用MATLAB找到一个特解斧头=B.如步骤2所示。
最常见的情况涉及方形系数矩阵一种
和一个右手侧栏矢量B.
.
如果是矩阵一种
是非奇异的,那么解,x = A \ b
,大小相同B.
.例如:
a = pascal(3);u = [3;1;4];x = a \ u x = 10 -12 5
它可以证实斧头
完全等于你
.
如果一种
和B.
是广场和相同的大小,x = a \ b
也是大小:
b =魔法(3);X = A \ b X = 19 13 6 0 6 3 1 -17 4
它可以证实斧头
完全等于B.
.
这两个例子都具有精确的整数解决方案。万博 尤文图斯这是因为选择了系数矩阵帕斯卡(3)
,是一个满秩矩阵(非奇异)。
一个方阵一种如果它没有线性独立列,则是单数。如果一种是单数,解是斧头=B.要么不存在,要么不是唯一的。反斜杠运算符,A \ B.
如果存在警告一种
几乎是奇异的,或者它检测到精确的奇点。
如果一种是单数,斧头=B.有一个解决方案,你可以找到一个特殊的解决方案,不是唯一的,通过键入
p = pinv(a)* b
pinv (A)
是一个伪一种.如果斧头=B.那么没有完整的解决方案pinv (A)
返回最小二乘解。
例如:
A = [1 3 7 -1 4 4 11 10 18]
是否为单数,可以通过键入来验证
等级(a)ans = 2
自从一种不是完整的等级,它有一些等于零的奇异值。
确切的解决方万博 尤文图斯案。为了B = [5; 2; 12]
,等式斧头=B.有精确解吗
PINV(a)* b ans = 0.3850 -0.1103 0.7066
验证PINV(a)* b
通过打字是一个完全的解决方案
a * pinv(a)* b ans = 5.0000 2.0000 12.0000
最小二乘解。万博 尤文图斯但是,如果b =[3、6 0]
那斧头=B.没有一个精确的解。在这种情况下,PINV(a)* b
返回最小二乘解。如果你键入
a * pinv(a)* b ans = -1.0000 4.0000 2.0000
你不会得到原来的向量B.
.
你可以确定斧头=B.通过查找增强矩阵的梯度形式,通过查找梯度的梯度形式具有精确的解决方案[b]
.为此示例执行此操作,请输入
rref([A b]) ans = 1.0000 0 2.2857 00 1.0000 1.5714 000 1.0000
因为下面一行除了最后一项以外都是零,所以这个方程没有解。在这种情况下,pinv (A)
返回最小二乘解。
该示例显示了如何在适用于实验数据的各种曲线中遇到过多确定的系统。
一个量y
以几个不同的时间值测量T.
产生以下观察。您可以输入数据并在具有以下语句的表中查看它。
T = [0 .3 .8 1.1 1.6 2.3]';y =[。82 .72 .63 .60 .55 .50]';表(t, B = 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
应该用另外两个向量的线性组合近似。一个是包含所有的常数矢量,另一个是与组件的矢量EXP(-T)
.未知的系数,
和
,可以通过执行最小二乘拟合来计算,这最小化了来自模型的数据的偏差的平方和。两个未知数中有六个方程,由6×2矩阵表示。
e = [of(size(t))exp(-t)]
E =6×21.0000 1.0000 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 = [(大小(t))exp(-t)] * c;绘图(t,y,' - ',t,y,'o')
E * C.
并不是等于y
,但差异很可能小于原始数据中的测量误差。
一个矩形矩阵一种
排名缺乏,如果它没有线性独立列。如果一种
是排名缺陷,那么最小二乘解斧= B.
并不是唯一的。一个\ B
如果是发出警告一种
排名缺陷并产生最小二乘解。您可以使用lsqminnorm.
找到解决方案X
这具有所有解决方案中的最低规范。万博 尤文图斯
此示例显示了如何解决未确定系统的解决方案不是唯一的。未确定的线性系统涉及比等式更多的未知数。Matlab中的矩阵左划分操作发现了一个最多的基本最小二乘解m
非零组件m
-经过-N
系数矩阵。
这是一个小,随机的例子:
r = [6 8 7 3;3 5 4 1] RNG(0);b = randi(8,2,1)
R = 6 7 8 3 3 5 4 1 b = 7 8
线性系统RP = B.
涉及四个未知数的两个方程。由于系数矩阵包含小整数,因此使用的是适当的格式
命令以合理格式显示解决方案。使用特定的解决方案
格式鼠p = r \ b
P = 0 17/7 0 -29/7
其中一个非零组件是P(2)
因为r(:,2)
是栏目R.
规范最大。其他非零组件是P(4)
因为r(:,4)
之后占主导地位r(:,2)
被淘汰了。
可以通过添加来表征到未确定系统的完整通用解决方案P.
对于空空格向量的任意线性组合,可以使用它使用的空间向量无效的
功能与选择要求一个合理的基础。
Z = null (R,'r')
Z = -1/2 -7/6 -1/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分解,您需要解决两个线性系统来解决原始系统斧= B.:
[l,u] = lu(a);x = u \(l \ b);
相反,使用多个连续右侧求解线性系统的推荐方法是使用分解
对象。这些对象使您能够利用预计算矩阵分解的性能优势,但是它们不要需要了解如何使用矩阵因子。您可以用以下方式替换以前的LU分解:
dA =分解(,'鲁');x = da \ b;
如果您不确定使用哪个分解,分解(a)
根据属性选择正确的类型一种
,类似于反斜杠的表现。
下面是对这种方法可能带来的性能好处的一个简单测试。该测试使用反斜杠(\)和解决相同的稀疏线性系统100次分解
.
n = 1e3;a = sprand(n,n,0.2)+ speye(n);b = =(n,1);%反斜杠的解决方案Tic.为了k = 1:100 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.