线性方程组的无穷解=对应齐次方程组的通解+非齐次方程组的一个特解;其特解的求法属于解的第一类问题,通解部分属第二类问题。
这类问题的求法分为两类:
一类主要用于解低阶稠密矩阵——直接法;另一类是解大型稀疏矩阵——迭代法。
1、利用矩阵除法求线性方程组的特解(或一个解)
方程:
AX=b
解法:
X=A\b
例4-1求方程组
的解
解:
在Matlab编辑器中建立M文件:
LX0716.m
A=[56000
15600
01560
00156
00015];
B=[10001]';
R_A=rank(A)%求秩
X=A\B%求解
运行后结果如下
R_A=
5
X=
2.2662
-1.7218
1.0571
-0.5940
0.3188
这就是方程组的解。
例4-2求方程组
的一个特解
解:
在Matlab编辑器中建立M文件:
LX0717.m
A=[11-3-1;3-1-34;15-9-8];
B=[140]';
X=A\B
X=
0
0
-0.5333
0.6000
2、利用矩阵的LU、QR和cholesky分解求方程组的解
(1)LU分解:
LU分解又称Gauss消去分解,可把任意方阵分解为下三角矩阵的基本变换形式(行交换)和上三角矩阵的乘积。
即A=LU,L为下三角阵,U为上三角阵。
则:
A*X=b变成L*U*X=b
∴X=U\(L\b)这样可以大提高运算速度。
命令[L,U]=lu(A)
例4-3求方程组
的一个特解
解
在Matlab编辑器中建立M文件:
LX0718.m
A=[42-1;3-12;1130];
B=[2108]';
D=det(A)
[L,U]=lu(A)
X=U\(L\B)
在Matlab命令窗口建入LX0718,回车后显示结果如下:
D=
0
L=
0.3636-0.50001.0000
0.27271.00000
1.000000
U=
11.00003.00000
0-1.81822.0000
000.0000
Warning:
Matrixisclosetosingularorbadlyscaled.
Resultsmaybeinaccurate.RCOND=2.018587e-017.
>InD:
\Matlab\pujun\lx0720.matline4
X=
1.0e+016*
-0.4053
1.4862
1.3511
说明:
结果中的警告是由于系数行列式为零产生的。
可以通过A*X验证其正确性。
3.Cholesky分解
若A为对称正定矩阵,则Cholesky分解可将矩阵A分解成上三角矩阵和其转置的乘积,即:
其中R为上三角阵。
方程A*X=b变成
所以
命令R=chol(A)
3.QR分解
对于任何长方矩阵A,都可以进行QR分解,其中Q为正交矩阵,R为上三角矩阵的初等变换形式,即:
A=QR
方程A*X=b变形成QRX=b
所以X=R\(Q\b)
命令[Q,R]=qr(A)
上例中[Q,R]=qr(A)
X=R\(Q\B)
说明:
这三种分解,在求解大型方程组时很有用。
其优点是运算速度快、可以节省磁盘空间、节省内存。
(四)特征值与特征向量
工程技术中的一些问题,如振动问题和稳定性问题,常归结为求一个方阵的特征值和特征向量。
设A为n阶方阵,如果数入和n维列向量x使得关系式
成立,则称
为方阵A的特征值,非零向量x称为A对应于特征值入的特征向量。
在Matlab中,用如下几种调用格式来求A的特征值和特征向量。
1.d=eig(A)%d为矩阵A的特征值排成的向量
2.[V,D]=eig(A)%D为A的特征值对角阵,V的列向量为对应特征值的特征向量(且为单位向量)
3.[V,D]=eig(A,
)%当A中有小到和截断误差相当的元素时,用nobalance选项,其作用是减少计算误差
求矩阵
的特征值和特征向量
解:
在Matlab编辑器中建立M文件:
LX0722.m
A=[-211;020;-413];
[V,D]=eig(A)
运行后结果显示:
V=
-0.7071-0.24250.3015
000.9045
-0.7071-0.97010.3015
D=
-100
020
002
即:
特征值-1对应特征向量(-0.70710-0.7071)T
特征值2对应特征向量(-0.24250-0.9701)T和(-0.30150.9045-0.3015)T
求矩阵
的特征值和特征向量
解:
在Matlab编辑器中建立M文件:
LX0723.m
A=[-110;-430;102];
[V,D]=eig(A)
运行后结果显示为
V=
00.4082-0.4082
00.8165-0.8165
1.0000-0.40820.4082
D=
200
010
001
说明:
当特征值为1(二重根)时,对应特征向量都是k(0.40820.8165-0.4082)Tk为任意常数。
(五)关系操作
关系运算示例。
A=1:
9,B=10-A,r0=(A<4),r1=(A==B)
A=
123456789
B=
987654321
r0=
111000000
r1=
000010000
(六)逻辑操作
注意逻辑运算和关系运算之间的优先级次序。
(详见下节的表2.13-5)
A=-3:
3;
L1=~(A>0)
L2=~A>0
L3=~A
L4=A>-2&A<1
L1=
1111000
L2=
0001000
L3=
0001000
L4=
0011000
三、实验仪器、设备
1.主要设备是电脑,
2.软件环境为MATLAB6.5以上版本。
四、实验原理
1.数组是有序数据的集合,在大多数编程语言中,数组的每一个成员(元素)都属于同一种数据类型,它们使用同一个数组名称和不同的下标惟一确定数组中的成员(元素)。
其中,下标是指数组元素在数组中的序号。
2.向量就是一维数组,可以是行向量或列向量。
3.在MATLAB中矩阵就是线性代数中定义的矩阵的概念——矩阵就是用一对圆括号或者方括号扩起来,符合一定规则的数学对象。
五、实验步骤
1.首先进入MATLAB6.5环境,熟悉MAYLAB的工作环境以及工作空间。
2.用不同的方法创建矩阵和数组。
3.对创建的矩阵进行各种操作,如:
矩阵旋转、矩阵转置、矩阵运算等。
4.根据线性方程组系数矩阵的不同情况,分析是否存在惟一精确解,如果存在就对其求解。
5.练习求特征值和特征向量
6.对矩阵或向量进行关系运算或逻辑运算
六、实验报告要求
1.要求验证课本上关于矩阵各种运算的实验内容,写出命令窗口的操作过程,将运行结果如实记录,根据运行结果进行分析归纳;
2.写出通过本次对课堂授课内容有哪些促进和提高,总结出哪些规律。
得到哪些结论;
3.写出本次实验的心得和体会,并提出今后应注意的问题和改进的方向。
七、实验注意事项
1.实验内容在命令窗口进行直接操作,也可以在M文件中进行编程;
2.可以充分利用历史工作期进行重复指令操作和指令修改;
3.随时查看工作空间中的变量的内容、类型等信息,注意新变量和已经存在的变量的区别。
4.注意在操作过程中可以充分利用矩阵生成函数创建矩阵。
八、思考题
1.如何把当前工作空间保存成一个二进制文件?
2.如何在当前工作空间中恢复以前保存过的工作空间?
3.如何保存当前工作空间中的某些变量?
实验二、符号对象的创建及符号运算
一、实验目的
1.理解符号对象和数值对象之间的差别,以及它们之间的互相转换。
2.了解符号运算和数值运算的特点、区别和优缺点。
3.掌握符号对象的基本操作和运算,以及符号运算的基本应用。
二、实验内容
1.MATLAB工作环境Desktop的启动
双击桌面上的MATLAB6.5快捷方式,启动MATLAB环境。
2.设置当前工作目录
运用实验一提供的方法,将当作工作目录设置为D盘自建的文件夹。
3.课堂内容练习
◆符号对象的生成和使用
(1)符号常数形成中的差异
a1=[1/3,pi/7,sqrt(5),pi+sqrt(5)]%a1是数值常数
a2=sym([1/3,pi/7,sqrt(5),pi+sqrt(5)])%最接近的有理表示
a3=sym('[1/3,pi/7,sqrt(5),pi+sqrt(5)]')%绝对准确的符号数值表示
a24=a2-a3
a1=
0.33330.44882.23615.3777
a2=
[1/3,pi/7,sqrt(5),6054707603575008*2^(-50)]
a3=
[1/3-eps/12,pi/7-13*eps/165,sqrt(5)+137*eps/280,6054707603575008*2^(-50)]
a4=
[1/3,pi/7,sqrt(5),pi+sqrt(5)]
a24=
[0,0,0,189209612611719/35184372088832-pi-5^(1/2)]
(2)把字符表达式转换为符号变量
y=sym('2*sin(x)*cos(x)')%把字符表达式转换为符号变量
y=simple(y)%按规则把已有的y符号表达式化成最简形式
y=
2*sin(x)*cos(x)
y=
sin(2*x)
(3)用符号计算验证三角等式
。
symsfai1fai2;y=simple(sin(fai1)*cos(fai2)-cos(fai1)*sin(fai2))
y=
sin(fai1-fai2)
(4)求矩阵
的行列式值、逆和特征根
symsa11a12a21a22;A=[a11,a12;a21,a22]
DA=det(A),IA=inv(A),EA=eig(A)
A=
[a11,a12]
[a21,a22]
DA=
a11*a22-a12*a21
IA=
[a22/(a11*a22-a12*a21),-a12/(a11*a22-a12*a21)]
[-a21/(a11*a22-a12*a21),a11/(a11*a22-a12*a21)]
EA=
[1/2*a11+1/2*a22+1/2*(a11^2-2*a11*a22+a22^2+4*a12*a21)^(1/2)]
[1/2*a11+1/2*a22-1/2*(a11^2-2*a11*a22+a22^2+4*a12*a21)^(1/2)]
◆识别对象类别的指令
(1)生成三种不同类型的矩阵,给出不同的显示形式
clear,a=1;b=2;c=3;d=4;%产生四个数值变量
Mn=[a,b;c,d]%利用已赋值变量构成数值矩阵
Mc='[a,b;c,d]'%字符串中的a,b,c,d与前面输入的数值变量无关
Ms=sym(Mc)%Ms是一个符号变量,它与前面各变量无关
Mn=
12
34
Mc=
[a,b;c,d]
Ms=
[a,b]
[c,d]
(2)三种矩阵的大小不同
SizeMn=size(Mn),SizeMc=size(Mc),SizeMs=size(Ms)
SizeMn=
22
SizeMc=
19
SizeMs=
22
(3)用class获得每种矩阵的类别
CMn=class(Mn),CMc=class(Mc),CMs=class(Ms)
CMn=
double
CMc=
char
CMs=
sym
(4)用isa判断每种矩阵的类别(若返回1,表示判断正确)
isa(Mn,'double'),isa(Mc,'char'),isa(Ms,'sym')
ans=
1
ans=
1
ans=
1
(5)利用whos观察内存变量的类别和其它属性
whosMnMcMs%观察三个变量的类别和属性
NameSizeBytesClass
Mc1x918chararray
Mn2x232doublearray
Ms2x2408symobject
Grandtotalis21elementsusing458bytes
◆符号表达式中自由变量的确定
(1)生成符号变量
symsabxXY;k=sym('3');z=sym('c*sqrt(delta)+y*sin(theta)');
EXPR=a*z*X+(b*x^2+k)*Y;
(2)找出EXPR中的全部自由符号变量
findsym(EXPR)%除常数符号k外的所有独立符号变量都被列出
ans=
X,Y,a,b,c,delta,theta,x,y
(3)在EXPR中确定一个自由符号变量
findsym(EXPR,1)
ans=
x
(4)在EXPR中确定2个和3个自由变量时的执行情况
findsym(EXPR,2),findsym(EXPR,3)
ans=
x,y
ans=
x,y,theta
◆符号表达式的操作:
简化
symsx;f=(1/x^3+6/x^2+12/x+8)^(1/3);
g1=simple(f),g2=simple(g1)
g1=
(2*x+1)/x
g2=
2+1/x
◆符号数值精度控制和任意精度计算
digits%显示省缺符号数值计算相对精度
Digits=32
p0=sym('(1+sqrt(5))/2');%p0为(1+sqrt(5))/2准确值
p1=sym((1+sqrt(5))/2)%p1是(1+sqrt(5))/2在数值环境下的近似值
e01=vpa(abs(p0-p1))%在符号环境32位省缺精度下,观察p0,p1间误差
p1=
7286977268806824*2^(-52)
e01=
.54321152036825