1、http:/ 与线性代数(一)1 简介MATLAB 是一套功能十分强大的工程计算机及数据分析软件,它的应用范围覆盖了当今所有的工业、电力、电子、医疗、建筑等各领域。 1980 年前后,MATLAB 的首创者 Cleve Moler 博士在 New Mexico 大学讲授线性代数课程时,看到了用高级语言编程解决工程计算问题的诸多不便,因而构思开发了 MATLAB 软件(MATrix LABoratory,矩阵实验室),该软件利用了 Moler博士在此前开发的 LINPACK(线性代数软件包)和 EOSPACK(基于特征值计算的软件包)中可靠的子程序,用 Fortran 语言编写而成,集命令翻译、
2、工程计算功能于一身。 与 Fortran 和 C 等高级语言比较,MATLAB 的语法规则更简单,更重要的是其贴近人思维方式的编程特点,使得用 MATLAB 编写程序犹如在便笺上列公式和求解。 80 年代初期,Cleve Moler 和 John Little 采用 C 语言改写了 MATLAB 的内核。不久,他们成立了 Mathworks 软件开发公司并将 MATLAB 正式推向市场。 现在的 MATLAB 新版本早已不只停留在工程计算的功能上了,它由主包、Simulink 以及功能各异的工具箱组成,以矩阵运算为基础,把计算、可视化、程序设计融合到了一个简单易用的交互式工作环境中。在这里可以
3、实现工程计算、算法研究、符号运算、建模和仿真、原型开发、数据分析及可视化、科学和工程绘图、应用程序设计(包括图形用户界面设计)等等功能。 正式凭借 MATLAB 的这些突出的优势,它现在已成为世界上应用最广泛的工程计算软件。在美国等发达国家的大学里 MATLAB 是一种必须掌握的基本工具,http:/ 正在成为计算机应用软件中的一个热点。 2 矩阵的形成值运算是 MATLAB 最基本、最重要的功能,MATLAB 能够成为世界上最优秀的数学软件之一,和它出色的数值运算能力是分不开的。 MATLAB 以负数矩阵作为基本的运算单元,向量和标量都作为特殊的矩阵来处理:向量看作只有一行或一列的矩阵;标量
4、通常看作只有一个元素的矩阵,在一些特殊的情况下有一定的变化。 1.简单的矩阵的生成在 MATLAB 中,可以采用多种不同的方式生成矩阵。 (1)直接输入矩阵元素 对于较小的简单的矩阵,从键盘上直接输入矩阵是最常用、最方便和最好的数值矩阵创建方法。直接从键盘输入一系列元素生成矩阵,只要遵循下面几个基本原则: 1、矩阵每一行的元素必须用空格或逗号分开; 2、在矩阵中,采用分号或回车表明每一行的结束; 3、整个输入矩阵必须包含在方括号“”中。 注意:创建矩阵在方括号的末尾,可以用回车或分号结束。用回车结束,显示所输入的矩阵;用分号结束,所输入的矩阵不显示。 输入:A=4,5,7,8;6,1,2,5;
5、3,5,4,6;4,2,4,8 http:/ = 4 5 7 8 6 1 2 5 3 5 4 6 4 2 4 8 (2)生成大矩阵 在 MATLAB 中,可以将小矩阵连接起来生成一个较大的矩阵。事实上,前面直接输入法生成矩阵就是将单个元素连接起来生成矩阵。方括号“”就是连接算子。 输入:B=A,A+1;A+2,A+3 显示:B = 4 5 7 8 5 6 8 9 6 1 2 5 7 2 3 6 3 5 4 6 4 6 5 7 4 2 4 8 5 3 5 9 6 7 9 10 7 8 10 11 8 3 4 7 9 4 5 8 5 7 6 8 6 8 7 9 6 4 6 10 7 5 7 11
6、2.常用矩阵的生成下面介绍一些常用矩阵的生成命令:zeros,ones,eye,rand 和 randn。 (1)zeros 生成全 0 阵 http:/ nn 的全 0 矩阵;如果 n 不是标量将给出出错信息。 B=zeros(m,n):生成 mn 的全 0 矩阵。 B=zeros(size(A):生成与矩阵 A 大小相同的全 0 阵。 注意:在 MATLAB 中不需要预先定义矩阵的维数,MATLAB 自动为矩阵分配存储空间。尽管如此,如果采用全零阵为矩阵生成的全部元素或某一行、某一列的元素保留存储空间,则大多数 MATLAB 程序将运行得更快。 (2)ones 生成全 1 阵 调用格式为:
7、 Y=ones(n):生成 nn 的全 1 矩阵;如果 n 不是标量将给出出错信息。 Y=ones(m,n):生成 mn 的全 1 阵。 Y=ones(size(A):生成与矩阵 A 大小相同的全 1 阵。 (3)eye 生成单位阵 调用格式为: Y=eye(n):生成 nn 的单位阵。 Y=eye(m,n):生成 mn 的矩阵,其对角线元素为 1,其它元素为 0。 Y=eye(size(A):生成一个与矩阵 A 大小相同的单位阵。 注意:在 MATLAB 中,单位阵的定义比线性代数中的定义更广泛。例如: 输入:eye(3,2) 显示:ans = 1 0 0 1 http:/ 0 (4)ran
8、d 生成均匀分布的随机阵 调用格式为: Y=rand(n):生成一个 nn 的随机阵:如果 n 不是标量将给出出错信息。 Y=rand(m,n):生成一个 mn 随机阵。 Y=rand(size(A):生成一个与矩阵 A 大小相同的随机阵。 说明:rand 函数产生 0,1 之间均匀分布的随机数。 (5)randn 正态分布随机阵 命令的形式为: Y=randn(n):生成一个 nn 的随机阵:如果 n 不是标量将给出出错信息。Y=randn(m,n):生成一个 mn 随机阵。 Y=rand(size(A):生成一个与矩阵 A 大小相同的随机阵。 3 矩阵的基本运算一、矩阵运算在 MATLAB
9、 语言中,矩阵的运算既可以使用运算符,也可以使用等效的运算函数。 (1)加法和减法运算 对于矩阵运算可以由下面的命令执行加减法: C=A+B 或 C=plus(A,B) C=A-B 或 C=minus(A,B) http:/ A 和 B 的大小必须相同,因为加减运算是把 A 和 B 的对应元素相加减。如果 A 和 B 的大小不同,MATLAB 将自动给出错误信息。 特殊情况是 A 和 B 中有一个是标量,MATLAB 允许标量和任意大小的矩阵相加减,结果是把矩阵中的每个元素和这个标量相加减。 在 MATLAB 中,算术运算符“+”和“-”可以作为一元运算符使用。+A 就是取 A,而-A 则是对
10、 A 中的每个元素取负。 输入:A=1 2 3;4 5 6; B=7 8 9;4 6 8;C=A+B 显示:C = 8 10 12 8 11 14 输入:C=C-2 显示:C = 6 8 10 6 9 12 输入:C=-C 显示:C = -6 -8 -10 -6 -9 -12 (2)乘法运算 矩阵乘的运算命令为:A*B 或 mtimes(A,B) http:/ A*B 是矩阵 A 和 B 的线性代数乘。就是说,对于非标量 A 和 B,矩阵A 的列数必须等于矩阵 B 的行数。标量可以和任意大小的矩阵相乘,就是线性代数中的数与矩阵的乘法。输入:A=1 2 3;4 5 6;B=ones(3)显示:B
11、 = 1 1 1 1 1 1 1 1 1 输入:C=A*B 显示:C = 6 6 6 15 15 15 (3)矩阵求逆 行数和列数相等的矩阵称为方阵,只有方阵有逆矩阵。方阵的求逆函数为: B=inv(A) 该函数返回方阵 A 的逆阵。如果 A 不是方阵或接近奇异的,则会给出警告信息。 在实际应用中,很少显式的使用矩阵的逆。在 MATLAB 中不是使用逆阵x=inv(A)*B 来求线性方程组 Ax=B 的解,而是使用矩阵除法运算 x=AB 来求解。因为 MATLAB 设计求逆函数 inv 时,采用的是高斯消去法,而设计除法解线性方程组时,并不求逆,而是直接采用高斯消去法求解,有效的减小了残差,并
12、提高了求解的速度。因此,MATLAB 推荐尽量使用除法运算,少用求逆运算。 http:/ 在线性代数中,只有矩阵的逆的定义,而没有矩阵除法的运算。而在MATLAB 中,定义了矩阵的除法运算。矩阵除法的运算在 MATLAB 中是一个十分有用的运算。根据实际问题的需要,定义了两种除法命令:左除和右除。 矩阵左除: C=AB 或 C=mldivide(A,B) 矩阵右除; C=A/B 或 C=mrdivide(A,B) 通常矩阵左除不等于右除,如果 A 是方阵,AB 等效于 A 的逆阵左乘矩阵B。也就是 inv(A)*B。如果 A 是一个 nn 矩阵,B 是一个 n 维列向量,或是有若干这样的列的矩
13、阵,则 AB 就是采用高斯消去法求得的方程 AX=B 的解。如果 A接近奇异的,MATLAB 将会给出警告信息。 如果 A 是一个 mn 矩阵,其中 m 不等于 n,B 是一个 m 维列向量,或是由若干这样的列的矩阵,则 X=AB 是不定或超定方程组 AX=B 的最小二乘解。通过QR 分解确定矩阵 A 的秩 k,方程组的解 X 每一列最多只有 k 个非零元素。如果k0 为主对角线以上,k0 位于主对角线以上,k0 位于主对角线以上,kn:超定方程组,寻求最小二乘解;3 mn:不定方程组,寻求基本解,其中至多有 m 个非零元素。针对不同的情况,左除算子采用不同的算法求解。1.适定方程组一般形式的
14、线性方程组为:Ax=b 或 AX=B 其中 A 是个方阵,b 是一个列向量,B 是个方阵,X 是一个与 A,B 同样大小的方阵。它们的求解命令为:x=Ab 或 X=AB 如果 A 是奇异的,则 AX=B 的解或者不存在,或者存在但不唯一。http:/ A 接近奇异时,AB 将给出警告信息,如果发现 A 是奇异的,一方面给出警告信息,另一方面给出结果为 inf。如果 A 是正定的,可进行 Cholesky 分解 A=RT*R,从而可对线性方程组A*x=b 进行如下替换;RT*Rx=b 由于左除算子可以处理三角矩阵,因此可以快速的解出:x=R(R Tx) 如果 A 可进行 LU 分解 A=L*U,
15、则线性方程组 A*x=b,可如下进行快速计算:x=U(Lb) 2.超定方程组线性超定方程组经常遇到的问题就是实验数据的曲线拟合问题。对于超定方程,在 MATLAB 中,利用左除命令寻求它的最小二乘解。其调用格式为:c=Ey E*c 并不是精确的等于 y,但是它们的差值小于原始数据的测量误差。3.不定方程组不定线性方程组未知量的个数多余方程数。解是不唯一的。MATLAB 将寻求一个基本解,其中至多只有 m 个非零元素。特解由列主元 QR 分解求得。三、矩阵特征值与特征向量1. 特征值与特征向量如果 A 是 nn 方阵,n 个值满足关系式:Av=v则为 A 的特征值,v 为 A 的特征向量。特征值
16、问题时值方程 Ax=x 的非平凡解问题。其中 A 是个 nn 矩阵,x 是一个长度为 n 的列向量,是个标量。满足方程的 n 个值是特征值,对应的 x 值是特征向量。在 MATLAB 中,eig 函数求解特征值,给出特征向量。http:/ A 的特征值构成的对角矩阵,以及由对应的特征向量构成矩阵 V 的各列,满足:AV=VD 如果 V 是非奇异的,则这就是矩阵 A 的特征值分解。特征值分解的函数 eig 调用格式为:1D=eig(A):返回矩阵 A 的特征值2V,D=eig(A):生成特征值矩阵 D 和特征向量构成的矩阵 V,使得A*V=V*D。矩阵 D 由 A 的特征值在主对角线构成的对角矩
17、阵。V 是由 A 的特征向量按列构成的矩阵。3V,D=eig(A,nobalance):计算矩阵的特征值和特征向量,而不采用预先平衡。通常,预先平衡增加了特征值和特征向量的计算精度。然而,如果一个矩阵包含由于舍入误差引入的小元素,平衡过程有可能将它们放大,使得它们和原始矩阵中的其它元素大致相当,从而导致错误的特征值。在这种情况下,使用“nobalance”选项。2.特征多项式在 MATLAB 中,是采用行向量表示多项式,将多项式的系数按降幂次序存放在行向量中。多项式 P(x)=a0xn+a1xn-1+an-1x+an的系数行向量为:a0,a1,an-1,an 给定矩阵 A,建立多项式的函数是:ploy(A)。当 A 为 nn 矩阵时,返回值将是 n+1 个元素的行向量,是该矩阵特征多项式的特征多项式的系数。例:输入:A=3 1;-1 3;poly(A)显示:ans = 1 -6 8 就是说特征多项式是: 2-6+8 http:/ A 为行阶梯型的函数是:B=rref(A) 例:输入:A=1 -2 -1 0 2;-2 4 2 6 -6;2 -1 0 2 3;3 3 3 3 4;rref(A)显示:ans = 1.0000 0 0.3333 0 1.7778 0 1.0000 0.6667 0 -0.1111 0 0 0 1.0000 -0.33330 0 0 0 0