通信原理MATLAB仿真教程(中国通信学会普通高等教育“十二五”规划教材立项项目)(txt+pdf+epub+mobi电子书下载)


发布时间:2020-10-11 02:31:57

点击下载

作者:赵鸿图茅艳主编

出版社:高等教育出版分社

格式: AZW3, DOCX, EPUB, MOBI, PDF, TXT

通信原理MATLAB仿真教程(中国通信学会普通高等教育“十二五”规划教材立项项目)

通信原理MATLAB仿真教程(中国通信学会普通高等教育“十二五”规划教材立项项目)试读:

前言

MATLAB是目前国际上流行的进行科学研究、工程计算的软件。它起源于矩阵运算,并已经发展成为一种高度集成的计算机语言。MATLAB具有强大的数学运算能力、方便实用的绘图功能及语言的高度集成性。除具备卓越的数值计算能力之外,它还提供了专业水平的符号计算、文字处理、可视化建模仿真、实时控制等功能。MATLAB的基本数据单位是矩阵,它的指令表达式与数学工程中常用的表达式十分相似,因此用MATLAB来解决运算问题要比用C、Fortran等语言完成相同的事情方便得多。可以预见,在科学运算、自动控制、科学绘图、通信仿真等领域,MATLAB语言将长期保持其独一无二的地位。

在通信领域MATLAB更是优势明显,因为通信领域中很多问题是研究系统性能的,传统的方法只有构建一个实验系统,采用各种方法进行测量,才能得到所需的数据,这样不仅需要花费大量的资金用于实验系统的构建,而且系统构建周期长,系统参数的调整也十分困难。而 MATLAB的出现使得通信系统的仿真能够用计算机模拟实现,免去构建实验系统的不便,而且操作十分简便,只需要输入不同的参数就能得到不同情况下系统的性能,而且在结构的观测和数据的存储方面也比传统的方式有很多优势。因而MATLAB在通信仿真领域得到越来越多的应用。

本书可用作《通信原理》或其他通信系统方面的理论教科书的参考书或补充教材。本书的特点是由浅入深,从基本的MATLAB操作讲起,即使读者以前没有接触过MATLAB,也能在本书的引导下一步一步从基本的MATLAB操作开始,逐渐掌握MATLAB的通信系统仿真。

本书的特色是首先介绍通信原理的基本理论,然后以实例说明算法转化为流程,再到程序的思想过程,让读者学会处理具体问题的建模编程方法。本书共分为10章。第1章为MATLAB的基本操作,简要介绍MATLAB的基本知识;第2章为M文件程序设计,介绍M文件的编制;第3章为MATLAB绘图,介绍MATLAB的常用绘图命令与菜单操作;第4章为信号与系统的MATLAB仿真,介绍常用信号的MATLAB建模与仿真方法;第5章为模拟调制;第6章为模拟信号的数字传输;第7章为数字信号的基带传输;第8章为数字信号的频带传输;第9章为信道容量和编码;第10章为扩频通信系统。在这些章节中,不仅讲述了通信原理中涉及的基本理论,而且通过实例来演绎和深化MATLAB编程仿真的基本思想与算法流程,理论联系实际,并在重要概念上作适当延伸。

本书由河南理工大学赵鸿图、茅艳任主编,赵军良、苏玉娜任副主编。具体编写分工如下:赵鸿图编写第5章、第6章、第9章,茅艳编写第1章、第3章,赵军良编写第2章,王俊峰编写第4章,苏玉娜编写第7章、第8章,孙江峰编写第10章。全书由赵鸿图、茅艳统稿并定稿。在本书的编写过程中,燕景、刘平、席冬梅、庞小澎、刘坤进行了部分内容的文字输入和绘图工作,在此表示感谢。

本书可作为高等院校通信工程、信息工程、电子工程等专业本科生相关课程的参考书和补充教材,也可供相关工程技术人员和科研人员学习参考。

由于编写时间仓促,书中难免有疏漏之处,希望广大读者批评指正。编者2010年9月

第1章 MATLAB基本操作

MATLAB原为矩阵实验室的意思,其基本处理对象就是矩阵,而且MATLAB大部分运算或命令都是以(复)矩阵为基本单元进行的。因此,MATLAB中矩阵的运算功能可以说十分全面和强大,学习MATLAB也要从学习MATLAB的矩阵运算和运算功能开始。下面我们首先来了解一下MATLAB的运行环境。

1.1 运行环境介绍

1.1.1 MATLAB的运行方式

MATLAB提供了两种运行方式,即命令行方式和M文件方式。两种运行方式各有特点,下面分别介绍。

1.命令行运行方式

可以通过直接在命令窗口输入命令行来实现计算或作图功能。例如,要求矩阵A和B的和,其中

首先打开MATLAB界面,如图1-1所示。

在命令窗口中输入下面的命令行:

A=[2 5;6 3];

B=[-7 9;-2 0];

C=A+B

最终显示:

C=

-5  14

4  3

2.M文件运行方式

在MATLAB窗口中单击File菜单,然后依次选择New→M-File命令,打开M文件输入运行界面,如图1-2所示。在该窗口中输入程序文件,可以进行调试或运行。与命令行方式相比,M文件方式的优点是可调试,可重复应用。图1-1 MATLAB界面图1-2 M文件输入运行界面

对于前面的矩阵求和问题,在M文件输入运行界面中输入程序,如图1-2所示。然后在Debug菜单中选择Run选项,将在命令窗口输出矩阵A+B=C的值。

1.1.2 MATLAB中的窗口

MATLAB中常见的窗口有命令窗口、M文件窗口、当前目录窗口、工作空间窗口、命令历史窗口、GUI制作窗口等。

1.命令窗口

命令窗口如图1-1中右侧窗口所示。在该窗口中可以输入命令行,实现计算或绘图功能。命令窗口中有一些常用的功能键,利用它们可以使操作更简便快捷。常见的功能键如表1-1所示。表1-1 命令窗口常用功能键

2.M文件窗口

M文件窗口如图1-2所示。利用Edit菜单中的选项,可以对M文件进行编辑;利用Debug菜单中的选项,可以进行调试,可以设置和取消断点,可以确定运行方式,如逐行运行、运行至光标处等,单击Run选项,进行运行。

3.当前目录窗口

当前目录窗口如图1-3所示,该窗口中显示当前目录下所有文件的文件名、文件类型和最后修改时间。

4.工作空间窗口

工作空间窗口中列出数据的变量信息,包括变量名、变量数组大小、变量字节大小和变量类型,如图1-4所示。

5.命令历史窗口

命令历史窗口如图1-5所示,它显示命令窗口中所有执行过的命令。利用该窗口,一方面可以查看曾经执行过的命令;另一方面,可以重复利用原来输入的命令行。可以从命令历史窗口中直接通过双击某个命令来执行该命令,也可以通过拖拉或复制操作,将命令行复制到命令窗口后再执行。图1-3 当前目录窗口图1-4 工作空间窗口图1-5 命令历史窗口

6.GUI制作窗口

在File菜单下选择New次级菜单中的GUI选项,打开图形用户界面制作窗口,如图1-6所示。利用窗口左侧工具栏中的按钮,可以在右侧窗口中绘出按钮、单选钮、滚动条、文本框、列表框、坐标系统等多个控件。就像在Visual Basic和Visual C++程序设计软件中所做的一样,因而能够快速、方便地实现面向对象编程,生成操作友好的图形用户界面程序。图1-6 图形用户界面(GUI)制作窗口

1.2 矩阵的生成

MATLAB语言中,矩阵主要分为3类:数值矩阵、符号矩阵和特殊矩阵,其中数值矩阵有实数数值矩阵和复数数值矩阵两种。生成不同矩阵的方法并不完全相同,下面介绍3种建立矩阵的方法。

1.2.1 使用直接输入法建立矩阵

MATLAB语言强大的功能之一是能直接处理矩阵,当然首要任务是输入待处理的矩阵。最简单的建立矩阵的方法是从键盘直接输入矩阵的元素,同一行的各个元素之间用空格或逗号来分隔,空格个数不限,不同行用分号分隔或者分行输入,所有元素置于一对方括号([ ])内。例如,在命令窗口中输入以下指令:

A=[1,2,3,4;2,3,4,5;3,4,5,6]

则: A=

1  2  3  4

2  3  4  5

3  4  5  6

这样,在 MATLAB的工作空间中就建立了一个矩阵 A,以后就可以使用矩阵 A。在输入矩阵的元素时,也可以分成几行输入,用回车键代替分号,具体指令如下:

A=[1 2 3 4

2 3 4 5

3 4 5 6]

则: A=

1  2  3  4

2  3  4  5

3  4  5  6

比较两次结果,可以发现两种方式输入结果相同。

矩阵元素也可以是表达式,MATLAB将自动计算结果。例如,在命令窗口输入:

B=[10,5-sqrt(7),sin(pi/2);7,4*8,abs(-7)]

则: B=

10.000 0  2.354 2  1.000 0

7.000 0 32.000 0  7.000 0

MATLAB中的矩阵元素可以是复数,建立复数矩阵的方法和上面介绍的方法相同。例如,建立复数矩阵:

B=[3+2i,2+6i;5+3i,4-2i]

则: B=

3.000 0+2.000 0i 2.000 0+6.000 0i

5.000 0+3.000 0i 4.000 0 - 2.000 0i

也可以分别建立实部矩阵和虚部矩阵,再合起来构成复数矩阵,例如:

BR=[3,2;5,4]; BI=[2,2;3,-2];

B=BR+BI*i

则: B=

3.000 0+2.000 0i 2.000 0+2.000 0i

5.000 0+3.000 0i 4.000 0 - 2.000 0i

由复数矩阵这种生成方法可以看出MATLAB指令对数组元素“并行操作”的实质。

1.2.2 使用函数建立矩阵

MATLAB提供了生成和操作矩阵的函数,可以利用它们建立矩阵。(1)利用reshape函数建立数值矩阵

在命令窗口中输入以下指令:

a=1:9;

b=reshape(a,3,3)

则: b=

1  4  7

2  5  8

3  6  9

这里产生了9个元素的行向量a,然后将行向量改成了3×3矩阵b=[1,4,7;2,5,8;3,6,9]。(2)利用diag函数建立对角矩阵

在命令窗输入以下指令:

A=rand(4,4)

则: A=

0.950 1  0.891 3  0.821 4  0.921 8

0.231 1  0.762 1  0.444 7  0.738 2

0.606 8  0.456 5  0.615 4  0.176 3

0.486 0  0.018 5  0.791 9  0.405 7

B=diag(A)

则: B=

0.950 1

0.762 1

0.615 4

0.405 7

C=diag(B)

则: C=

0.950 1    0    0    0

0  0.762 1    0    0

0    0  0.615 4    0

0    0    0  0.405 7

本例首先使用rand函数生成4×4矩阵A,然后利用矩阵A的主对角线元素建立矩阵B,并利用矩阵B中元素构建对角矩阵C。

1.2.3 使用M文件建立矩阵

对于较大且比较复杂的矩阵,可以通过建立一个 M 文件的方式创建。M 文件是一种可以在MATLAB环境下运行的文本文件。它可以分为命令式文件和函数式文件两种。这里主要使用命令式文件,用它的最简单形式建立大型矩阵。下面通过一个简单的例子来说明如何利用M文件创建矩阵。【例1-1】利用M文件建立mdata矩阵。

解:启动有关文本编辑程序或MATLAB的M-file编辑器,在M文件中输入以下指令。

mdata=[1.1 1.2 1.3 1.4 1.5 1.6 1.7 1.8 1.9

2.1 2.2 2.3 2.4 2.5 2.6 2.7 2.8 2.9

3.1 3.2 3.3 3.4 3.5 3.6 3.7 3.8 3.9

4.1 4.2 4.3 4.4 4.5 4.6 4.7 4.8 4.9]

输入完成后把M文件存盘,文件名设为m_mat.m。

接下来在MATLAB命令窗口中输入m_mat,即刻运行M文件,就会自动建立一个名为mdata的矩阵,可供以后使用。

则:mdata=

1.100 0  1.200 0  1.300 0  1.400 0  1.500 0  1.600 0  1.700 0 1.800 0  1.900 0

2.100 0  2.200 0  2.300 0  2.400 0  2.500 0  2.600 0  2.700 0 2.800 0  2.900 0

3.100 0  3.200 0  3.300 0  3.400 0  3.500 0  3.600 0  3.700 0 3.800 0  3.900 0

4.100 0  4.200 0  4.300 0  4.400 0  4.500 0  4.600 0  4.700 0 4.800 0  4.900 0

1.3 基本运算

1.3.1 算术运算

MATLAB的基本算术运算有+(加)、−(减)、*(乘)、/(右除)、\(左除)、^(乘方)。

这些算术运算符的运算规则不难理解,但必须注意,所有这些运算是在矩阵意义下进行的,单个数据的算术运算只是一种特例。

1.矩阵的加减运算

假定有两个矩阵A和B,则可以由A+B和A−B实现矩阵的加减运算。运算规则是:A和B矩阵的维数相同,则可以执行矩阵的加减运算,A和B的对应元素相加减;如果A与B的维数不相同,则MATLAB将给出错误信息,提示用户两个矩阵的维数不匹配。【例1-2】A=[1,2;3,4],B=[5,6;7,8],求x1=A+B,x2=A−B。

解:在MATLAB命令窗口键入以下命令。

A=[1,2;3,4];

B=[5,6;7,8];

x1=A+B

x2=A-B

则: x1=

6  8

10  12

x2=

-4  -4

-4  -4

一个标量也可以和其他不同维数的矩阵进行加减运算。例如:

x=[3,0,-1;2,7,4];

y=x-1;

y=y+x

则: y=

5  -1  -3

3  13  7

2.矩阵乘法

假定有两个矩阵A和B,若A为m×n矩阵,B为n×p矩阵,则C=A·B为m×p矩阵,其各个元素为

例如:

A=[2,5,7;1,3,6;3,2,5];

B=[1,3,5;2,4,6;5,6,7];

c1=A*B

c1=

则:     47  68  89

37  51  65

32  47  62

c2=B*A

则:   c2=

20  24  50

26  34  68

37  57 106

可见,A·B ≠ B·A,即对矩阵乘法运算而言,交换律不成立。

矩阵A和B进行乘法运算,要求A的列数和B的行数相等,此时称A、B矩阵是可乘的,或称A和B两矩阵维数相容。如果两者的维数不相容,则将给出错误信息,提示用户两个矩阵是不可乘的。例如:

A=[2,2;1,1;3,3];

B=A*A

??? Error using==> mtimes

Inner matrix dimensions must agree.

说明矩阵维数不符合要求,不能进行乘法运算。

在MATLAB中,还可以进行矩阵和标量相乘,标量可以是乘数,也可以是被乘数。矩阵和标量相乘是矩阵中的每个元素与此标量相乘。

3.矩阵除法

在MATLAB中,有两种矩阵除法运算:\和/,分别表示左除和右除。如果A矩阵是非奇异方阵,则A\B和B/A运算可以实现。A\B等效于A的逆左乘B矩阵,也就是inv(A)*B,而B/A等效于A矩阵的逆右乘B矩阵,也就是B*inv(A)。

对于含有标量的运算,两种除法运算的结果相同,如1/2和2\1所得的值相等,都等于2。又设a=[5,10],则a/5=5\a=[1,2]。对于矩阵来说,左除和右除表示两种不同的除数矩阵和被除数矩阵的关系。对于矩阵运算,一般A\B≠B/A。例如:

a=[11,5,3;78,5,21;7,15,9];

b=[20,30,40;30,40,50;40,50,60];

c1=a\b

则: c1=

0.769 2  1.538 5  2.307 7

3.692 3  5.717 9  7.743 6

-2.307 7 -5.170 9  -8.034 2

c2=b/a

则: c2=

-9.978 6  1.222 2  4.918 8

-11.303 4  1.444 4  5.953 0

-12.628 2  1.666 7  6.987 2

4.矩阵的乘方

一个矩阵的乘方运算可以表示成A^x,要求A为方阵,x为标量。例如:

A=[3,0,7;9,12,8;1,5,3];

A^3

则:ans=

405    630    518

226 8    312 3    302 2

884    118 0    112 5

矩阵的开方运算是相当困难的,但是借助于计算机可以很方便地求出一个矩阵的方根,例如:

A=[3,0,7;9,12,8;1,5,3];

A^0.5

则:ans=

2.002 4+0.000 0i -0.372 3+0.000 0i 2.050 0 - 0.000 0i

1.689 1 - 0.000 0i 3.425 6 - 0.000 0i 0.907 0

-0.185 8+0.000 0i 0.985 7 - 0.000 0i 1.577 0+0.000 0i

5.点运算

在MATLAB中有一种特殊的运算,因为其运算符是在有关算术运算符前面加点,所以叫点运算。点运算有.*、./、.\和.^。两矩阵进行点运算是指它们的对应元素进行相关运算,要求两矩阵的维参数相同。例如:

A=[1,3,5;2,4,6;3,6,9];

B=[9,10,7;6,9,4;2,5,8];

C=A.*B

则: C=

9  30  35

12  36  24

6  30  72

A.*B表示A和B单个元素之间对应相乘,显然与A*B结果不同。

如果A、B两矩阵具有相同的维数,则A./B表示A矩阵除以B矩阵的对应元素。B.\A等价于A./B。例如:

m=[12,24,18;3,6,9];

n=[-2,-3,6;6,36,27];

z1=m./n

则: z1=

-6.000 0 -8.000 0  3.000 0

0.500 0  0.166 7  0.333 3

z2=n.\m

则: z2=

-6.000 0 -8.000 0  3.000 0

0.500 0  0.166 7  0.333 3

显然m./n和n.\m值相等。这与前面介绍的矩阵的左除和右除是不一样的。

若两个矩阵的维数一致,则A.^B表示两矩阵对应元素进行乘方运算。例如:

x=[2,2,2];

y=[1,2,3];

z=x.^y

则: z=

2  4  8

指数可以是标量。例如:

x=[1,3,5;2,4,6];

y=x.^3

则: y=

1  27 125

8  64 216

底也可以是标量。例如:

x=[7,8,9];

y=[4,5,6];

z1=2.^[x,y]

则: z1=

128 256 512  16  32  64

z2=2.^[x;y]

z2=

128 256 512

16  32  64

点运算是MATLAB很有特色的一个运算符,在实际应用中起着很重要的作用,也是很多初学者容易弄混的一个问题。下面再举一个例子来进行说明。【例1-3】当x=1,3,5,7,9时,分别求y=x2cosx的值。

解:在命令窗口中键入以下命令。

x=1:2:9;

y=x.^2.*cos(x)

则: y=

0.540 3 -8.909 9  7.091 6 36.941 2 -73.801 6

其中,y的表达式中必须使用点乘运算,因为x是一个含有5个元素的向量,所以cosx也是含有5个元素的向量,各元素值是x向量中对应元素的余弦值。

1.3.2 关系运算

MATLAB提供了6种关系运算符,如表1-2所示。表1-2 MATLAB的关系运算符续表

MATLAB的关系运算符总是以矩阵内元素对元素的方式做运算,例如:

a=[1,2;3,4];

b=[1,3;2,4];

c=a>b

则: c=

0  0

1  0

由上例可知,若a (i,j) > b (i,j),则c (i,j)的值为1(表示“真”或“成立”),否则即为0 (表示“假”或“不成立”)。MATLAB的关系运算符也支持标量展开,例如:

a=[1,2;3,4];

C=a>2

则: C=

0  0

1  1

此外,我们可以将关系运算符返回的0-1 矩阵(元素值为 0 或 1)来进行矩阵的索引(Indexing),进而找出满足某条件的矩阵元素。例如,如果要求出在a矩阵中满足a (i,j) >=b (i,j)的元素,可输入如下内容:

a=[10,20;30,40];

b=[10,30;20,40];

c=a>=b;

d=a(c)

则: d=

10

30

40

在上例中,也可直接使用a (a>=b) 来求得答案。

1.3.3 逻辑运算

MATLAB提供了3种逻辑运算符:&(与)、|(或)和~(非)。此外,MATLAB还提供了4个逻辑运算函数:and(a,b)、or(a,b)、not(a)和xor(a,b)。

在逻辑运算中,确认非零元素为真,用1表示;零元素为假,用0表示。设参与逻辑运算的是两个标量a和b,那么,逻辑运算符和逻辑运算函数的含义如下。

① a&b或函数and(a,b)表示a和b作逻辑与运算,当a、b全为非零时,运算结果为1,否则为0。

② a|b或函数or(a,b)表示a和b作逻辑或运算,当a、b中只要有一个非零,运算结果为1。

③ ~a和函数not(a)表示对a作逻辑非运算,当a是零时,运算结果为1;当a非零时,运算结果为0。

④ 函数xor(a,b)表示a和b作逻辑异或运算,当a、b的值不同时,运算结果为1,否则运算结果为0。

逻辑运算还有以下运算法则。

若参与逻辑运算的是两个同维矩阵,那么运算将对矩阵相同位置上的元素按标量规则逐个进行。最终运算结果是一个与原矩阵同维的矩阵,其元素由1或0组成。例如:

a=[17,26,39,3,-32];

b=[23,168,58,-3,25];

c1=a>10 & b<10

则: c1=

0  0  0  0  0

c2=xor(a>10 ,b<10)

则: c2=

1  1  1  1  0

若参与逻辑运算的一个是标量,一个是矩阵,那么运算将在标量与矩阵中的每个元素之间按标量规则逐个进行。最终运算结果是一个与矩阵同维的矩阵,其元素由1或0组成。例如:

A=[57,3;256,64]

B=~A | 1 & A>0

则: B=

1  1

1  1

逻辑非是单目运算符,也服从矩阵运算规则。

在算术、关系、逻辑运算符中,算术运算符优先级最高,逻辑运算符优先级最低。此外, MATLAB还提供了一些关系与逻辑运算函数,如表1-3所示。表1-3 关系与逻辑运算函数

1.4 基本函数

MATLAB是一个科学计算软件,因此它可以支持很多数学函数。

1.4.1 常用数学函数的使用

1.绝对值函数的使用

输入格式:abs(a)

得到数组a中每个实数元素的绝对值,负数元素的模。

x=[0,-1,-34,9];

y=abs(x)

y=

0  1  34  9

2.相位角函数的使用

输入格式:angle(a)

得到数组a中每个元素的相位角。得到的相位角用弧度表示,范围在−π到π之间。【例1-4】复数的求模与相位角函数。

解:在MATLAB命令窗中输入复数数组a。

a=[7-8i,10+i;3,7+2i;12-6i,3];

计算数组a中每个元素的模和相位角。

abs(a)

ans=

10.630 1 10.049 9

3.000 0  7.280 1

13.416 4  3.000 0

angle(a)

ans=

-0.852 0  0.099 7

0   0.278 3

-0.463 6    0

3.求复数的实部和虚部

输入格式:

① real(a) 求复数的实部。

② imag(a) 求复数的虚部。

上述两函数求得数组a每个元素的实部和虚部,产生与a维数相同的数组。

例如,在MATLAB中键入命令:

a=[7-8i,10+i;3,7+2i;12-6i,3];

real(a)

ans=

7  10

3  7

12  3

imag(a)

ans=

-8  1

0  2

-6  0

4.求复数共轭的函数的使用

输入格式:Conj(a)

求得数组a每个元素的共轭,产生与a维数相同的数组,conj(a)=real(a)-i*imag(a)。例如:

a=[7-8i,10+i;3,7+2i;12-6i,3];

conj(a)

ans=

7.000 0+8.000 0i 10.000 0 - 1.000 0i

3.000 0      7.000 0 - 2.000 0i

12.000 0+6.000 0i 3.000 0

y=real(a)-i*imag(a)

y=

7.000 0+8.000 0i 10.000 0 - 1.000 0i

3.000 0      7.000 0 - 2.000 0i

12.000 0+6.000 0i 3.000 0

5.数组指数

输入格式:exp(a)

求得数组a每个元素的指数,exp(a)=e.^a。a中的元素可以为复数z=x+i*y。

a=[1,-3,3;2,-1,6];

exp(a)

ans=

2.718 3  0.049 8 20.085 5

7.389 1  0.367 9 403.428 8

6.矩阵指数函数的使用

输入格式:expm(a)

求得矩阵a的指数,expm(a)=e^a。【例1-5】数组指数与矩阵指数。

解:在MATLAB命令窗键入命令。

a=[0,2,0;-2,0,3;0,2,-1];

先进行复指数运算。

exp(a)

ans=

1.000 0  7.389 1  1.000 0

0.135 3  1.000 0 20.085 5

1.000 0  7.389 1  0.367 9

exp(1).^a

ans=

1.000 0  7.389 1  1.000 0

0.135 3  1.000 0 20.085 5

1.000 0  7.389 1  0.367 9

可见exp(a) 与e.^a相等。再进行矩阵指数运算:

expm(a)

ans=

-1.170 9  2.272 7  2.414 4

-2.272 7  1.243 5  2.201 8

-1.609 6  1.467 9  2.119 1

exp(1)^a

ans=

-1.170 9+0.000 0i 2.272 7 - 0.000 0i 2.414 4 - 0.000 0i

-2.272 7 - 0.000 0i 1.243 5 - 0.000 0i 2.201 8

-1.609 6 - 0.000 0i 1.467 9 - 0.000 0i 2.119 1 - 0.000 0i

可见,expm(a) 等价于e^a。

7.平方根函数的使用

输入格式:sqrt(a)

求得数组a中每个元素的平方根。

8.对数函数的使用

输入格式:

① log(a) 求得数组a中每个元素的自然对数,定义域包含复数和负数。

② log2(a) 求得数组a中每个元素以2为底的对数,定义域包含复数和负数。

③ log10(a) 求得数组a中每个元素以10为底的对数,定义域包含复数和负数。【例1-6】对数函数的使用。

解:在MATLAB命令窗中键入以下命令。

a=[12,3,7;-1,4,-2;21,17,-5];

log(a)

ans=

2.484 9      1.098 6      1.945 9

0+3.141 6i 1.386 3      0.693 1+3.141 6i

3.044 5      2.833 2      1.609 4+3.141 6i

log2(a)

ans=

3.585 0      1.585 0      2.807 4

0+4.532 4i 2.000 0      1.000 0+4.532 4i

4.392 3      4.087 5      2.321 9+4.532 4i

log10(a)

ans=

1.079 2      0.477 1      0.845 1

0+1.364 4i 0.602 1      0.301 0+1.364 4i

1.322 2      1.230 4      0.699 0+1.364 4i

注意:对0求对数,会出现警告,计算得到−inf(负无穷)。

9.舍入函数的使用

输入格式:

① round(a) 将数组a中每个元素向最接近的整数舍入,对于复数实部和虚部均执行该操作。

② floor(a) 将数组a中每个元素向负无穷方向的整数舍入,对于复数实部和虚部均执行该操作。

③ ceil(a) 将数组a中每个元素向正无穷方向的整数舍入,对于复数实部和虚部均执行该操作。

④ fix(a) 将数组 a 中每个元素向零的方向的整数舍入,对于复数实部和虚部均执行该操作。【例1-7】舍入函数的使用。

解:在MATLAB的命令窗键入以下命令。

a=[0.5,0.1,-0.2;-0.8,0.3-0.2i,-0.6+1.6i;2.4,1.8+3i,-1.6+3i]

round(a)

ans=

1.000 0        0        0

-1.000 0        0     -1.000 0+2.000 0i

2.000 0      2.000 0+3.000 0i -2.000 0+3.000 0i

floor(a)

ans=

0        0     -1.000 0

-1.000 0        0 - 1.000 0i -1.000 0+1.000 0i

2.000 0      1.000 0+3.000 0i -2.000 0+3.000 0i

ceil(a)

ans=

1.000 0      1.000 0       0

0      1.000 0       0+2.000 0i

3.000 0      2.000 0+3.000 0i -1.000 0+3.000 0i

fix(a)

ans=

0        0        0

0        0        0+1.000 0i

2.000 0      1.000 0+3.000 0i -1.000 0+3.000 0i

10.模除与求余数函数的使用

输入格式:

① mod(x,y) 表示x对y取模,y不为零时mod(x,y)=x-y.*floor (x./y);y为零时mod(x,y)=x。

② rem(x,y) 表示x对y求余数,y不为零时rem(x,y)=x-y.*fix(x./y);y为零时会出现警告,rem(x,0) 得到NaN。

其中,x和y为维数相同的实数组,或其中含有实标量。【例1-8】模除与求余数函数的使用。

解:在MATLAB命令窗输入以下指令。

a=[5,6,7;-3,-2,-1;18,-16,9];

b=[2,3,-2;1,5,6;-3,-1,7];

mod(a,3)

ans=

2  0  1

0  1  2

0  2  0

rem(a,3)

ans=

2  0  1

0  -2  -1

0  -1  0

mod(a,b)

ans=

1  0  -1

0  3  5

0  0  2

rem(a,b)

ans=

1  0  1

0  -2  -1

0  0  2

1.4.2 随机函数的使用

在通信仿真中,经常会涉及随机变量和随机过程,在仿真时就需要产生服从各种分布的随机数,MATLAB中提供了常用分布的随机函数,本小节将介绍这些函数。

1.均匀分布随机矩阵函数

MATLAB提供的均匀分布随机矩阵函数如表1-4所示。表1-4 均匀分布随机矩阵函数

2.标准正态分布随机函数

标准正态分布随机函数如表1-5所示。表1-5 标准正态分布随机函数

3.正态分布随机函数

MATLAB提供正态分布随机函数如表1-6所示。表1-6 正态分布随机函数【例1-9】正态随机数的产生。

解:要产生10个均值为2、方差为5的随机数,可分别用randn函数和normrnd函数来实现,在MATLAB命令窗中输入以下指令。

x=normrnd(2,sqrt(5),1,10)

x=

1.032 8 -1.724 4  2.280 3  2.643 3 -0.563 6  4.663 0  4.659 1 1.915 8  2.731 8  2.390 5

x=2+sqrt(5)*randn(1,10)

x=

1.582 5  3.622 9  0.684 5  6.881 8  1.695 0  2.254 8  4.385 4 2.132 6  1.786 1  0.138 8

1.5 符号运算

MATLAB的强大之处不仅在于其强大的数值运算功能,而且也在于其强大的符号运算功能。MATLAB的符号运算是通过集成在MATLAB中的符号数学工具箱 (Symbolic Math Toolbox) 来实现的。

1.5.1 符号表达式的生成

在MATLAB符号工具箱中,符号表达式是代表数字、函数和变量的MATLAB字符串或字符串数组,它不要求变量要有预先确定的值。符号表达式包括符号函数与符号方程。其中,符号函数没有等号,而符号方程必须要带有等号。MATLAB在内部把符号表达式表示成字符串,以与数字相区别。符号表达式的创建可以通过以下几种方法。

1.用单引号来生成符号表达式

在MATLAB中,所有的字符串都用单引号来设定输入或输出。为此,符号表达式也可以用单引号来生成。【例1-10】

f='exp(x)'

f=

exp(x)【例1-11】

f='a*x^2+bx+c=0'

f=

a*x^2+bx+c=0【例1-12】

f='D2y-2Dy-3y=0'

f=

D2y-2Dy-3y=0

其中,上面的第1个例子生成一般符号函数,第2个例子生成符号代数方程,第3个例子生成符号微分方程。

2.用函数sym来生成符号表达式

在MATLAB可以自己确定变量类型的情况下,可以不用sym函数来显示生成符号表达式。但在某些情况下,特别是在建立符号数组时,必须要用sym函数来将字符串转换成符号表达式。【例1-13】

A=sym('[a b c;e f g]')

A=

[ a, b, c]

[ e, f, g]【例1-14】

f=sym('ax+b=0')

f=

ax+b=0

3.用函数syms来生成符号表达式

用syms函数只能用来生成符号函数,而不能用来生成符号方程。【例1-15】

syms y u;

p=exp(-y/u)

p=

exp(-y/u)

在符号表达式中,哪些变量是符号变量,可以用函数symvar来获知。有意义的是,symvar函数会自动把‘i’、‘j’、‘pi’、‘inf’‘nan’、‘eps’等特殊字符不当成符号变量。【例1-16】

symvar('sin(omega)')

ans=

'omega'

1.5.2 符号表达式的计算

在MATLAB符号工具箱中,符号表达式的运算主要是通过符号函数对其进行运算的。所有的符号函数作用到符号表达式和符号数组,返回的仍是符号表达式或符号数组(即字符串)。

1.提取分子、分母

如果符号表达式是有理分式的形式,则可以通过函数 numden 来提取符号表达式中的分子与分母。numden 函数可将符号表达式合并、有理化,并返回所得的分子与分母。numden函数的调用格式如下:

●[n,d]=numden(a) 提取符号表达式a的分子与分母,并分别把其存放在与n与d中。

●n=numden(a) 提取符号表达式的分子与分母,但只把分子存放在n中。【例1-17】

f=sym('a*x^2/(b-x)');

[n,d]=numden(f)

n=

-a*x^2

d=

-b+x【例1-18】

f=sym('a*x^2/(b-x)');

n=numden(f)

n=

-a*x^2

2.符号表达式的基本运算

符号表达式的加、减、乘、除四则运算及幂运算等基本的代数运算与矩阵的数值运算几乎完全一样。其中,符号表达式的加、减、乘、除运算可分别用“+”、“−”、“*”、“/”符号进行运算,而符号表达式的幂运算可以由运算符“^”来实现。【例1-19】

B=sym('x+1');

C=sym('x^2-1');

D=B+C

D=

x+x^2【例1-20】

B=sym('x+1');

C=sym('x^2-1');

D=B^C

D=

(x+1)^(x^2-1)

3.符号表达式的高级运算

符号表达式的高级运算主要是指符号表达式的复合函数运算。在MATLAB中符号表达式的复合数运算主要是通过函数compose来实现的。compose函数的调用格式如下。

●compose (f,g):返回复合函数f(g(y))。在这里f=f(x), g=g(y)。其中,x是findsym定义的f函数的符号变量,y是findsym定义的g函数的符号变量。

●compose (f,g,z):返回自变量为z的复合函数f(g(z))。在这里,f=f(x),g=g(y),x、y分别是findsym定义的f函数和g函数的符号变量。

●compose (f,g,x,z):返回复合函数f(g(z)),并且使x成为f函数的独立变量。即如果f=cos(x/t),则compose (f,g,x,z)返回cos(g(z)/t),而compose(f,g,t,z) 返回cos(x/g(z))。

●compose (f,g,x,y,z):返回复合函数f(g(z)),并且使x与y分别成为f与g函数的独立变量。即如果f=cos(x/t),g=sin(y/u),compose(f,g,x,y,z) 返回cos(sin(z/u)/t),而compose(f,g,x,u,z)返回cos(sin(y/z)/t)。【例1-21】

syms x,y;

f=1/x^3;

g=tan(y);

compose(f,g)

ans=

1/tan(y)^3【例1-22】

syms x y t;

f=1/x^3;

g=tan(y);

compose(f,g,t)

ans=

1/tan(t)^3【例1-23】

syms x y t z;

g=tan(y);

h=x^t;

compose(h,g,x,z)

ans=

tan(z)^t【例1-24】

syms x y t z;

g=tan(y);

h=x^t;

compose(h,g,x,y,z)

ans=

tan(z)^t

习题

1-1 要求在闭区间[0, 2π]上产生具有10个等间距采样点的一维数组。试用两种不同的指令实现。

1-2 用M文件建立大矩阵x:

X=[0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9

1.1 1.2 1.3 1.4 1.5 1.6 1.7 1.8 1.9

2.1 2.2 2.3 2.4 2.5 2.6 2.7 2.8 2.9

3.1 3.2 3.3 3.4 3.5 3.6 3.7 3.8 3.9]

1-3 已知 A=[5,6;7,8],B=[9,10;11,12],试用MATLAB分别计算 A+B、A*B、A.*B、A^3、A.^3、A/B、A\B。

1-4 任意建立矩阵A,然后找出在[10,20]区间的元素的位置。

第2章 M文件程序设计

MATLAB作为一种应用最广泛的科学计算软件,它不仅可以在命令行中逐行输入命令,然后依次执行,而且还可以像 C、FORTRAN 等高级语言一样进行程序设计,然后利用断点等调试手段进行程序设计与调试。MATLAB的程序设计就是进行M文件的设计。

MATLAB程序设计既有传统高级语言的特征,又有自己独特的优点。在MATLAB程序设计中,充分利用MATLAB数据结构的特点,可以使程序结构简单,提高编程效率。本章介绍有关MATLAB程序控制结构以及程序设计的基本方法。

2.1 M文件

2.1.1 M文件概述

MATLAB不仅是一个功能强大的工具软件,而且可以被理解为一种编程语言。MATLAB软件本身就是MATLAB语言的编程环境。MATLAB本身具有很多强大的函数,实际上M文件就是一个命令集。

所谓M文件是由MATLAB语句(命令或函数)构成的ASCII码文本文件,文件名必须以“.m”为扩展名。主要有两种形式:命令文件(Script File)和函数文件(Function File)。命令文件与批处理文件相似,它是MATLAB命令或函数的组合,没有输入输出参数,执行时只需在命令窗口中键入文件名回车即可;而函数文件是以一条function语句作为引导。即文件的第一行为:function[返回参数1,返回参数2,…]=函数名(输入参数1,输入参数2,…)这一行的有无是区分命令文件与函数文件的重要标志。函数文件可以接受输入变量,还可以返回输出变量,执行时需在命令窗口中以固定格式调用函数方可。其主要用处是利用MATLAB语句构造一个新的函数。【例2-1】分别建立命令文件和函数文件,将华氏温度f转化成摄氏温度c。

解:

程序1:

首先建立命令文件并以文件名f2c.m存盘。

clear;      %清除工作空间中的变量

f=input('Input Fahrenheit temperature :');

c=5*(f-32)/9

然后在MATLAB的命令窗口中输入f2c,将会执行该命令文件,执行情况为

Input Fahrenheit temperature: 73

c=

22.777 8

执行该命令文件时,不用输入参数,也没有输出参数,文件自身建立需要的变量。当文件执行完毕后,用命令whos查看工作空间中的变量,会发现c,f仍然保留在工作空间中:

whos

Name    Size        Bytes   Class

c      1x1        8    double array

f      1x1        8    double array

Grand total is 2 elements using 16 bytes

程序2:

首先建立函数文件f2c.m。

function c=f2c(f)

c=5*(f-32)/9

然后在MATLAB的命令窗口中调用该函数文件。

clear;

y=input('Input Fahrenheit temperature :');

x=f2c(y)

输出情况为:

Input Fahrenheit temperature : 70

c=

21.111 1

x=

21.111 1

调用该函数文件时,既有输入参数,又有输出参数。当函数调用完毕后,可以用命令whos查看工作空间中的变量。这时会发现函数参数c,f未被保留在工作空间中,而x,y保留在工作空间中。

whos

Name    Size          Bytes   Class

x     1x1           8    double array

y     1x1           8    double array

Grand total is 2 elements using 16 bytes

2.1.2 M文件的建立与打开

M文件是一个文本文件,它可以用任何编辑程序建立和编辑,而一般常用且最为方便的是使用MATLAB提供的文本编辑器。

1.建立新的M文件

要建立新的M文件,启动MATLAB文本编辑器有3种方法。(1)菜单操作。从MATLAB主窗口的File 菜单中选择 New 菜单项,再选择 M-file命令,屏幕上将出现MATLAB文本编辑器窗口,如图2-1所示。MATLAB文本编辑器是一个集编辑与调试功能于一体的工具环境。利用它不仅可以完成基本的文本编辑操作,还可以对 M 文件进行调试。MATLAB 文本编辑器的操作界面与使用方法和其他 Windows编辑器相似。图2-1 MATLAB文本编辑器窗口

启动MATLAB文本编辑器后,在文档窗口中输入M文件的内容,输入完毕后,选择文本编辑器窗口中 File 菜单的Save 或 Save As 命令存盘。注意,M 文件存放的位置一般是MATLAB 缺省的用户工作目录 C:\MATLAB6p5\work,当然也可以是别的目录。如果是别的目录,则应该将该目录设定为当前目录或将其加到搜索路径中。(2)命令操作。在MATLAB命令窗口输入命令edit,启动MATLAB文本编辑器后,输入M文件的内容并存盘。(3)命令按钮操作。单击MATLAB主窗口工具栏上的New M-File 命令按钮,启动MATLAB文本编辑器后,输入M文件的内容并存盘。

2.打开已有的M文件

打开已有的M文件也有3种方法。(1)菜单操作。从MATLAB主窗口的File菜单中选择Open命令,则屏幕出现Open对话框,在Open对话框中选中所需打开的M文件。在文档窗口可以对打开的M文件进行编辑修改,编辑完成后,将M文件存盘。(2)命令操作。在MATLAB命令窗口输入命令:edit文件名,则打开指定的M文件。(3)命令按钮操作。单击MATLAB主窗口工具栏上的Open File命令按钮,再从弹出的对话框选择所需打开的M文件。

2.2 程序控制结构

MATLAB同其他高级编程语言一样,是一种结构化的编程语言,提供了完备的控制语句,如条件转移语句、循环语句等常用的控制语句,从而使MATLAB的程序设计变得非常灵活。

程序控制结构有3种:顺序结构、选择结构和循环结构。任何复杂的程序都可以由这3种基本结构构成。

2.2.1 顺序结构

顺序结构是指按照程序中语句的排列顺序依次执行,直到程序的最后一个语句,这是最基本的一种程序结构。一般涉及数据的输入、数据的计算或处理、数据的输出等内容。

1.数据的输入

从键盘输入数据,可以使用input函数来进行,该函数的调用格式为:

A=input(提示信息,选项);

其中提示信息为一个字符串,用于提示用户输入什么样的数据。例如,要从键盘输入A矩阵,可以采用下面的矩阵来完成:

A=input('输入A矩阵:');

执行该语句时,首先在屏幕上显示提示信息“输入 A 矩阵:”,然后等待用户从键盘按照MATLAB的规定格式输入矩阵A的值。

如果在input函数调用时采用's'选项,则允许用户输入一个字符串。例如,要输入一个人的姓名,可以采用命令:

xm=input('What's your name?','s');

2.数据的输出

MATLAB提供的命令窗口输出函数主要有disp函数,其调用格式为:

disp(输出项)

其中输出项既可以为字符串,也可以为矩阵。例如:

A='Hello,Tom';

disp(A)

输出为

Hello,Tom

又如:

A=[1,2,3;4,5,6;7,8,9;];

disp(A)

输出为

1  2  3

4  5  6

7  8  9

注意:和前面介绍的矩阵显示方式不同,用disp函数显示矩阵时将不显示矩阵的名字,而且其输出格式更为紧凑,且不留任何没有意义的空行。【例2-2】输入x,y的值,并将它们的值置换后输出。

解:程序如下。

x=input('Input x please.');

y=input('Input y please.');

z=x;

x=y;

y=z;

disp(x);

disp(y);

程序输出为

Input x please.[12,3,3,4;43,6,3,-54]

Input y please.1:8

1 2 3 4 5 6 7 8

12 3  3  4

43 6  3 -54

注意:数据的形式可以是矩阵或向量,而且变量值互换时,两矩阵的维数也不一定相同。

3.程序的暂停

当程序运行时,为了查看程序的中间结果或者观看输出图形,有时需要暂停程序的执行,这时可以使用pause函数,其调用格式为

pause(延迟秒数)

如果省略延迟时间,直接使用pause,则将暂停程序,直到用户按任一键后程序继续执行。

若要强制中止程序的运行可以使用Ctrl+C组合键。

2.2.2 选择结构

选择结构是根据给定的条件成立或不成立,分别执行不同的语句。MATLAB用于实现选择结构的语句有if语句、switch语句和try语句。

1.if语句

在MATLAB中,if语句有3种格式。(1)单分支if语句。

if 条件

语句组

end

当条件成立时,则执行语句组,执行完之后继续执行if语句的后继语句,若条件不成立,则直接执行if语句的后继语句。例如,当x是整数矩阵时,输出x的值,语句如下:

if fix(x)==x

disp(x);

end(2)双分支if语句。

if 条件

语句组1

else

语句组2

end

当条件成立时,执行语句组1,否则执行语句组2,语句组1或语句组2执行后,再执行if语句的后继语句。【例2-3】定义一个1×10的行矢量A,当变量P大于5时,A中所有元素均为0;当P小于等于5时,A中所有元素均为1。编程实现。

解:程序如下。

P=input('请输入P的值');

if P>5

A=zeros(1,10)

else

A=ones(1,10)

end

输入7,输出结果为:

A=

0  0  0  0  0  0  0  0  0  0(3)多分支if语句。

if 条件1

语句组1

elseif 条件2

语句组2

elseif 条件m

语句组m

else

语句组n

end

语句执行过程如图2-2所示,可用于实现多分支选择结构。图2-2 多分支if语句的执行过程【例2-4】求一元二次方程ax 2+bx+c=0的根。

解:由于MATLAB能进行复数运算,所以不需要判断方程的判别式,而直接根据求根公式求根。

流程图如图2-3所示。

程序如下。

a=input('a=?');

b=input('b=?');

c=input('c=?');

d=b*b-4*a*c;

x=[(-b+sqrt(d))/(2*a),(-b-sqrt(d))/(2*a)];

disp(['x1=',num2str(x(1)),',x2=',num2str(x(2))]);图2-3 例2-4流程图

程序输出为

a=?4

b=?78

c=?54

x1=-0.718 8,x2=-18.781 2

再一次运行程序后的输出为

a=?23

b=?-6

c=?51

x1=0.130 43+1.483 4i,x2=0.130 43-1.483 4i

2.switch语句

switch语句根据表达式的取值不同,分别执行不同的语句,其语句格式为

switch 表达式

case 表达式1

语句组1

case 表达式2

语句组2

case 表达式m

语句组m

otherwise

语句组n

end

switch语句的执行过程如图2-4所示。当表达式的值等于表达式1的值时,执行语句组1,当表达式的值等于表达式2时,执行语句组2……当表达式的值等于表达式m的值时,执行语句组m,当表达式的值不等于case所列的表达式的值时,执行语句组n。

当任意一个分支的语句执行完后,直接执行switch语句的下一句。

switch子句后面的表达式应为一个标量或一个字符串,case子句后面的表达式不仅可以为一个标量或一个字符串,而且还可以为一个单元矩阵。如果case子句后面的表达式为一个单元矩阵,则表达式的值等于该单元矩阵中的某个元素时,执行相应的语句组。

试读结束[说明:试读内容隐藏了图片]

下载完整电子书


相关推荐

最新文章


© 2020 txtepub下载