资源描述
实验2-行列式与方程组的求解
———————————————————————————————— 作者:
———————————————————————————————— 日期:
10
个人收集整理 勿做商业用途
2 行列式与方程组的求解
1. 求行列式的命令;
2. 求矩阵秩的命令;
3. 求矩阵的最简行矩阵的命令;
4. 满秩线性方程组的各种方法;
5. 符号变量的应用;
6. 验证与行列式相关的公式和定理。
例2。1 已知非齐次线性方程组:
,
要求用下列方法求解该方程组。
(1)求逆矩阵法;
(2)矩阵左除法;
(3)初等行变换;
(4)克莱姆法则.
解:(1)把非齐次线性方程组写为矩阵形式:
,则,直接在MATLAB的命令窗口输入:
A=[6,2,3,4,5;2,-3,7,10,13;3,5,11,—16,21;2,-7,7,7,2;7,3,—5,3,10];
b=[80;59;90;22;85];
x=inv(A)*b
%或:x=A^—1*b
计算结果为:
x =
9。0000
3.0000
2.0000
1。0000
2.0000
(2)矩阵的乘法不遵守乘法交换律,
Matlab软件定义了矩阵左除和矩阵右除运算,
针对方程组的矩阵形式,可用左除法
等式两端同时左除A,得到:“”,即
针对矩阵方程,,可用右除法,等式两端同时右除A,,
即
在MATLAB命令窗口中输入:
A=[6,2,3,4,5;2,—3,7,10,13;3,5,11,-16,21;2,—7,7,7,2;7,3,-5,3,10];
b=[80;59;90;22;85];
x=A\b
% 符号“\”即为左除运算,注意它的方向.
结果为:
x =
9.0000
3。0000
2。0000
1.0000
2。0000
(3)用初等行变换,
把方程组的增广矩阵变换为最简行阶梯形式,
从而得到方程组的解.在MATLAB命令窗口中输入:
A=[6,2,3,4,5;2,-3,7,10,13;3,5,11,—16,21;2,-7,7,7,2;7,3,-5,3,10];
b=[80;59;90;22;85];
U=rref([A,b])
运算结果为:
U =
1 0 0 0 0 9
0 1 0 0 0 3
0 0 1 0 0 2
0 0 0 1 0 1
0 0 0 0 1 2
(4)根据克莱姆法则,有:,
其中是方程组的系数行列式,
是用常数列向量b代替系数行列式的
第i列所得到的行列式。
用Matlab的M文件编辑器,编写la01。m文件如下:
% 用克莱姆法则求解方程组
clear % 清除变量
n=input('方程个数n=’) % 请用户输入方程个数
A=input(’系数矩阵A=’) % 请用户输入方程组的系数矩阵
b=input(’常数列向量b=’) % 请用户输入常数列向量
if (size(A)~=[n,n]) | (size(b)~=[n,1])
% 判断矩阵A和向量b输入格式是否正确
disp('输入不正确,要求A是n阶方阵,b是n维列向量')
% disp:显示字符串
elseif det(A)==0 % 判断系数行列式是否为零
disp(’系数行列式为零,不能用克莱姆法则解此方程.')
else
for i=1:n % 计算x1,x2,..。xn
B=A; % 构造与A相等的矩阵B
B(:,i)=b; % 用列向量b替代矩阵B中的第i列
x(i)=det(B)/det(A); % 根据克莱姆法则计算x1,x2,。.。xn
end
x=x' % 以列向量形式显示方程组的解
end
在MATLAB命令窗口中输入:
la01
得到以下人机对话结果:
方程个数n=5
n =
5
系数矩阵A=
[6,2,3,4,5;2,—3,7,10,13;3,5,11,—16,21;2,-7,7,7,2;7,3,-5,3,10]
A =
6 2 3 4 5
2 —3 7 10 13
3 5 11 -16 21
2 —7 7 7 2
7 3 —5 3 10
常数列向量b=[80;59;90;22;85]
b =
80
59
90
22
85
x =
9
3
2
1
2
例2。2求矩阵
的逆,要求用以下方法:
(1)矩阵左除和右除运算;
(2)初等行变换;
(3)利用伴随矩阵求逆的公式。
解:在MATLAB的M文件编辑器中,编写程序la02.m:
% 逆矩阵各种求法:
clear
A=[—7,—2,-6,4,6;1,3,-6,3,11;3,-11,9,5,—2;—3,0,-2,9,-3;7,30,-18,11,4];
% 1。命令法:
An1=inv(A)
% 2.幂运算法:
An2=A^-1
% 3。右除法:
An3=eye(5)/A % eye(5)为5阶单位矩阵
% 4。左除法:
An4=A\eye(5)
% 5.初等行变换法:
B=rref([A,eye(5)]); % 对矩阵[A , I] 进行初等行变换
% B为矩阵A的最简行阶梯矩阵
if(rank(B(:,1:5))==5) % 判断最简行阶梯矩阵B的前5列是否为单位阵
An5=B(:,6:10) % 取出矩阵的后5列,并显示
else
disp('A不可逆');
end
% 6.伴随矩阵求逆法:
for i=1:5 % 构造伴随矩阵的5×5个元素
for j=1:5
T=A; % 把矩阵A赋给矩阵T
T(i,:)=[]; % 删去矩阵T的第i行
T(:,j)=[]; % 删去矩阵T的第j列
% 此时,|T| 为矩阵A元素aij的余子式
AA(j,i)=(-1)^(i+j)*det(T);
% 算出aij的代数余子式
% 并放入矩阵AA的第j行、第i列
% 当循环结束,矩阵AA即为A的伴随矩阵
end
end
if det(A)~=0
An6=AA/det(A)
else
disp(’A不可逆’);
end
运算程序la02,前四个方法计算结果相同:
1.0e+004 *
-1.5895 1。3448 —1。0646 1。6206 —0。6308
1.6298 —1.3789 1。0916 -1。6617 0。6468
2。5392 -2.1483 1。7007 -2。5889 1.0077
0。3631 —0.3072 0。2432 -0.3702 0.1441
0。9860 -0.8342 0.6604 —1。0053 0。3913
后两个方法计算结果相同:
-15895 13448 -10646 16206 —6308
16298 -13789 10916 —16617 6468
25392 —21483 17007 -25889 10077
3631 —3072 2432 -3702 1441
9860 -8342 6604 -10053 3913
从计算结果可以发现,
前四个方法得到的是实数矩阵,
而后两个方法得到的是整数矩阵。
如果在Matlab环境下,键入:
format long
然后再重新运行该程序,
会发现前四个方法的运算结果存在误差,
这是计算机做数值运算时,存在舍入误差的原因。
为了进一步观察计算机做数值运算所产生的误差,
现在用上述六种方法来计算矩阵的逆,
A=[1,2,3;10,10,10;11,12,13]
前四种方法得到以下类似结果:
Warning: Matrix is close to singular or badly scaled.
Results may be inaccurate. RCOND = 2.135044e-018。
ans =
1.0e+015 *
—4。5036 —4。5036 4。5036
9.0072 9.0072 —9。0072
-4.5036 —4.5036 4.5036
显然此结果是不正确的,因为A不可逆。
例2.3 解方程:。
解:Matlab软件定义了“符号变量”的概念.
在MATLAB的M文件编辑器中,
应用“符号变量”编写程序la03.m:
% 求解符号行列式方程
clear all % 清除各种变量
syms x % 定义x为符号变量
A=[3,2,1,1;3,2,2—x^2,1;5,1,3,2;7—x^2,1,3,2]
% 给矩阵A赋值
D=det(A) % 计算含符号变量矩阵A的行列式D
f=factor(D) % 对行列式D进行因式分解
% 从因式分解的结果,可以看出方程的解
X=solve(D) % 求方程“D=0”的解
在MATLAB的命令窗口输入:
la03
运行结果为:
A =
[ 3, 2, 1, 1]
[ 3, 2, 2-x^2, 1]
[ 5, 1, 3, 2]
[ 7—x^2, 1, 3, 2]
D =
-6+9*x^2—3*x^4
f =
-3*(x—1)*(x+1)*(x^2—2)
X =
[ 1]
[ —1]
[ 2^(1/2) ]
[ -2^(1/2)]
例2。4 请用Matlab软件验证行列式按行(列)展开公式:
解:在MATLAB的M文件编辑器中,编写程序la04.m:
% 验证行列式按行(列)展开公式
clear
A=round(10*randn(5)); % 构造5阶随机数方阵
D=det(A); % 计算矩阵A的行列式
% 矩阵A按第一行元素展开:s=a11*A11+a12*A12+…+a15*A15
s=0;
for i=1:5
T=A;
T(1,:)=[]; % 删去阵矩第1行
T(:,i)=[]; % 删去矩阵第i列
% 此时,|T| 为矩阵A元素a1i的余子式
s=s+A(1,i)*(-1)^(1+i)*det(T);
end
e=D—s % 验算D与s是否相等
在MATLAB的命令窗口中输入:
la04
计算结果为:
e =
0
在MATLAB的M文件编辑器中,编写程序la05。m:
% 计算5阶方阵A的第一行元素与第三行元素对应的代数余子式乘积之和:
% s=a11*A31+a12*A32+…+a15*A35
clear
A=round(10*randn(5)); % 构造5阶随机数方阵
s=0;
for i=1:5
T=A;
T(3,:)=[]; % 删去矩阵第3行
T(:,i)=[]; % 删去矩阵第i列
% 此时,|T| 为矩阵A元素a3i的余子式
s=s+A(1,i)*(-1)^(3+i)*det(T);
end
s % 验算s是否为0
在MATLAB命令窗口中输入:
la05
计算结果为:
s =
0
例2。5 计算行列式的值。
解 在MATLAB编辑器中建立M文件:
syms a b c d
A=[1 1 1 1;a b c d;a^2 b^2 c^2 d^2;a^4 b^4 c^4 d^4];
d1=det(A)
d2=simple(d1) %用 simple函数化简表达式d1
pretty(d2) %用pretty函数使表达式d2符合人们的书写习惯。
则结果显示为:
d1 =
b*c^2*d^4-b*d^2*c^4-b^2*c*d^4+b^2*d*c^4+b^4*c*d^2—b^4*d*c^2-a*c^2*d^4+a*d^2*c^4+a*b^2*d^4-a*b^2*c^4—a*b^4*d^2+a*b^4*c^2+a^2*c*d^4-a^2*d*c^4-a^2*b*d^4+a^2*b*c^4+a^2*b^4*d—a^2*b^4*c—a^4*c*d^2+a^4*d*c^2+a^4*b*d^2—a^4*b*c^2—a^4*b^2*d+a^4*b^2*c
d2 =
(—d+c)*(b-d)*(b-c)*(—d+a)*(a-c)*(a-b)*(a+c+d+b) (-d + c) (b - d) (b - c) (—d + a) (a - c) (a — b) (a + c + d + b)
展开阅读全文