河南理工大学矩阵分析及其应用教学上机
实验报告
2016—2017学年 第1学期 上机时间____________ 专业班级控制学硕1601 学 号211608010034 姓 名朱萌萌 实验课程名称:矩阵的分解 实验目的和要求: 1、了解矩阵的LU分解的基本原理,掌握矩阵LU分解的基本求解步骤。 学会利用Matlab进行模拟仿真,编写关于矩阵LU分解的相关程序,并用实际例子来验证自己程序的准确性。 2、了解矩阵的QR分解的基本原理,掌握矩阵QR分解的基本求解步骤。 学会利用Matlab进行模拟仿真,编写关于矩阵QR分解的相关程序,并用实际例子来验证自己程序的准确性。 3、了解矩阵的奇异值分解的基本原理,掌握矩阵奇异值分解的基本求解步骤。 学会利用Matlab进行模拟仿真,编写关于矩阵奇异值分解的相关程序,并用实际例子来验证自己程序的准确性。 实验项目名称: 1、矩阵的LU分解;2、矩阵的QR分解;3、矩阵的奇异值分解。
实验过程及代码: 1、矩阵的LU分解 程序:clear clc A=input('请输入一个方阵 '); %输入一个n阶方阵 [~,n]=size(A); L=zeros(n,n); U=zeros(n,n); for i=1:n %将L的主对角线元素赋值1 L(i,i)=1; end for j=1:n %求矩阵U的第一行元素 U(1,j)=A(1,j); end for k=2:n %求矩阵L的第一列元素 L(k,1)=A(k,1)/U(1,1); end for i=2:n %求L、U矩阵元素 for j=i:n s=0; for t=1:i-1 s=s+L(i,t)*U(t,j); end U(i,j)=A(i,j)-s; end for k=i+1:n r=0; for t=1:i-1 r=r+L(k,t)*U(t,i); end L(k,i)=(A(k,i)-r)/U(i,i); end end 2、矩阵的QR分解 程序:A = input('请输入原矩阵:'); [m ,n] = size (A); %求矩阵A的行数m和列数n Q = orth(A); % 将A阵正交化 for j = 1:n %将矩阵A正交化后的特征向量标准化 sum = 0; for i = 1:m sum = sum + Q(i , j).*Q(i , j);
end for i = 1:m Q(i , j) = Q(i,j)./sqrt(sum); end end Q; R = Q\\A; C = Q * R; %验证结果是否正确 C = A 3、矩阵的奇异值分解 程序:A = input('请输入原矩阵:'); [xiangliang , gen] = eig(A'*A); %求矩阵A'*A的特征向量和特征根 [m ,n] = size (A); %求矩阵A的行数m和列数n k = 1; xiang = zeros(n,n); g = zeros(n,n); a = n; for i = 1:n if gen(i , i) ~= 0 g(k , k) = gen(i , i); xiang( : , k) = xiangliang( : , i); k = k+1; else xiang( : , a) = xiangliang( : , i); a = a -1; end end xiang; g; sum = 0; B = orth(xiang); %将矩阵A'*A的特征向量正交化 %B = xiangliang for j = 1:n %将矩阵A'*A正交化后的特征向量标准化 sum = 0; for i = 1:n sum = sum + B(i , j).*B(i , j); end for i = 1:n B(i , j) = B(i,j)./sqrt(sum); end end V = B'; %V为矩阵A'*A标准正交向量的共轭转置 D = zeros(m,n); %求矩阵秩分解中的D矩阵 r = size(g);
for i = 1:r D(i,i) = sqrt(g(i,i)); end % D; z = rank(g); U1 = zeros(m,m); %求U阵的U1 for j = 1:z U1( :,j) = (A * V( :,j))./D(j,j); end %U1; wei = rank(A*A'); %求U阵的U2 U3 = null( A*A' , 'wei'); U2 = orth(U3); %将U2正交化 [y, x] = size(U2); for j = 1:x %将矩阵A'*A正交化后的特征向量标准化 sum = 0; for i = 1:y sum = sum + U2(i , j).*U2(i , j); end for i = 1:y U2(i , j) = U2(i,j)./sqrt(sum); end end U = zeros(m,m); %根据U1和U2求U i = 0; for j = 1:m if j <= z U(: ,j) = U1(:,j); else i = i +1; U(: ,j) = U2(:,i); end end %输出分解后的矩阵U D V U D V
运行结果: 1、LU分解 举例:请输入一个方阵 [2 1 1; 4 1 0; -2 2 1] L = 1 0 0 2 1 0 -1 -3 1 U = 2 1 1 0 -1 -2 0 0 -4 2、QR分解 举例:QR 请输入原矩阵:[1 0 1;1 1 1]' >> Q Q = -0.6572 0.2610 -0.3690 -0.9294 -0.6572 0.2610 >> R R = -1.3144 -1.6834 0.5219 -0.4075 >> C C = 1.0000 1.0000 0.0000 1.0000 1.0000 1.0000 3、奇异值分解 举例:请输入原矩阵:[ 1 0; 0 1 ; 1 0] U = 0 -0.7071 -0.7071 -1.0000 0 0 0 -0.7071 0.7071 D = 1.0000 0 0 1.4142 0 0
V = 0 -1 -1 0 实验分析:通过本次实验让我学会到了在Matlab中编写程序的一些技巧,同时也增加我对Matlab使用的熟练程度,更进一步让我了解到矩阵的分解。 任课老师评语: 签名:__________ 日期_____年__月__日 实验类别:专业 实验要求:必修 实验类型:设计 实验者类型:研究生