![MATLAB光学仿真实用教程](https://wfqqreader-1252317822.image.myqcloud.com/cover/582/47548582/b_47548582.jpg)
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将会生成一系列的a、b之间包括端点a和b的n+1个等间隔点。因此,可以输入:
![](https://epubservercos.yuewen.com/B1FBFE/26947239407530006/epubprivate/OEBPS/Images/44274_24_1.jpg?sign=1739286771-eT6FWWUZrPkjqWhD6SNHSg0LaghH76kX-0-e319cf3adadb2673bd94712dd6a328c1)
生成一个从0开始,以1为间隔,直到11的一系列点。
![](https://epubservercos.yuewen.com/B1FBFE/26947239407530006/epubprivate/OEBPS/Images/44274_24_2.jpg?sign=1739286771-UVB9hMGpIlVVybrAHqf53DNgAdLffuSu-0-3266a6fcd619fc79181819ea704e8a1e)
分别计算每个点的函数值。最后使用:
![](https://epubservercos.yuewen.com/B1FBFE/26947239407530006/epubprivate/OEBPS/Images/44274_24_3.jpg?sign=1739286771-pWpcwLPBYsIamdoz6dmAPZqW5PfnW7eC-0-88d9a9701ae1903a690b59012f9f279c)
将每个自变量的点与对应的函数值描绘出来并用直线连接,如图1-5所示。
![](https://epubservercos.yuewen.com/B1FBFE/26947239407530006/epubprivate/OEBPS/Images/44274_25_1.jpg?sign=1739286771-EwYjVeXYu3OqKyLMhxm7tBDvnaly47Ic-0-72646c623b939b8c14d767c85c840bd6)
图1-5 y=sinπx在0≤x≤1区间上的图像(间隔h=0.1)
由图1-5可见,y=sinπx的图像并不连续,在各个x的取值处均为折线连接,显然是因为间隔取得比较大,使得i不连续。
对代码进行修改,将间隔修改为0.01,再次进行绘图,观察y=sinπx的图像。
![](https://epubservercos.yuewen.com/B1FBFE/26947239407530006/epubprivate/OEBPS/Images/44274_25_2.jpg?sign=1739286771-eopF4Jt7ITqVh554ZLSunKEKuOi0OajZ-0-b8ebd55aafe6d5bd2fdd04ef3bd20632)
修改间隔后的函数图像如图1-6所示。
当减小间距之后,得到如图1-6所示的图像,此时的函数图像更加光滑,每个计算函数值的点之间不是折线连接,能够更好地反映这个函数的变化趋势,但是绘制函数图像时也不是间隔取得越密集越好,间隔越小,需要计算的函数值越多,花费的计算时间也就越多,因此在绘图时需要找到合适的绘图间隔。
![](https://epubservercos.yuewen.com/B1FBFE/26947239407530006/epubprivate/OEBPS/Images/44274_26_1.jpg?sign=1739286771-bH2vyuBg5vl5Sb6FPGmnvjdd3U7XvipM-0-a38a5c372b5bb119ab85611d82b4a789)
图1-6 y=sinπx在0≤x≤1区间上的图像(间隔h=0.01)
在完成一幅函数图像的绘制之后,还需要对图像加上标注,比如横轴表示的物理量的含义,纵轴所表示的物理量的含义,以及整个函数图像代表的具体意义。在MATLAB中,都有具体的函数可以对绘制的图像添加上述信息,这些函数分别是title、xlabel、ylabel。它们的使用方法都是在函数后面以单引号封闭,在单引号内输入的内容会以文本的形式展示在函数图像中。例如,在得到y=sinπx图像的MATLAB代码的基础上加上:
![](https://epubservercos.yuewen.com/B1FBFE/26947239407530006/epubprivate/OEBPS/Images/44274_26_2.jpg?sign=1739286771-098krZHy4oF9uO0oOv14VsJK1nQkSp79-0-d88b94ab6aa879d0cfc3196dae8a1242)
加上标注后y=sinπx的图像如图1-7所示。
由图1-7可见,加上标注之后,可以直接运行程序得到函数图像,从而可以直观地理解程序的功能以及运行结果。例如,从图1-7中就可以看到整幅图像所表示出的函数关系。对于一些带有实际物理意义的物理量,在绘制函数图像时需要在标注的地方加上物理量的单位,以准确地描述函数的物理意义。
在进行科学研究时,往往会出现某个函数的取值与若干个参数相关,或者不同情况下函数值的计算需要使用不同的计算方法等情况,此时要求在同一个坐标系中画出多幅图像。
![](https://epubservercos.yuewen.com/B1FBFE/26947239407530006/epubprivate/OEBPS/Images/44274_27_1.jpg?sign=1739286771-URIDeUkuliHsootQ8dySDUeu0BKOH4at-0-4bdb78baaf3388dff4de81402bf1deae)
图1-7 加上标注后y=sinπx的图像
在MATLAB中,如果想要在一个坐标系中绘制多幅图像,直接增加plot函数会将原有的图像覆盖,此时需要增加一行代码为“hold on”,此代码的功能为在原先的坐标系中保持第一次绘制的图像,并且之后所绘制的图像不会将其覆盖,可以实现在一个坐标系中绘制多幅图像的目的。
在MATLAB中,默认的图线是黑色实线,当一个坐标系中出现多幅图像时,如果全部都以默认的黑色实线绘制,那么图像之间会互相干扰,难以辨认,因此需要对绘制的线型进行修改,不同的图像对应不同的线型,并在图像的右上角标注出来。
常用的改变线型的指令代码如表1-1所示。
表1-1 常用的改变线型的指令代码
![](https://epubservercos.yuewen.com/B1FBFE/26947239407530006/epubprivate/OEBPS/Images/44274_27_2.jpg?sign=1739286771-tKZWfG51V8ZjJ9uf5FshaHhZaVZQcJE0-0-aef05a9d6d7d04fd6ca577127061956f)
续表
![](https://epubservercos.yuewen.com/B1FBFE/26947239407530006/epubprivate/OEBPS/Images/44274_28_1.jpg?sign=1739286771-6lbh2ptYdFn9rV1gZD6Wl0c2qTGMSq1b-0-8f4f47d7bc78707346432ee92d2e3a80)
例如,当在MATLAB中绘制两幅函数图像时,可以使用上述指令代码对其标注,加以区分。输入:
![](https://epubservercos.yuewen.com/B1FBFE/26947239407530006/epubprivate/OEBPS/Images/44274_28_2.jpg?sign=1739286771-ERhNQSmFVtBSGp1hBkcXF5w1YgYNwMNs-0-548c26a84fa4b8d1587542b0e1b80199)
通过这段程序,可以在一个坐标系中同时绘出y=sinπx和y=cosπx的图像,并且将其用不同的线型表示出来。其中,legend函数为标注不同线型的函数。当程序中出现绘图函数时,legend函数会在标注线型之后给出对绘图函数的图例描述。
在同一坐标系中绘制y=sinπx和y=cosπx的图像如图1-8所示。
由图1-8可见,在同一个坐标系中出现了两种线型。其中,“减号”线型所表示的是y=cosπx的图像,“加号”线型所表示的是y=sinπx的图像。通过hold on函数、legend函数以及改变线型的指令代码,可以实现在一个坐标系中画出多幅可区分图像的目标。在对一些实验结果进行分析时,可以将其绘制在一起,分析图像的拐点和变化趋势等特点,从而得出不同的因素对实验结果的影响。
![](https://epubservercos.yuewen.com/B1FBFE/26947239407530006/epubprivate/OEBPS/Images/44274_29_1.jpg?sign=1739286771-TLIhMMLyXz2hcpkZFphOGtpYgqzcPyN6-0-10ca954977ef1433239eae8462621fae)
图1-8 在同一坐标系中绘制y=sinπx和y=cosπx的图像
当需要绘制一个三维图像时,需要构建一个空间直角坐标系,自变量包括x和y,如果是用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均为三维矩阵。
![](https://epubservercos.yuewen.com/B1FBFE/26947239407530006/epubprivate/OEBPS/Images/44274_30_1.jpg?sign=1739286771-BTZF6RPKOsQy0sKUyWl2HNNF1bp2og2T-0-43124c6e567a0cb9cfd3393667e5d27a)
然后根据实际的函数解析式,计算对应的每个采样点处因变量的取值,最后绘制出所要求的图像。
例如,绘制出-2≤x≤2,-2≤y≤2且采样间隔为0.5时的函数的图像,并标注坐标轴含义以及图像名称。
![](https://epubservercos.yuewen.com/B1FBFE/26947239407530006/epubprivate/OEBPS/Images/44274_30_3.jpg?sign=1739286771-Fzekx6ExoaGiVZNoXYVXmKMEJDjQ1kQN-0-134cc0f0a71985b91575142f8b1aa5fc)
![](https://epubservercos.yuewen.com/B1FBFE/26947239407530006/epubprivate/OEBPS/Images/44274_31_1.jpg?sign=1739286771-XrFzFEFRRtJxOaad8vxe6jTOjzWmNcN3-0-2fe0d35e2db712b2313fee8c8b03cd15)
运行这段程序,绘制出所要求的坐标范围内的函数图像,如图1-9所示。
![](https://epubservercos.yuewen.com/B1FBFE/26947239407530006/epubprivate/OEBPS/Images/44274_31_2.jpg?sign=1739286771-VdFG4S18YG3WOhw4yzZ19IXLy2npRZHx-0-a379911d1b8d1231146878bc9b4b1bc1)
图1-9 函数的图像
由图1-9可见,采样点比较稀疏,不能准确地看出函数的特性,因此要缩小采样点的间隔,使函数的图像具有更多的细节信息,方便对绘制出的图像进行分析。因此,缩小采样点的间隔为0.1:
![](https://epubservercos.yuewen.com/B1FBFE/26947239407530006/epubprivate/OEBPS/Images/44274_31_4.jpg?sign=1739286771-hQZY2xO5S27bXkgjL0dQSSVheP7Mom6T-0-ab55e836219b9311c11c5070bd6b0285)
重新绘制函数图像,如图1-10所示。
![](https://epubservercos.yuewen.com/B1FBFE/26947239407530006/epubprivate/OEBPS/Images/44274_32_1.jpg?sign=1739286771-fITv58EXsidLe2NpmRjIjaT3fHh0sh6t-0-bd7d66bd6b2c7eb049981618c81c0814)
图1-10 修改网格间隔之后函数的图像
在图1-10中可以清晰地看出,整个函数在规定的坐标范围内有两个极值点,且函数图像关于x轴对称。这些信息都是在没有画出函数图像前不能分析得到的。通过meshgrid函数,可以简便地确定函数的取值范围以及网格的大小,并在各个网格点处赋函数值,最后绘制出三维函数图像,免去了使用循环语句来定义变量范围的繁杂步骤,极大提高了绘图的效率。