为了求解线性方程组,我们通常需要一定的解法。其中一种解法就是通过矩阵的三角分解来实现的,属于求解线性方程组的直接法。在不考虑舍入误差下,直接法可以用有限的运算得到精确解,因此主要适用于求解中小型稠密的线性方程组。
(1)
三角分解法
三角分解法是将原正方
(square)
矩阵分解成一个上三角形矩阵
或是排列(permuted)
的上三角形矩阵和一个
下三角形矩阵,这样的分解法又称为LU分解法。它的用途主要在简化一个大矩阵的行列式值的计算过程,求
反矩阵,和求解联立方程组。不过要注意这种分解法所得到的上下三角形矩阵并非唯一,还可找到数个不同
的一对上下三角形矩阵,此两三角形矩阵相乘也会得到原矩阵。
MATLAB以lu函数来执行lu分解法,
其语法为[L,U]=lu(A)。
L是下三角矩阵:lower。U是上三角矩阵:Upper
(2)
QR分解法
QR分解法是将矩阵分解成一个正规正交矩阵与上三角形矩阵,所以称为QR分解法,与此正规正交矩阵的通用符号Q有关。
MATLAB以qr函数来执行QR分解法,
其语法为[Q,R]=qr(A)。
Q是正交矩阵,R是nn的上三角矩阵。
你的代码我帮你解释了,果然是个复杂的活,如下function hl=zhjLU(A) %函数名为zhiLU,输入矩阵A,来进行LU分解,返回值hl为A的各阶主子式的行列式[n n] =size(A);%返回矩阵A的维数
RA=rank(A); %返回矩阵A的秩if RA~=n %判断矩阵A的秩RA是否不等于A的维数n,当不等于n时,即小于n时执行if中的语句disp('请注意:因为A的n阶行列式hl等于零,所以A不能进行LU分解A的秩RA如下:'), RA,hl=det(A);%输出disp中的字符串,RA的值,hl的值(此时它的值为矩阵A的行列式)return %并且退出程序end % if end 语句块,end标志if语句结束if RA==n %判别A的秩是否等于n,当等于n时,即满秩时执行下面的语句for p=1:n%从1到n循环,主要是想获得1至n阶主子式的行列式h(p)=det(A(1:p, 1:p));%A(1:p, 1:p)为A的前p行前p列,即A的p阶主子式,从而h(p)为A的p阶主子式的值end %for语句结束标志hl=h(1:n);%把A的各阶主子式的行列式值赋给hl存储for i=1:n %从1到n循环,主要是判断各阶主子式是否为0if h(1,i)==0 %判段第i阶主子式的行列式是否为0,若为0输出下面的语句disp('请注意:因为A的r阶主子式等于零,所以A不能进行LU分解A的秩RA和各阶顺序主子式值hl依次如下:'), hl;RA%输出disp中的字符串,各阶主子式的行列式的值,以及矩阵A的秩return %当有一个为0时退出程序end %if语句结束标志end %for语句结束标志if h(1,i)~=0 %如果执行到这一句,说明上边的for循环都执行了且没有return出去,则此时i的值为n,判断第n阶行列式是否为0,即还是判断A的行列式是否不为0,若不为0则输出下面语句disp('请注意:因为A的各阶主子式都不等于零,所以A能进行LU分解A的秩RA和各阶顺序主子式值hl依次如下:')%输出disp中的字符串for j=1:n%对1到n循环U(1,j)=A(1,j);%把A的第一行中的各个值赋给U中第一行的各个变量end%for循环结束标志for k=2:n%从第2列到第n列进行循环,即依次给LU的第k列赋值for i=2:n%从2到n循环 ,与j的循环是相互联系的,即当i>j时对下三角矩阵L赋值,当j>=i时对上三角U赋值for j=2:n%从2到n循环 ,与i的循环是相互联系的,即当i>j时对下三角矩阵L赋值,当j>=i时对上三角U赋值L(1,1)=1;L(i,i)=1; %始终保持L对角线上的元素为1if i>j %当i>j时,此时就是要对L进行赋值了,因为当i<j时,L(i,j)=0,不用管L(1,1)=1;L(2,1)=A(2,1)/U(1,1); L(i,1)=A(i,1)/U(1,1);%根据LU分解的关系知,L(i,1)处的值=A(i,1)/U(1,1),从而对L(i,1)进行赋值,即对L的第一列赋值L(i,k)=(A(i,k)- L(i,1:k-1)U(1:k-1,k))/U(k,k);%还是根据LU分解的关系L(i,k)处的值等于(A(i,k)- L(i,1:k-1)U(1:k-1,k))/U(k,k),对L(i,k)赋值,即对L的第k列赋值else %否则,即i<j时,此时就是要对U进行赋值了,因为当i>j时,U(i,j)=0,不用管U(k,j)=A(k,j)-L(k,1:k-1)U(1:k-1,j);%根据LU分解的关系知U(k,j)的值等于A(k,j)-L(k,1:k-1)U(1:k-1,j)进而对U的第k列赋值end %if结束标志end %for j=2:n结束标志end %for i=2:n结束标志end %for k=2:n结束标志hl;RA,U,L %输出矩阵的秩RA,上三角函数U,下三角函数Lend %if h(1,i)~=0结束标志end %RA==n结束标志 %%%%%%%%%%%%%%%%%%%%%%%%以上代码中有很多多余的,当判断A的秩为n之后其他的主子式的行列式都不为0了,判断是多余的,故我进行了改进,如下%%%%%%%%%%%%%%%%%%%%%%% function hl=LUfenJie(A) %函数名为zhiLU,输入矩阵A,来进行LU分解,返回值hl为A的各阶主子式的行列式[n n] =size(A);%返回矩阵A的维数
RA=rank(A); %返回矩阵A的秩if RA~=n %判断矩阵A的秩RA是否不等于A的维数n,当不等于n时,即小于n时执行if中的语句disp('请注意:因为A的n阶行列式hl等于零,所以A不能进行LU分解A的秩RA如下:'), RA,hl=det(A);%输出disp中的字符串,RA的值,hl的值(此时它的值为矩阵A的行列式)return %并且退出程序elsefor p=1:n%从1到n循环,主要是想获得1至n阶主子式的行列式h(p)=det(A(1:p, 1:p));%A(1:p, 1:p)为A的前p行前p列,即A的p阶主子式,从而h(p)为A的p阶主子式的值end %for语句结束标志hl=h(1:n);%把A的各阶主子式的行列式值赋给hl存储
disp('请注意:因为A的各阶主子式都不等于零,所以A能进行LU分解A的秩RA和各阶顺序主子式值hl依次如下:')%输出disp中的字符串for j=1:n%对1到n循环U(1,j)=A(1,j);%把A的第一行中的各个值赋给U中第一行的各个变量end%for循环结束标志for k=2:n%从第2列到第n列进行循环,即依次给LU的第k列赋值for i=2:n%从2到n循环 ,与j的循环是相互联系的,即当i>j时对下三角矩阵L赋值,当j>=i时对上三角U赋值for j=2:n%从2到n循环 ,与i的循环是相互联系的,即当i>j时对下三角矩阵L赋值,当j>=i时对上三角U赋值L(1,1)=1;L(i,i)=1; %始终保持L对角线上的元素为1if i>j %当i>j时,此时就是要对L进行赋值了,因为当i<j时,L(i,j)=0,不用管L(1,1)=1;L(2,1)=A(2,1)/U(1,1); L(i,1)=A(i,1)/U(1,1);%根据LU分解的关系知,L(i,1)处的值=A(i,1)/U(1,1),从而对L(i,1)进行赋值,即对L的第一列赋值L(i,k)=(A(i,k)- L(i,1:k-1)U(1:k-1,k))/U(k,k);%还是根据LU分解的关系L(i,k)处的值等于(A(i,k)- L(i,1:k-1)U(1:k-1,k))/U(k,k),对L(i,k)赋值,即对L的第k列赋值else %否则,即i<j时,此时就是要对U进行赋值了,因为当i>j时,U(i,j)=0,不用管U(k,j)=A(k,j)-L(k,1:k-1)U(1:k-1,j);%根据LU分解的关系知U(k,j)的值等于A(k,j)-L(k,1:k-1)U(1:k-1,j)进而对U的第k列赋值end %if结束标志end %for j=2:n结束标志end %for i=2:n结束标志end %for k=2:n结束标志hl;RA,U,L %输出矩阵的秩RA,上三角函数U,下三角函数Lend %RA~=n结束标志
有的,使用lu函数即可,举例:
A = [ 1 2 3
4 5 6
7 8 0 ];
[L1,U] = lu(A)
L1 =
01429 10000 0
05714 05000 10000
10000 0 0
U =
70000 80000 0
0 08571 30000
0 0 45000
可以说是最简单的矩阵分解方法,将矩阵A分解成L(下三角)矩阵和U(上三角)矩阵的乘积。其实就是高斯消元法的体现,U矩阵就是利用高斯消元法得到的,而消元过程用到的初等变换矩阵乘积就是L矩阵。需要注意的是,L矩阵可以是置换过的矩阵,即一个下三角矩阵和一个置换矩阵的乘积(可以参考MATLAB中LU分解的函数lu)。
Matlab常用命令汇总
记住Matlab中一些常用的命令,对于我们学习EDA来说用处很大!下面我为大家整理了关于Matlab的常用命令,希望对你有所帮助。
一、常用对象 *** 作:除了一般windows窗口的常用功能键外。
1、!dir 可以查看当前工作目录的文件。 !dir& 可以在dos状态下查看。
2、who 可以查看当前工作空间变量名, whos 可以查看变量名细节。
3、功能键:
功能键 快捷键 说明
方向上键 Ctrl+P 返回前一行输入
方向下键 Ctrl+N 返回下一行输入
方向左键 Ctrl+B 光标向后移一个字符
方向右键 Ctrl+F 光标向前移一个字符
Ctrl+方向右键 Ctrl+R 光标向右移一个字符
Ctrl+方向左键 Ctrl+L 光标向左移一个字符
home Ctrl+A 光标移到行首
End Ctrl+E 光标移到行尾
Esc Ctrl+U 清除一行
Del Ctrl+D 清除光标所在的字符
Backspace Ctrl+H 删除光标前一个字符
Ctrl+K 删除到行尾
Ctrl+C 中断正在执行的命令
4、clc可以命令窗口显示的内容,但并不清除工作空间。
二、函数及运算
1、运算符:
+:加, -:减, :乘, /: 除, :左除 ^: 幂,‘:复数的共轭转置, ():制定运算顺序。
2、常用函数表:
sin( ) 正弦(变量为弧度)
Cot( ) 余切(变量为弧度)
sind( ) 正弦(变量为度数)
Cotd( ) 余切(变量为度数)
asin( ) 反正弦(返回弧度)
acot( ) 反余切(返回弧度)
Asind( ) 反正弦(返回度数)
acotd( ) 反余切(返回度数)
cos( ) 余弦(变量为弧度)
exp( ) 指数
cosd( ) 余弦(变量为度数)
log( ) 对数
acos( ) 余正弦(返回弧度)
log10( ) 以10为底对数
acosd( ) 余正弦(返回度数)
sqrt( ) 开方
tan( ) 正切(变量为弧度)
realsqrt( ) 返回非负根
tand( ) 正切(变量为度数)
abs( ) 取绝对值
atan( ) 反正切(返回弧度)
angle( ) 返回复数的相位角
atand( ) 反正切(返回度数)
mod(x,y) 返回x/y的余数
sum( ) 向量元素求和
3、其余函数可以用help elfun和help specfun命令获得。
4、常用常数的值:
pi 31415926……
realmin 最小浮点数,2^-1022
i 虚数单位
realmax 最大浮点数,(2-eps)2^1022
j 虚数单位
Inf 无限值
eps 浮点相对经度=2^-52
NaN 空值
三、数组和矩阵:
1、构造数组的方法:增量发和linspace(first,last,num)first和last为起始和终止数,num为需要的数组元素个数。
2、构造矩阵的方法:可以直接用[ ]来输入数组,也可以用以下提供的函数来生成矩阵。
ones( ) 创建一个所有元素都为1的矩阵,其中可以制定维数,1,2…个变量
zeros() 创建一个所有元素都为0的矩阵
eye() 创建对角元素为1,其他元素为0的矩阵
diag() 根据向量创建对角矩阵,即以向量的元素为对角元素
magic() 创建魔方矩阵
rand() 创建随机矩阵,服从均匀分布
randn() 创建随机矩阵,服从正态分布
randperm() 创建随机行向量
horcat C=[A,B],水平聚合矩阵,还可以用cat(1,A,B)
vercat C=[A;B],垂直聚合矩阵, 还可以用cat(2,A,B)
repmat(M,v,h) 将矩阵M在垂直方向上聚合v次,在水平方向上聚合h次
blkdiag(A,B) 以A,和B为块创建块对角矩阵
length 返回矩阵最长维的的长度
ndims 返回维数
numel 返回矩阵元素个数
size 返回每一维的长度,[rows,cols]=size(A)
reshape 重塑矩阵,reshape(A,2,6),将A变为2×6的矩阵,按列排列。
rot90 旋转矩阵90度,逆时针方向
fliplr 沿垂轴翻转矩阵
flipud 沿水平轴翻转矩阵
transpose 沿主对角线翻转矩阵
ctranspose 转置矩阵,也可用A’或A’,这仅当矩阵为复数矩阵时才有区别
inv 矩阵的逆
det 矩阵的行列式值
trace 矩阵对角元素的和
norm 矩阵或矢量的范数,norm(a,1),norm(a,Inf)……
normest 估计矩阵的最大范数矢量
chol 矩阵的cholesky分解
cholinc 不完全cholesky分解
lu LU分解
luinc 不完全LU分解
qr 正交分解
kron(A,B) A为m×n,B为p×q,则生成mp×nq的矩阵,A的每一个元素都会乘上B,并占据p×q大小的空间
rank 求出矩阵的刺
pinv 求伪逆矩阵
A^p 对A进行 *** 作
A^P 对A中的每一个元素进行 *** 作
四、数值计算
1、线性方程组求解
(1)AX=B的解可以用X=AB求。XA=B的解可以用X=A/B求。如果A是m×n的矩阵,当m=n时可以找到唯一解,mn,超定系统,至少找到一组解。如果A是奇异的,且AX=B有解,可以用X=pinv(A)×B返回最小二乘解
(2)AX=b, A=L×U,[L,U]=lu(A), X=U(Lb),即用LU分解求解。
(3)QR(正交)分解是将一矩阵表示为一正交矩阵和一上三角矩阵之积,A=Q×R[Q,R]=chol(A), X=Q(Ub)
(4)cholesky分解类似。
2、特征值
D=eig(A)返回A的所有特征值组成的矩阵。[V,D]=eig(A),还返回特征向量矩阵。
3、A=U×S×UT,[U,S]=schur(A)其中S的对角线元素为A的特征值。
4、多项式Matlab里面的多项式是以向量来表示的,其具体 *** 作函数如下:
conv 多项式的乘法
deconv 多项式的除法,a,b=deconv(s),返回商和余数
poly 求多项式的系数(由已知根求多项式的系数)
polyeig 求多项式的特征值
Polyfit(x,y,n) 多项式的曲线拟合,x,y为被拟合的向量,n为拟合多项式阶数。
polyder 求多项式的一阶导数,polyder(a,b)返回ab的导数
[a,b]=polyder(a,b)返回a/b的导数。
polyint 多项式的积分
polyval 求多项式的值
polyvalm 以矩阵为变量求多项式的值
residue 部分分式展开式
roots 求多项式的根(返回所有根组成的向量)
注:用ploy(A)求出矩阵的特征多项式,然后再求其根,即为矩阵的特征值。
5、插值常用的插值函数如下:
griddata 数据网格化合曲面拟合
Griddata3 三维数据网格化合超曲面拟合
interp1 一维插值(yi=interp1(x,y,xi,’method’)Method=nearest/linear/spline/pchip/cubic
Interp2 二维插值zi=interp1(x,y,z,xi,yi’method’),bilinear
Interp3 三维插值
interpft 用快速傅立叶变换进行一维插值,help fft。
mkpp 使用分段多项式
spline 三次样条插值
pchip 分段hermit插值
6、函数最值的求解
fminbnd(‘f’,x1,x2,optiset(,))求f在x1和x2之间的最小值。Optiset选项可以有‘Display’+‘iter’/’off’/’final’,分别表示显示计算过程/不显示/只显示最后结果。fminsearch求多元函数的最小值。fzero(‘f’,x1)求一元函数的零点。X1为起始点。同样可以用上面的选项。
五、图像绘制:
1、基本绘图函数
plot 绘制二维线性图形和两个坐标轴
plot3 绘制三维线性图形和两个坐标轴
fplot 在制定区间绘制某函数的图像。fplot(‘f’,区域,线型,颜色)
loglog 绘制对数图形及两个坐标轴(两个坐标都为对数坐标)semilogx 绘制半对数坐标图形
semilogy 绘制半对数坐标图形
2、线型: 颜色 线型
y ** 圆点线 v 向下箭头
g 绿色 - 组合 > 向右箭头
b 蓝色 + 点为加号形 < 向左箭头
m 红紫色 o 空心圆形 p 五角星形
c 蓝紫色 星号 h 六角星形
w 白色 实心小点 hold on 添加图形
r 红色 x 叉号形状 grid on 添加网格
k 黑色 s 方形 - 实线
d 菱形 -- 虚线 ^ 向上箭头
3、可以用subplot(3,3,1)表示将绘图区域分为三行三列,目前使用第一区域。此时如要画不同的图形在一个窗口里,需要hold on。
;矩阵分解 (decomposition, factorization)是多半将矩阵拆解为数个三角形矩阵(triangular matrix)。
依使用目的的不同 ,可分为三种矩阵分解法:1)三角分解法 (Triangular Factorization),2)QR 分解法 (QR Factorization),3)奇异值分 解法 (Singular Value Decompostion)。
(1) 三角分解法
三角分解法是将原正方 (square) 矩阵分解成一个上三角形矩阵 或是排列(permuted) 的上三角形矩阵 和一个 下三角形矩阵,这样的分解法又称为LU分解法。它的用途主要在简化一个大矩阵的行列式值的计算过程,求 反矩阵,和求解联立方程组。不过要注意这种分解法所得到的上下三角形矩阵并非唯一,还可找到数个不同 的一对上下三角形矩阵,此两三角形矩阵相乘也会得到原矩阵。
我们举以下二个矩阵为例:
利用三角分解法可将A和B二矩阵分别拆解为上下三角形矩阵
注意B分解的矩阵得到的第一个矩阵[LB]是排列的下三角形矩阵,如果第二、三列互换,则此变成完全的下 三角形矩阵。
以MATLAB函数计算上述的LU分解法,其语法为[L,U]=lu(A),其中L代表下三角形矩阵U代表上三角形矩阵。 我们来看一个例子。
>> A = [1 2 -1, -2 -5 3; -1 -3 0]; B=[1 3 2; -2 -6 1; 2 5 7];
>> [L1,U1] = lu(A); [L2,U2] = lu(B);
>> L1; U1
L1 = % 注意这个矩阵L1和之前的[LA]不相同
-05 1 0
1 0 0
05 1 1
U1 = % 注意这个矩阵U1和之前的[UA]不相同
-2 -5 3
0 -05 05
0 0 -2
>> L2; U2
L2 = % 注意这个矩阵L2和之前的[LB]不相同
-05 0 1
1 0 0
-1 1 0
U2 = % 注意这个矩阵U2和之前的[UB]不相同
-2 -6 1
0 -1 8
0 0 25
(2) QR分解法
QR分解法是将矩阵分解成一个正规正交矩阵与上三角形矩阵。正规正交矩阵Q满足条件,所以称为QR分解法与此正规正交矩阵的通用符号Q有关。
MATLAB以qr函数来执行QR分解法, 其语法为[Q,R]=qr(A),其中Q代表正规正交矩阵,而R代表上三角形矩 阵。此外,原矩阵A不必为正方矩阵;如果矩阵A大小为,则矩阵Q大小为,矩阵R大小为。
(3) 奇异值分解法
奇异值分解 (sigular value decomposition,SVD) 是另一种正交矩阵分解法;SVD是最可靠的分解法,但是它比QR 分解法要花上近十倍的计算时间。[U,S,V]=svd(A),其中U和V代表二个相互正交矩阵,而S代表一对角矩阵。 和QR分解法相同者, 原矩阵A不必为正方矩阵。
使用SVD分解法的用途是解最小平方误差法和数据压缩。
lu分解是数值分析课程的内容,叫做三角分解法
其基本的思想就是说:将系数矩阵A分解为两个三角矩阵L与U的乘积A=LU,这样就把方程组AX=b的求解问题归结为两个三角形方程组
LY=b 与 UX=Y 的求解问题。你就可以先有第一个方程求Y,再有第二个方程求X。分成这两部求会变得简单,因为分别含有三角形矩阵L和U,计算机在求解的时候可以减少很多次运算,从而提高了求解速度,小矩阵求解用不到LU分解,只是当矩阵很庞大时才能体现出LU分解的优点
这种方法又根据LU的形式分为杜利特尔分解和克劳特分解
可以先分成两个矩阵,再将第二个矩阵取逆
LU分解:将矩阵表示为一个下三角矩阵与一个上三角矩阵的乘积。[L,U]=lu(X): 产生L和U ,使得X=LU。>> A=[2,1,-1,1;1,-5,0,7;0,2,1,-1;1,6,-1,-4];>> b=[13,-9,6,0]';>> [L,U]=lu(A);>> x=U\(L\b) QR分解:是将矩阵分解为一个正交矩阵和一个上三角矩阵的乘积 :[Q,R]=qr(X): 产生Q和R,使得X=QR。
求逆:inv(A)
以上就是关于对矩阵x进行QR分解和LU分解,QR分解和LU分解是什么意思呢全部的内容,包括:对矩阵x进行QR分解和LU分解,QR分解和LU分解是什么意思呢、求直接三角分解法的matlab程序,每一步都需要解释,谢谢!、MATLAB 对称矩阵的分解等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)