MATLAB光学仿真实用教程
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

1.2.6 MATLAB中的绘图函数

MATLAB作为一个强大的数值计算器,不仅可以对很复杂的数据进行数学运算,还可以将运算得到的结果进行可视化,利用MATLAB内置的绘图工具,可以将基础数据与经过运算之后的结果绘制成一幅图像,从中可以分析结果与基础数据之间的函数关系,帮助用户发现数据之间隐藏的关系。

在MATLAB中绘制某个函数的图像,其实质是在函数的定义域内取大量的点,然后将每个点所对应的函数值连接,得到的最终结果即为函数在该定义域内的函数图像。

例如,当要绘制函数y=sinπx在0≤x≤1区间上的图像时,首先在这个区间上以某段固定的长度为间隔,取出一系列的间隔相同的点,然后计算这些点对应的函数值,再使用直线将这些点相连,完成图像的绘制。

输入MATLAB代码“N=10;h=1/N;x=0:h:1”,在MATLAB中定义一个点集x=0,h,2h,…,1-h,1。另外,可以使用linspace函数来完成上述操作,其格式为“linspace(a,b,n)”,输入这句MATLAB代码后,MATLAB将会生成一系列的ab之间包括端点abn+1个等间隔点。因此,可以输入:

生成一个从0开始,以1为间隔,直到11的一系列点。

分别计算每个点的函数值。最后使用:

将每个自变量的点与对应的函数值描绘出来并用直线连接,如图1-5所示。

图1-5 y=sinπx在0≤x≤1区间上的图像(间隔h=0.1)

由图1-5可见,y=sinπx的图像并不连续,在各个x的取值处均为折线连接,显然是因为间隔取得比较大,使得i不连续。

对代码进行修改,将间隔修改为0.01,再次进行绘图,观察y=sinπx的图像。

修改间隔后的函数图像如图1-6所示。

当减小间距之后,得到如图1-6所示的图像,此时的函数图像更加光滑,每个计算函数值的点之间不是折线连接,能够更好地反映这个函数的变化趋势,但是绘制函数图像时也不是间隔取得越密集越好,间隔越小,需要计算的函数值越多,花费的计算时间也就越多,因此在绘图时需要找到合适的绘图间隔。

图1-6 y=sinπx在0≤x≤1区间上的图像(间隔h=0.01)

在完成一幅函数图像的绘制之后,还需要对图像加上标注,比如横轴表示的物理量的含义,纵轴所表示的物理量的含义,以及整个函数图像代表的具体意义。在MATLAB中,都有具体的函数可以对绘制的图像添加上述信息,这些函数分别是title、xlabel、ylabel。它们的使用方法都是在函数后面以单引号封闭,在单引号内输入的内容会以文本的形式展示在函数图像中。例如,在得到y=sinπx图像的MATLAB代码的基础上加上:

加上标注后y=sinπx的图像如图1-7所示。

由图1-7可见,加上标注之后,可以直接运行程序得到函数图像,从而可以直观地理解程序的功能以及运行结果。例如,从图1-7中就可以看到整幅图像所表示出的函数关系。对于一些带有实际物理意义的物理量,在绘制函数图像时需要在标注的地方加上物理量的单位,以准确地描述函数的物理意义。

在进行科学研究时,往往会出现某个函数的取值与若干个参数相关,或者不同情况下函数值的计算需要使用不同的计算方法等情况,此时要求在同一个坐标系中画出多幅图像。

图1-7 加上标注后y=sinπx的图像

在MATLAB中,如果想要在一个坐标系中绘制多幅图像,直接增加plot函数会将原有的图像覆盖,此时需要增加一行代码为“hold on”,此代码的功能为在原先的坐标系中保持第一次绘制的图像,并且之后所绘制的图像不会将其覆盖,可以实现在一个坐标系中绘制多幅图像的目的。

在MATLAB中,默认的图线是黑色实线,当一个坐标系中出现多幅图像时,如果全部都以默认的黑色实线绘制,那么图像之间会互相干扰,难以辨认,因此需要对绘制的线型进行修改,不同的图像对应不同的线型,并在图像的右上角标注出来。

常用的改变线型的指令代码如表1-1所示。

表1-1 常用的改变线型的指令代码

续表

例如,当在MATLAB中绘制两幅函数图像时,可以使用上述指令代码对其标注,加以区分。输入:

通过这段程序,可以在一个坐标系中同时绘出y=sinπxy=cosπx的图像,并且将其用不同的线型表示出来。其中,legend函数为标注不同线型的函数。当程序中出现绘图函数时,legend函数会在标注线型之后给出对绘图函数的图例描述。

在同一坐标系中绘制y=sinπxy=cosπx的图像如图1-8所示。

由图1-8可见,在同一个坐标系中出现了两种线型。其中,“减号”线型所表示的是y=cosπx的图像,“加号”线型所表示的是y=sinπx的图像。通过hold on函数、legend函数以及改变线型的指令代码,可以实现在一个坐标系中画出多幅可区分图像的目标。在对一些实验结果进行分析时,可以将其绘制在一起,分析图像的拐点和变化趋势等特点,从而得出不同的因素对实验结果的影响。

图1-8 在同一坐标系中绘制y=sinπxy=cosπx的图像

当需要绘制一个三维图像时,需要构建一个空间直角坐标系,自变量包括xy,如果是用MATLAB中的循环语句来赋值自变量的,那么需要嵌套两层循环语句,整个程序的复杂程度会上升,而且容易出错。meshgrid函数是MATLAB中用于生成网格采样点的一个函数,在使用MATLAB进行三维图像的绘制方面有着广泛的应用。

例如,当需要在3≤x≤5和7≤y≤9区间上绘制一个三维图像时,取整数点为采样点,那么就要先构造一个坐标矩阵:

(3,7), (4,7), (5,7);

(3,8), (4,8), (5,8);

(3,9), (4,9), (5,9);

然后再通过所要绘制的函数,给每一个采样点赋上因变量的值,就可以完成一个区间上三维图像的绘制。

对于一个坐标范围比较小,而且只取整数点的坐标矩阵的构造比较简单,但是区域一旦扩大,各个点之间的间隔变小,那么坐标的个数将爆炸式增长,手动构建坐标矩阵将不可行。此时,就需要使用meshgrid函数生成二维网格,来绘制三维图像。

Meshgrid函数的用法:[X,Y]=meshgrid(a,b)。其中,a和b均为一维数组,用来表示三维图像的坐标范围。例如,a=[1,2,3];b=[2,3,4],则生成的X和Y均为三维矩阵。

然后根据实际的函数解析式,计算对应的每个采样点处因变量的取值,最后绘制出所要求的图像。

例如,绘制出-2≤x≤2,-2≤y≤2且采样间隔为0.5时的函数的图像,并标注坐标轴含义以及图像名称。

运行这段程序,绘制出所要求的坐标范围内的函数图像,如图1-9所示。

图1-9 函数的图像

由图1-9可见,采样点比较稀疏,不能准确地看出函数的特性,因此要缩小采样点的间隔,使函数的图像具有更多的细节信息,方便对绘制出的图像进行分析。因此,缩小采样点的间隔为0.1:

重新绘制函数图像,如图1-10所示。

图1-10 修改网格间隔之后函数的图像

在图1-10中可以清晰地看出,整个函数在规定的坐标范围内有两个极值点,且函数图像关于x轴对称。这些信息都是在没有画出函数图像前不能分析得到的。通过meshgrid函数,可以简便地确定函数的取值范围以及网格的大小,并在各个网格点处赋函数值,最后绘制出三维函数图像,免去了使用循环语句来定义变量范围的繁杂步骤,极大提高了绘图的效率。