收藏 分销(赏)

MATLAB 实用教程:第2章MATLAB数值计算.doc

上传人:二*** 文档编号:4595079 上传时间:2024-09-30 格式:DOC 页数:47 大小:400KB 下载积分:5 金币
下载 相关 举报
MATLAB 实用教程:第2章MATLAB数值计算.doc_第1页
第1页 / 共47页
本文档共47页,全文阅读请下载到手机保存,查看更方便
资源描述
第2章 MATLAB数值计算 MATLAB的数学计算=数值计算+符号计算 其中符号计算是指使用未定义的符号变量进行运算,而数值计算不允许使用未定义的变量。 2.1 变量和数据 2.1.1数据类型 数据类型包括:数值型、字符串型、元胞型、结构型等 数值型=双精度型、单精度型和整数类 整数类=无符号类(uint8、uint16、uint32、uint64)和符号类整数(int8、int16、int32、int64)。 2.1.2数据 1. 数据的表达方式 § 可以用带小数点的形式直接表示 § 用科学计数法 § 数值的表示范围是10-309~10309。 以下都是合法的数据表示: -2、5.67、2.56e-56(表示2.56×10-56)、4.68e204(表示4.68×10204) 2. 矩阵和数组的概念 在MATLAB的运算中,经常要使用标量、向量、矩阵和数组,这几个名称的定义如下: § 标量:是指1×1的矩阵,即为只含一个数的矩阵。 § 向量:是指1×n或n×1的矩阵,即只有一行或者一列的矩阵。 § 矩阵:是一个矩形的数组,即二维数组,其中向量和标量都是矩阵的特例,0×0矩阵为空矩阵([])。 § 数组:是指n维的数组,为矩阵的延伸,其中矩阵和向量都是数组的特例。 3. 复数 复数由实部和虚部组成,MATLAB用特殊变量“i”和“j”表示虚数的单位。复数运算不需要特殊处理,可以直接进行。 复数可以有几种表示: z=a+b*i或z=a+b*j z=a+bi或z=a+bj(当b为标量时) z=r*exp(i*theta) l 得出一个复数的实部、虚部、幅值和相角。 a=real(z) %计算实部 b=imag(z) %计算虚部 r=abs(z) %计算幅值 theta=angle(z) %计算相角 说明: 复数z的实部a=r*cos(θ); 复数z的虚部b=r*sin(θ); 复数z的幅值; 复数z的相角theta=arctg(b/a),以弧度为单位。 a=1-2*i a = 1.0000 - 2.0000i real(a) ans = 1 imag(a) ans = -2 abs(a) ans = 2.2361 angle(a)*180/pi %以角度为单位计算相角 ans = -63.4349 2.1.3变量 1. 变量的命名规则 § 变量名区分字母的大小写。例如,“a”和“A”是不同的变量。 § 变量名不能超过63个字符,第63个字符后的字符被忽略,对于MATLAB6.5版以前的变量名不能超过31个字符。 § 变量名必须以字母开头,变量名的组成可以是任意字母、数字或者下划线,但不能含有空格和标点符号(如,。%等)。例如,“6ABC”、“AB%C”都是不合法的变量名。 § 关键字(如if、while等)不能作为变量名。 2. 特殊变量 MATLAB有一些自己的特殊变量,当MATLAB启动时驻留在内存。 表2.1 特殊变量表 特殊变量 取值 ans 运算结果的默认变量名 pi 圆周率π eps 计算机的最小数 flops 浮点运算数 inf 无穷大,如1/0 NaN或nan 非数,如0/0、∞/∞、0×∞ i或 j i=j= nargin 函数的输入变量数目 nargout 函数的输出变量数目 realmin 最小的可用正实数 realmax 最大的可用正实数 l 在MATLAB中系统将计算的结果自动赋给名为“ans”的变量。 2*pi ans = 6.2832 2.2 矩阵和数组 MATLAB最基本也是最重要的功能就是进行实数或复数矩阵的运算。 2.2.1矩阵输入 (1) 矩阵元素应用方括号([])括住; (2) 每行内的元素间用逗号或空格隔开; (3) 行与行之间用分号或回车键隔开; (4) 元素可以是数值或表达式。 1. 通过显式元素列表输入矩阵 c=[1 2;3 4;5 3*2] % [ ]表示构成矩阵,分号分隔行,空格分隔元素 c = 1 2 3 4 5 6 用回车键代替分号分隔行: c=[1 2 3 4 5 6] 1 2 3 4 5 6 2. 通过语句生成矩阵 (1) 使用from:step:to方式生成向量 from:to from:step:to 说明: from、step和to分别表示开始值、步长和结束值。 当step省略时则默认为step=1; 当step省略或step>0而from>to时为空矩阵,当step<0而from<to时也为空矩阵。 【例2.1】使用“from:step:to”方式生成以下矩阵。 x1=2:5 x1 = 2 3 4 5 x2=2:0.5:4 x2 = 2.0000 2.5000 3.0000 3.5000 4.0000 x3=5:-1:2 x3 = 5 4 3 2 x4=2:-1:3 %空矩阵 x4 = Empty matrix: 1-by-0 x5=2:-1:0.5 x5 = 2 1 x6=[1:2:5;1:3:7] %两行向量构成矩阵 x6 = 1 3 5 1 4 7 (2) 使用linspace和logspace函数生成向量 linspace(a,b,n) 说明: a、b、n三个参数分别表示开始值、结束值和元素个数。 生成从a到b之间线性分布的n个元素的行向量,n如果省略则默认值为100。 § logspace用来生成对数等分向量,它和linspace一样直接给出元素的个数而得出各个元素的值。 logspace (a,b,n) 说明: a、b、n三个参数分别表示开始值、结束值和数据个数,n如果省略则默认值为50。生成从10a到10b之间按对数等分的n个元素的行向量。 【例2.2】用linspace和logspace函数生成行向量。 x1=linspace(0,2*pi,5) %从0到2*pi等分成5个点 x1 = 0 1.5708 3.1416 4.7124 6.2832 x2=logspace(0,2,3) %从1到100对数等分成3个点 x2 = 1 10 100 3. 由矩阵生成函数产生特殊矩阵 MATLAB提供了很多能够产生特殊矩阵的函数,各函数的功能如表2.2所示。 表2.2 矩阵生成函数 函数名 功能 例子 输入 结果 zeros(m,n) 产生m×n的全0矩阵 zeros(2,3) ans = 0 0 0 0 0 0 ones(m,n) 产生m×n的全1矩阵 ones(2,3) ans = 1 1 1 1 1 1 rand(m,n) 产生均匀分布的随机矩阵,元素取值范围0.0~1.0。 rand(2,3) ans = 0.9501 0.6068 0.8913 0.2311 0.4860 0.7621 randn(m,n) 产生正态分布的随机矩阵 randn(2,3) ans = -0.4326 0.1253 -1.1465 -1.6656 0.2877 1.1909 magic(N) 产生N阶魔方矩阵(矩阵的行、列和对角线上元素的和相等) magic(3) ans = 8 1 6 3 5 7 4 9 2 eye(m,n) 产生m×n的单位矩阵 eye(3) ans = 1 0 0 0 1 0 0 0 1 注意: zeros、ones、rand、randn和eye函数当只有一个参数n时,则为n×n的方阵; 当eye(m,n)函数的m和n参数不相等时则单位矩阵会出现全0行或列。 【例2.3】查看eye函数的功能。 X1=eye(2,3) X1 = 1 0 0 0 1 0 X2=eye(3,2) X2 = 1 0 0 1 0 0 4. 通过MAT数据文件加载矩阵 通过“load”命令或选择菜单“File”→“Import Data”命令加载MAT数据文件来创建矩阵。 5. 在M文件中创建矩阵 M文件实际上是一种包含MATLAB代码的文本文件; 通过在MATLAB命令窗口中运行M文件创建矩阵。 2.2.2矩阵元素和操作 矩阵和多维数组都是由多个元素组成的,每个元素通过下标来标识。 1. 矩阵的下标 (1) 全下标方式 矩阵中的元素可以用全下标方式标识,即由行下标和列下标表示,一个m×n的a矩阵的第i行第j列的元素表示为a(i,j)。 注意: l 如果在提取矩阵元素值时,矩阵元素的下标行或列(i,j)大于矩阵的大小(m,n),则MATLAB会提示出错; l 而在给矩阵元素赋值时,如果行或列(i,j)超出矩阵的大小(m,n),则MATLAB自动扩充矩阵,扩充部分以0填充。 a=[1 2;3 4;5 6] a = 1 2 3 4 5 6 a(3,3) %提取a(3,3)的值 ??? Index exceeds matrix dimensions. a(3,3)=9 %给a(3,3) 赋值 a = 1 2 0 3 4 0 5 6 9 (2) 单下标方式 先把矩阵的所有列按先左后右的次序连接成“一维长列”,然后对元素位置进行编号。 以m×n的矩阵a为例,若元素a(i,j)则对应的“单下标”为s= (i-1)×m+j。 2. 子矩阵块的产生 子矩阵是从对应矩阵中取出一部分元素构成,用全下标和单下标方式取子矩阵。 (1) 用全下标方式 矩阵a为图2.2所示,则: § 取行数为1、3,列数为2、3的元素构成子矩阵。 a([1 3],[2 3]) ans = 2 0 6 9 § 取行数为1~3,列数为2~3的元素构成子矩阵,“1:3”表示1、2、3行下标。 a(1:3,2:3) ans = 2 0 4 0 6 9 § 取所有行数即为1~3,列数为3的元素构成子矩阵,“:”表示所有行或列。 a(:,3) ans = 0 0 9 § 取行数为1~3,列数为3的元素构成子矩阵,用“end”表示某一维数中的最大值,即3。 a(1:3,end) ans = 0 0 9 (2) 用单下标方式 取单下标为1、3、2、6的元素构成子矩阵。 a([1 3;2 6]) ans = 1 5 3 6 (3) 逻辑矩阵 子矩阵也可以利用逻辑矩阵来标识; 逻辑矩阵是大小和对应矩阵相同,而元素值为0或者1的矩阵。 可以用a(L1,L2)来表示子矩阵,其中L1、L2为逻辑向量,当L1、L2的元素为0则不取该位置元素,反之则取该位置的元素。 【例2.5】利用逻辑矩阵来提取矩阵,其中矩阵a如上图2.2所示。 l1=logical([1 0 1]) %给出逻辑向量l1 l1 = 1 0 1 l2=logical([1 1 0]) %给出逻辑向量l2 l2 = 1 1 0 a(l1,l2) %取出1、3行且1、2列的元素 ans = 1 2 5 6 【例2.5续】逻辑矩阵可以由矩阵进行逻辑运算得出。 b=a>1 %得出逻辑向量b b = 0 1 0 1 1 0 1 1 1 a(b) %按单下标顺序排成长列 ans = 3 5 2 4 6 9 3. 矩阵的赋值 § 全下标方式:a(i,j)=b,给a矩阵的部分元素赋值则b矩阵的行列数必须等于a矩阵的行列数。 clear a a(1:2,1:3)=[1 1 1;1 1 1] %给第一、二行元素赋值为全1 a = 1 1 1 1 1 1 § 单下标方式:a(s)=b,b为向量,元素个数必须等于a矩阵的元素个数。 a(5:6)=[2 3] %给第5、6元素赋值 a = 1 1 2 1 1 3 § 全元素方式:a(:)=b,给a矩阵的所有元素赋值则b矩阵的元素总数必须等于a矩阵的元素总数,但行列数不一定相等。 a=[1 2;3 4;5 6] a = 1 2 3 4 5 6 b=[1 2 3;4 5 6] b = 1 2 3 4 5 6 a(:)=b %按单下标方式给a赋值 a = 1 5 4 3 2 6 4. 矩阵元素的删除 删除操作就是简单地将其赋值为空矩阵(用[]表示)。 a=[1 2 0;3 4 0;5 6 9] a = 1 2 0 3 4 0 5 6 9 a(:,3)=[] %删除一列元素 a = 1 2 3 4 5 6 a(1)=[] %删除一个元素,则矩阵变为行向量 a = 3 5 2 4 6 a=[] %删除所有元素为空矩阵 a = [] 5. 生成大矩阵 在MATLAB中,可以通过方括号“[]”实现将小矩阵联接起来生成一个较大的矩阵。 a=[1 2 0;3 4 0;5 6 9] a = 1 2 0 3 4 0 5 6 9 [a;a] %联接成6×3的矩阵 ans = 1 2 0 3 4 0 5 6 9 1 2 0 3 4 0 5 6 9 a=[1 2 0;3 4 0;5 6 9] [a a] %联接成3×6的矩阵 ans = 1 2 0 1 2 0 3 4 0 3 4 0 5 6 9 5 6 9 a=[1 2 0;3 4 0;5 6 9] [a(1:2,1:2) 10*a(1:2,2:3)] %计算并联接 ans = 1 2 20 0 3 4 40 0 6. 矩阵的翻转 a = 1 2 0 3 4 0 5 6 9 表2.3 常用矩阵翻转函数 函数名 功能 例子 输入 结果 triu(X) 产生X矩阵的上三角矩阵,其余元素补0。 triu(a) ans = 1 2 0 0 4 0 0 0 9 tril(X) 产生X矩阵的下三角矩阵,其余元素补0。 tril(a) ans = 1 0 0 3 4 0 5 6 9 flipud(X) 使矩阵X沿水平轴上下翻转 flipud(a) ans = 5 6 9 3 4 0 1 2 0 fliplr(X) 使矩阵X沿垂直轴左右翻转 fliplr(a) ans = 0 2 1 0 4 3 9 6 5 flipdim(X,dim) 使矩阵X沿特定轴翻转。dim=1,按行维翻转; dim=2,按列维翻转。 flipdim(a,1) ans = 5 6 9 3 4 0 1 2 0 rot90(X) 使矩阵X逆时针旋转900 rot90(a) ans = 0 0 9 2 4 6 1 3 5 2.2.3字符串 在MATLAB中,字符串是作为字符数组来引入的; 一个字符串由多个字符组成,用单引号(’’)来界定; 字符串是按行向量进行存储的,每一字符(包括空格)是以其ASCII码的形式存放。 clear str1='Hello' str1 = Hello str2='I like ''MATLAB''' %重复单引号来输入含有单引号的字符串 str2 = I like 'MATLAB' str3='你好!' %支持中文 str3 = 你好! 1. 字符串占用的字节 whos Name Size Bytes Class str1 1x5 10 char array str2 1x15 30 char array str3 1x3 6 char array Grand total is 23 elements using 46 bytes 2. 字符串函数 § length:用来计算字符串的长度(即组成字符的个数)。 § double:用来查看字符串的ASCII码储存内容,包括空格(ASCII码为32)。 § char:用来将ASCII码转换成字符串形式。 § class或ischar:用来判断某一个变量是否为字符串。class函数返回char则表示为字符串,而ischar函数返回1表示为字符串。 § strcmp(x,y):比较字符串x和y的内容是否相同。返回值如果为1则相同,为0则不同。 § findstr(x,x1):寻找在某个长字符串x中的子字符串x1,返回其起始位置。 § deblank(x ):删除字符串尾部的空格。 由于MATLAB将字符串以其相对应的ASCII码储存成一个行向量,因此如果字符串直接进行数值运算,则其结果就变成一般数值向量的运算,而不再是字符串的运算。 length(str1) %字符串长度 ans = 5 x1=double(str1) %查看字符串的ASCII码 x1 = 72 101 108 108 111 x2=str1+1 %字符串的数值运算 x2 = 73 102 109 109 112 char(x1) %将ASCII码转换成字符串形式 ans = Hello char(x2) ans = Ifmmp class(str1) %判断变量类型 ans = char class(x1) ans = double ischar(str1) ans = 1 3. 使用一个变量来储存多个字符串 (1) 多个字符串组成一个新的行向量 将多个字符串变量直接用“,”连接,构成一个行向量,就可以得到一个新字符串变量。 clear str1='Hello'; str2='I like ''MATLAB'''; str3='你好!' str4=[str1,'! ',str2] %多个字符串并排成一个行向量 str4 = Hello! I like 'MATLAB' (2) 使用二维字符数组 将每个字符串放在一行,多个字符串可以构成一个二维字符数组,但必须先在短字符串结尾补上空格符,以确保每个字符串(即每一行)的长度一样。否则MATLAB会提示出错: str5=[str1;str3] ??? Error using ==> vertcat All rows in the bracketed expression must have the same number of columns. str5=[str1;str3,' '] %将str3添加两个空格 str5 = Hello 你好! (3) 使用str2mat、strvcat和char函数 使用专门的str2mat、strvcat和char函数可以构造出字符串矩阵,而不必考虑每行的字符数是否相等,总是按最长的设置,不足的末尾用空格补齐。 str6=str2mat(str1,str2,str3) str6 = Hello I like 'MATLAB' 你好! str7=char(str1,str2,str3) str7 = Hello I like 'MATLAB' 你好! str8=strvcat(str1,str2) str8 = Hello I like 'MATLAB' whos Name Size Bytes Class str1 1x5 10 char array str2 1x15 30 char array str3 1x3 6 char array str4 1x22 44 char array str5 2x5 20 char array str6 3x15 90 char array str7 3x15 90 char array str8 2x15 60 char array Grand total is 186 elements using 350 bytes 5. 执行字符串 如果需要直接“执行”某一字符串,可以使用eval命令,效果就如同直接在MATLAB命令窗口内输入此命令。 str9='a=2*5' str9 = a=2*5 eval(str9) %执行字符串 a = 10 6. 显示字符串 字符串可以直接使用disp命令显示出来,即使后面加分号(;)也显示。 disp('请输入2*2的矩阵a') 请输入2*2的矩阵a disp(str1) Hello 2.2.4矩阵和数组运算 矩阵运算有明确而严格的数学规则,矩阵运算规则是按照线性代数运算法则定义的; 数组运算是按数组的元素逐个进行的。 1. 矩阵运算的函数 a = 1 2 3 4 5 6 7 8 9 表2.4 常用矩阵运算函数 函数名 功能 例子 输入 结果 det(X) 计算方阵行列式 det(a) ans = 0 rank(X) 求矩阵的秩,得出的行列式不为零的最大方阵边长。 rank(a) ans = 2 inv(X) 求矩阵的逆阵,当方阵X的det(X)不等于零,逆阵X-1才存在。X 与X-1相乘为单位矩阵。 inv(a ) Warning: Matrix is close to singular or badly scaled. Results may be inaccurate. RCOND = 1.541976e-018. ans = 1.0e+016 * -0.4504 0.9007 -0.4504 0.9007 -1.8014 0.9007 -0.4504 0.9007 -0.4504 [v,d]=eig(X) 计算矩阵特征值和特征向量。如果方程Xv=vd存在非零解,则v为特征向量,d为特征值。 [v,d]=eig(a) v = -0.2320 -0.7858 0.4082 -0.5253 -0.0868 -0.8165 -0.8187 0.6123 0.4082 d = 16.1168 0 0 0 -1.1168 0 0 0 -0.0000 diag(X) 产生X矩阵的对角阵 diag(a) ans = 1 5 9 [l,u]=lu(X) 方阵分解为一个准下三角方阵和一个上三角方阵的乘积。l为准下三角阵,必须交换两行才能成为真的下三角阵。 [l,u]=lu(a) l = 0.1429 1.0000 0 0.5714 0.5000 1.0000 1.0000 0 0 u = 7.0000 8.0000 9.0000 0 0.8571 1.7143 0 0 0.0000 [q,r]=qr(X) m×n阶矩阵X分解为一个正交方阵q和一个与X同阶的上三角矩阵r的乘积。方阵q的边长为矩阵X的n和m中较小者,且其行列式的值为1。 [q,r]=qr(a) q = -0.1231 0.9045 0.4082 -0.4924 0.3015 -0.8165 -0.8616 -0.3015 0.4082 r = -8.1240 -9.6011 -11.0782 0 0.9045 1.8091 0 0 -0.0000 [u,s,v]=svd(X) m×n阶矩阵X分解为三个矩阵的乘积,其中u,v为n×n阶和m×m阶正交方阵,s为m×n阶的对角阵,对角线上的元素就是矩阵X的奇异值,其长度为n和m中的较小者。 [u,s,v]=svd(a) u = -0.2148 0.8872 0.4082 -0.5206 0.2496 -0.8165 -0.8263 -0.3879 0.4082 s = 16.8481 0 0 0 1.0684 0 0 0 0.0000 v = -0.4797 -0.7767 -0.4082 -0.5724 -0.0757 0.8165 -0.6651 0.6253 -0.4082 说明: 在上表中det(a)=0或det(a)虽不等于零但数值很小接近于零,则计算inv(a)时,其解的精度比较低,用条件数(求条件数的函数为cond)来表示,条件数越大,解的精度越低, MATLAB会提出警告:“条件数太大,结果可能不准确”。 a=[1 2 3;4 5 6;7 8 9] a = 1 2 3 4 5 6 7 8 9 inv(a) Warning: Matrix is close to singular or badly scaled. Results may be inaccurate. RCOND = 1.541976e-018. ans = 1.0e+016 * -0.4504 0.9007 -0.4504 0.9007 -1.8014 0.9007 -0.4504 0.9007 -0.4504 2. 矩阵和数组的算术运算 (1) 矩阵和数组的加+、减运算- l A和B矩阵必须大小相同才可以进行加减运算。 l 如果A、B中有一个是标量,则该标量与矩阵的每个元素进行运算。 (2) 矩阵和数组的乘法*运算 l 矩阵A的列数必须等于矩阵B的行数,除非其中有一个是标量。 l 数组的乘法运算符为“.*”,表示数组A和B中的对应元素相乘。A和B数组必须大小相同,除非其中有一个是标量。 x1=[1 2;3 4;5 6]; x2=eye(3,2) x2 = 1 0 0 1 0 0 x1+x2 %矩阵相加 ans = 2 2 3 5 5 6 x1.*x2 %数组相乘 ans = 1 0 0 4 0 0 x1*x2 %矩阵相乘x1列数不等于x2行数 ??? Error using ==> * Inner matrix dimensions must agree. x3=eye(2,3) x3 = 1 0 0 0 1 0 x1*x3 %矩阵相乘 ans = 1 2 0 3 4 0 5 6 0 (3) 矩阵和数组的除法 § 矩阵运算符为“\”和“/”分别表示左除和右除。 A\B=A-1*B A/B=A*B-1。 其中:A-1是矩阵的逆,也可用inv(A)求逆矩阵。 § 数组的除法运算表达式 “A.\B”和“A./B”,分别为数组的左除和右除,表示数组相应元素相除。 A和B数组必须大小相同,除非其中有一个是标量。 【例2.12】已知方程组,用矩阵除法来解线性方程组。 解:将该方程变换成AX=B的形式。 其中: , A=[2 -1 3;3 1 -5;4 -1 1] A = 2 -1 3 3 1 -5 4 -1 1 B=[5;5;9] B = 5 5 9 X=A\B X = 2 -1 0 l 在线性方程组A*X=B中,m×n阶矩阵A的行数m表示方程数,列数n表示未知数的个数。 l n=m,A为方阵,A\B=inv(A)*B。 l m > n,是最小二乘解,X=inv(A’*A)*(A’*B) l m < ,则是令X中的n-m个元素为零的一个特殊解。X=inv(A’*A)*(A’*B) (4) 矩阵和数组的
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传

当前位置:首页 > 教育专区 > 其他

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2025 宁波自信网络信息技术有限公司  版权所有

客服电话:4009-655-100  投诉/维权电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服