线性方程组
计算考虑
技术计算中最重要的问题之一是联立线性方程组的解。
在矩阵表示法中,一般问题采用以下形式:给定两个矩阵一个而且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
算子采用不同的求解器来处理不同类型的系数矩阵。通过检查系数矩阵,可以自动诊断各种病例。的“算法”一节了解更多信息mldivide
参考页面。
通解
线性方程组的通解斧头=b描述所有可能的解决方案。金宝搏官方网站你可以通过以下方法找到通解:
求解相应的齐次方程组斧头=0.使用
零
命令,通过键入零(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
这是可以证实的* 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
自一个不是满秩的,它有一些奇异值等于0。
确切的解决方金宝搏官方网站案。为b = (5; 2; 12)
,方程斧头=b有精确解吗
pinv(A)* bans = 0.3850 -0.1103 0.7066
验证pinv b (A) *
打字是一个精确的解决方案吗
A*pinv(A)* bans = 5.0000 2.0000 12.0000
最小二乘解。金宝搏官方网站然而,如果B = [3;6;0]
,斧头=b没有精确的解。在这种情况下,pinv b (A) *
返回最小二乘解。如果你输入
A*pinv(A)* bans = -1.0000 4.0000 2.0000
你不会得到原来的向量b
.
你可以判断是否斧头=b通过求增广矩阵的行简化阶梯形有精确解吗[b]
.在本例中,输入
rref([A b]) ans = 1.0000 0 2.2857 00 1.0000 1.5714 0000 0 1.0000
由于底行除了最后一项以外都是零,所以方程没有解。在这种情况下,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
应该用另外两个向量的线性组合来近似。一个是包含所有向量的常数向量,另一个是含有分量的向量exp (- t)
.未知系数,
而且
,可以通过进行最小二乘拟合来计算,最小二乘拟合使数据与模型偏差的平方和最小化。两个未知数中有六个方程,用一个6 × 2矩阵表示。
E = [ones(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 = [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;3 5 4 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);%反斜杠解决方案抽搐为k = 1:100 x = A\b;结束toc
运行时间为9.006156秒。
%分解溶液tic dA =分解(A);为k = 1:100 x = dA\b;结束toc
运行时间为0.374347秒。
对于这个问题,分解
解决方案比单独使用反斜杠快得多,但语法仍然简单。
迭代的方法
如果系数矩阵一个是大而稀疏,分解方法一般效率不高。迭代的方法生成一系列近似解。金宝搏官方网站MATLAB提供了几种迭代方法来处理大型稀疏输入矩阵。
多线程计算
MATLAB支金宝app持许多线性代数和元素数值函数的多线程计算。这些函数自动在多个线程上执行。为了让函数或表达式在多个cpu上更快地执行,必须满足以下几个条件:
该函数执行的操作很容易划分为并发执行的段。这些部分必须能够在进程之间很少通信的情况下执行。它们应该需要很少的连续操作。
数据大小足够大,因此并发执行的任何优点都超过了对数据进行分区和管理单独执行线程所需的时间。例如,大多数函数只有在数组包含数千个或更多元素时才会加速。
该操作不受内存限制;处理时间不受内存访问时间的支配。一般来说,复杂函数比简单函数更快。
发票
,lscov
,linsolve
,mldivide
在启用多线程时,在大型双精度数组(大约10,000个元素或更多)上显示速度的显著提高。
另请参阅
mldivide
|mrdivide
|pinv
|分解
|lsqminnorm