MATLAB 2018从入门到精通
人民邮电出版社
北京
图书在版编目(CIP)数据
MATLAB 2018从入门到精通 / 林炳强,谢龙汉,周维维编著.--北京:人民邮电出版社,2019.10
ISBN 978-7-115-51944-3
Ⅰ.①M… Ⅱ.①林…②谢…③周… Ⅲ.①Matlab软件 Ⅳ.①TP317
中国版本图书馆CIP数据核字(2019)第202261号
◆编 著 林炳强 谢龙汉 周维维
责任编辑 李永涛
责任印制 马振武
◆ 人民邮电出版社出版发行 北京市丰台区成寿寺路11号
邮编 100164 电子邮件 315@ptpress.com.cn
网址 http://www.ptpress.com.cn
涿州市京南印刷厂印刷
◆ 开本:787×1092 1/16
印张:49.25
字数:1200千字 2019年10月第1版
印数:1-2500册 2019年10月河北第1次印刷
定价:129.00元
读者服务热线:(010)81055410 印装质量热线:(010)81055316
反盗版热线:(010)81055315
广告经营许可证:京东工商广登字20170147号
本书基于MATLAB 2018版写作,在共15章的篇幅中分别介绍了MATLAB的基础操作、Simulink工具箱、MATLAB在自动控制中的应用、线性规划工具箱、数字信号处理工具箱、图像处理工具箱、系统辨识、模糊工具箱,以及MATLAB在自抗扰控制系统中的应用。本书各章通过典型实例操作和重点知识讲解相结合的方式,对MATLAB的基础知识、功能及命令函数进行全面的讲解。
本书具有操作性强、指导性强、语言简洁等特点,内容涵盖了MATLAB在当前工程应用中的主要应用领域。本书可作为MATLAB软件初学者入门和提高的学习教程,或者高等院校、培训机构的MATLAB教材,也可供相关工程应用人员参考。
MATLAB是美国MathWorks公司出品的商业数学软件,主要用于算法开发、数据可视化、数据分析及数值计算,主要包括MATLAB和Simulink两大部分。除了矩阵运算、绘制函数图像等常用功能以外,MATLAB还可以用来创建用户界面及调用其他语言编写的程序。同时,MATLAB还包括了其他的附加工具箱,如控制系统分析与设计、图像处理、信号处理等。MATLAB的主要特点在于其高效的数值计算及符号计算功能,能使用户从烦杂的数学运算分析中解脱出来;同时具有完备的图形处理功能,实现计算结果和编程的可视化;还提供丰富的应用工具箱,为用户提供了大量方便实用的处理工具。
本书通过大量的典型实例,对MATLAB 2018在程序设计中常用的功能及命令进行了介绍,包括MATLAB的基础操作及主要应用工具箱的使用方法。在实例讲解中力求紧扣主题、语言简洁、形象直观,避免冗长的解释说明,使读者能够快速掌握利用MATLAB 2018软件进行程序设计的方法和技巧。
在本书的程序设计过程中,介绍了一些关于程序设计方面的技巧,这有助于读者在学习过程中能熟练掌握程序设计的基本操作,而且能够对其中的一些设计思路有所了解,进而掌握更加高效的设计方法,设计出符合要求的程序或得到准确的实验结果。
本书内容
本书共15章,主要内容介绍如下。
● 第1章主要介绍MATLAB 2018的一些基本知识和基本操作。通过本章的学习,读者能够了解MATLAB的基本操作流程。
● 第2章主要介绍MATLAB的符号计算。通过本章的学习,读者能够熟练掌握符号计算方法,可以进行比较复杂的数学符号计算。
● 第3章主要介绍MATLAB的矩阵运算。通过本章的学习,读者能够熟练地进行矩阵的运算,为以后的MATLAB学习打好基础。
● 第4章主要介绍MATLAB的数值计算。通过本章的学习,读者能够很好地掌握MATLAB在数学领域中的一些计算方法。
● 第5章主要介绍MATLAB的图形处理。通过本章的学习,读者能够将计算结果或实验结果通过绘图的形式表示出来,使得结果更加直观。
● 第6章主要介绍MATLAB的M文件设计基础。通过本章的学习,读者能够很好地利用M文件进行程序的编写,以避免在工作空间进行代码编写的麻烦。
● 第7章主要介绍MATLAB的图形用户界面。通过本章的学习,读者能够熟练掌握利用MATLAB进行图形化用户界面的编写,制作符合一定功能的图形用户界面。
● 第8章主要介绍MATLAB的Simulink工具箱的使用。通过本章的学习,读者能够熟练掌握利用MATLAB的Simunlink工具箱进行实验仿真的一些方法,为以后的工程实验仿真打下坚实的基础。
● 第9章主要介绍MATLAB在控制系统分析与设计中的应用。通过本章的学习,读者能够熟练掌握利用MATLAB进行控制系统的模型仿真的一些基本方法。
● 第10章主要介绍MATLAB的线性规划工具箱。通过本章的学习,读者能够熟练利用MATLAB进行线性规划问题的求解,并将注意力转化到模型的建模问题上,而减少模型计算的时间。
● 第11章主要介绍MATLAB的数字信号处理工具箱。通过本章的学习,读者能够熟练掌握利用MATLAB进行相应的数字信号处理的方法,为以后从事信号处理工作打下基础。
● 第12章主要介绍MATLAB的图像处理工具箱。通过本章的学习,读者能够熟练地利用MATLAB进行图像处理分析,掌握图像处理的基本原理和基本方法。
● 第13章主要介绍利用MATLAB进行系统的辨识计算。通过本章的学习,读者能够掌握系统辨识的一般计算方法以及利用MATLAB进行系统辨识仿真,为实际应用提供仿真依据。
● 第14章主要介绍利用MATLAB进行自抗扰控制器的设计与仿真。通过本章的学习,读者能够熟练掌握自抗扰控制的基本原理及其仿真方法,为以后在实际工程中应用自抗扰控制器打下坚实的理论基础和仿真基础。
● 第15章主要介绍MATLAB的模糊数据工具箱。通过本章的学习,读者能够熟练掌握MATLAB的模糊工具箱以及模糊工具箱在控制理论当中的基础应用。
本书读者对象
本书具有操作性强、指导性强、语言简洁等特点,可作为MATLAB软件初学者、中级读者的入门和提高的学习教程,或者作为高等院校、培训机构的MATLAB教材,也可供相关工程应用人员参考。
学习建议
建议读者按照图书编排的前后次序学习本书。从第1章开始,首先请读者浏览一下本章所要讲述的内容,然后按照书中所讲的操作步骤进行操作,如果在学习过程中遇到操作困难的地方,可以参考配套资源中的M文件。对于实例操作部分,建议读者直接根据书中的操作步骤动手进行操作,多总结,勤做笔记以加深印象,及时纠正操作中所遇到的问题。
感谢您选用本书进行学习,恳请您将对本书的意见和建议告诉我们,电子邮件为1012918770@qq.com。祝您学习愉快。
作者
2019年8月
本章讲解MATLAB的基础内容,主要包括MATLAB软件的安装、操作界面的组成及MATLAB帮助系统的使用。本章内容是学习MATLAB的必备知识,是学习MATLAB的开始。读者应仔细阅读本章内容,为以后的学习打下坚实的基础。
本章内容
● MATLAB的安装。
● MATLAB的启动。
● MATLAB的操作界面。
● M文件编辑器。
● MATLAB的帮助系统。
MATLAB只有在适当的外部环境中才能正常运行,也只有按照指定的安装步骤进行安装才能够正常使用。下面介绍软件的安装过程。
1.打开软件安装包,双击setup.exe应用程序,打开的安装启动界面如图1-1所示。
2.选择“使用文件安装密钥”选项,单击“下一步”按钮,在许可协议中选择“是”选项后单击“下一步”按钮,如图1-2所示。
3.输入文件安装密钥,单击“下一步”按钮,如图1-3所示。若是没有文件安装密钥,则软件安装之后只能试用一定的时间。
4.选择软件安装文件夹,如图1-4所示。
5.单击“下一步”按钮,即可安装软件。软件安装时间比较长,读者需要耐心等待。
软件安装之后,一般会在桌面生成快捷方式,如图1-5所示,双击即可启动MATLAB软件。
若是桌面上不存在MATLAB快捷方式,则可以找到MATLAB文件夹下的快捷方式图标(见图1-5),双击该图标,同样可以启动MATLAB软件。
启动MATLAB之后,可以看到MATLAB的操作界面。该操作界面是一个高度集成的MATLAB工作界面,主要包括菜单栏、命令行窗口、当前文件夹、工作区,如图1-6所示。
(1)菜单栏。MATLAB软件的菜单栏包括主页、绘图、APP 3个主功能区,各个功能区下面包含详细的内容。主页下包括文件、变量、代码、SIMULINK、环境、资源6个部分;绘图下包括所选内容、绘图、选项3个部分;APP下包括文件、APP两个部分。各个部分下包含多个更为细致的功能。
(2)命令行窗口。该窗口是MATLAB软件的主要操作界面。在该界面中,可以输入各种计算表达式,显示图形外的所有运算结果,而且当程序出现语法错误或是计算错误时,会在该窗口给出错误提示信息。
(3)当前文件夹。在当前文件夹中,可以查看子目录、M文件、MAT文件和MDL文件等,并且可以对其中的文件进行相应的操作。例如,可以对M文件进行复制、编辑和运行等。
(4)工作区。程序运行的所有变量名、大小及字节数等都保存在工作区中,同时,我们可以对该空间中的变量进行查看、编辑等操作。若要清除工作区,只需在指令窗口中输入clear指令,然后按Enter键即可。
对于一些比较简单的计算语句,我们可以直接在指令窗口中输入相应的程序代码。但是对于复杂的程序,若是直接在指令窗口中输入,那么会经常出现错误,同时,程序的修改也会显得比较麻烦。M文件则不会出现这样的情况。所以,这里建议读者在编写程序时,尽量都使用M文件,以便进一步修改。因此,本节对M文件编辑器的启动方法及用M文件编写程序做一些简单的介绍,使读者对M文件编辑器有一定的了解,为以后的MATLAB学习打下基础。
M文件编辑器如图1-7所示,它不会随着MATLAB的启动而启动。用户在需要使用M文件时,才启动它。
M文件编辑器的启动方法有以下几种。
● 单击MATLAB操作界面左上角的“新建脚本”,即可启动M文件编辑器。
● 单击MATLAB操作界面左上角的“新建”>“脚本”,即可启动M文件编辑器。
● 在指令窗口中输入edit指令,同样可以启动M文件编辑器。
● 按快捷组合键Ctrl+N,也可以启动M文件编辑器。
用户可以根据自己的使用习惯,选择一种快捷的启动方式。
例如,用M文件编写程序,绘制正弦函数y=sin(x)在0~2π的曲线。
具体步骤如下。
1.启动M文件编辑器。按快捷组合键Ctrl+N,启动M文件编辑器。
2.输入如下程序。
t=0:0.01:2*pi; y=sin(t); plot(t,y,'-r'); %绘图函数 grid;
3.保存M文件。选择保存M文件的路径,并取名sin(x),则保存之后的文件名会在后面自动添加后缀.m,也就是文件名为sin(x).m。
4.M文件程序运行。M文件运行有两种方式:一种是直接在M文件编辑器中,将该文本添加到搜索路径中,然后单击“运行”按钮,如图1-8所示;另一种是选中运行的程序段,然后单击右键,选择“执行当前节”命令,即可运行所选中的程序。
程序运行结果如图1-9所示。
说明
(1)本例中的plot绘图函数,将在第5章中讲解,这里读者只需适当了解即可。
(2)在M文件中,可以对程序进行注释。在语句后面添加“%”即可对程序进行注解。或者按快捷组合键Ctrl+R,可以对选中的程序进行注解;若是要取消注解,按快捷组合键Ctrl+T。
开始学习MATLAB时,初学者可能不知道MATLAB的各种功能,以及某一条MATLAB指令的具体功能,用户也可能不了解更高版本的MATLAB所添加的新功能、新特点等,这些都可以在帮助系统里面找到相应的答案。MATLAB在帮助系统方面的改进,考虑了不同用户的不同需求,构成了一个比较完备的帮助体系。并且,随着版本的升级,帮助系统也得到了更进一步的完善。本节旨在介绍MATLAB帮助系统,使读者对该部分有初步的了解,并随着往后的学习,能够熟练使用MATLAB的帮助系统解决学习过程中所出现的问题。只有这样,读者才能更好地运用MATLAB,快捷、可靠、有效地独立解决自己面临的各种问题。
MATLAB帮助系统的类型及特点如表1-1所示。
对于知道具体MATLAB函数名字而不知道其使用方法的,使用help或doc指令,就可以查询该函数的具体功能和使用方法。help和doc指令的使用方法如表1-2所示。
例如,刚开始学习,我们不知道plot函数的使用方法,那么就可以通过帮助系统,查看plot函数的具体使用方法。在指令窗口中输入doc plot或help plot,就可以找到plot函数的使用方法。
>>doc plot
那么,通过doc指令查找的plot函数的使用方法如图1-10所示。
>>help plot
那么,通过help指令查找的plot函数的使用方法如图1-11所示。
提示:图1-11中只显示了plot函数的部分内容,更详细的内容读者可以在自己的计算机中查看。
Help帮助浏览器是MATLAB专门创建的HTML帮助系统,其内容均来源于所有的M文件,描述更加详细,人机界面更加友善,阅读也相对比较方便。因此,它是所有帮助系统中最重要的一种,用户可以在该帮助系统中查到自己想要的函数及其用法等一切内容。
Help帮助浏览器的启动方式有3种,分别如下。
● 单击工具栏上的按钮。
● 选择下拉菜单项“帮助”>“文档”。
● 在MATLAB指令窗口中输入doc。
打开的窗口如图1-12所示。
在图1-12所示的帮助浏览器中,可以看到里面有MATLAB的各个工具箱,用户可以查看每个工具箱里面的所有函数及其使用方法。想要查看某个工具箱,用鼠标单击该工具箱名字即可。例如查看Simulink工具箱,用鼠标单击Simulink,则会出现图1-13所示的界面。
再如,要查看图像处理工具箱中的图像读入函数imread的使用方法,可以单击ImageProcessing Toolbox>Functions>imread,显示内容如图1-14所示。从图中可以看到imread函数的各种调用方式,以及对每种调用方式的具体描述。
因此,Help帮助浏览器对用户学习MATLAB有着非常重要的作用。
MATLAB符号工具箱将符号计算与数值计算在形式和风格上进行统一。MATLAB提供了非常强大的符号计算功能,可以代替其他的符号计算专用计算语言,同时也可以按照推理解析的方法进行计算。在MATLAB中,符号计算功能是建立在数学软件Maple基础之上的。在进行符号计算时,MATLAB首先会调用Maple进行计算,然后将计算结果返回到命令窗口中。MATLAB提供的符号计算功能主要包括以下几个方面。
(1)计算:微分、积分、极限、求和及Taylor展开式等。
(2)线性代数求解:逆矩阵、行列式的值、矩阵特征值、奇异值分解等线性代数的内容。
(3)化简:代数表达式的进一步化简,化简至最简形式。
(4)方程求解:代数方程和微分方程的求解。
(5)其他数学方程:傅里叶变换、拉普拉斯变换、Z变换及各自所对应的逆变换等的计算。
本章内容
● 符号对象的创建。
● 微积分的符号计算。
● 微分方程的符号解法。
● 矩阵符号计算。
● 符号变换及反变换。
● 代数状态方程传递函数的符号求解。
● 符号计算的简易绘图函数。
符号对象是符号工具箱中的一种数据类型。符号对象是符号的字符串表示。在符号工具箱中,符号对象表示符号变量、表达式和方程。符号运算仍然需要首先创建符号对象,如符号常数、符号变量、符号表达式等。
符号对象可以通过sym和syms函数来定义。下面介绍这两个函数的调用格式。
sym函数用于生成单个的符号变量,其调用格式主要有以下几种。
var=sym('var'); 产生符号变量var。 var=sym('var',set); 产生符号变量var,并且声明变量var属于集合set。 sym('var','clear'); 清除之前已经设置的符号变量。 Num=sym(Num); 将数字变量或数字矩阵Num转换成符号形式。 Num=sym(Num,flag); 将数字变量或数字矩阵Num转换成符号形式,第二个参数表示转换后的数据类型,其取值为r、d、e和f中的一个。 A=sym('A',dim); 产生向量或矩阵符号变量。 A=sym('A',set); A为已经存在的符号向量或矩阵,A的所有元素均属于集合set,该表达式不是产生符号变量A。若是要产生向量或矩阵符号变量,则可以使用表达式A=sym('A',[m,n])或A=sym('A',n)。 sym(A,'clear'); 清除之前设置的符号变量A。 f(arg1,arg2,…argN)=sym('f(arg1,arg2,…argN)'); 产生符号函数f,并且声明符号函数的输入变量arg1,arg2,…,argN。该调用格式不是产生输入变量arg1,arg2,…,argN;输入变量必须是已经存在的符号变量。
【实例2-1】使用sym函数产生符号表达式。
思路点拨
本例可以使用两种方法生成该符号表达式,一种是采用逐个变量定义法,另一种是采用整体定义的方法定义符号表达式。使用sym函数上述的调用格式调用即可。
结果文件——配套资源“Ch2\SL201”文件
解:方法一:逐个变量定义法,程序如下。
a=sym('a'); b=sym('b'); x=sym('x'); e=sym('e'); f=a*sin(x)+b*e^x
程序运行结果如下。
f = a*sin(x) + b*e^x
方法二:采用整体定义表达式的方法,程序如下。
f=sym(a*sin(x)+b*e^x)
程序运行结果如下。
f = a*sin(x) + b*e^x
比较上述两种方法可以看出,使用方法二能够减少程序的输入,而且输出结果与方法一相同,因此,方法二是一种更为简洁的方法。
syms用于一次生成多个符号变量,但不能用于生成表达式。其主要调用格式有以下几种。
syms var1,…varN; 生成符号变量var1,…,varN。 syms var1,…varN set; 生成符号变量var1,…,varN,并且声明符号变量属于集合set,其中set为实数或虚数。 syms var1,…varN clear; 清除已经声明的符号变量var1,…,varN。 syms f(arg1,…,argN); 生成符号函数f,符号变量var1,…,varN表示符号函数f的输入变量。
例如,生成符号变量x、y,假设x和y为实数,则代码如下。
sym x y real;
例如,产生符号表达式f(x,y)=x+2y,则代码如下。
syms f(x,y); f(x,y)=x+2*y
再例如,产生符号矩阵,并且求在x=2时的值,其代码如下。
syms x; f(x)=[x x^2;x^3 x^4] f(2)
程序运行结果如下。
f(x) = [ x, x^2] [ x^3, x^4] ans = [ 2, 4] [ 8, 16]
该函数用于确定一个表达式中所有存在的符号变量。其调用格式有以下两种。
symvar(s); 返回一个包含在符号表达式s中的所有符号变量。 symvar(s,n); 返回一个包含n个在表达式s中的符号变量向量。如果s是一个符号表达式,则返回s的输入变量。
例如,找到符号表达式f中的所有符号变量,其中符号表达式f为
f(a,b)=a^2/(sin(3-b));
那么在程序中输入以下语句:
symvar(f)
程序的输出结果如下。
ans = [ a, b ]
提示:该函数的返回值都是一个行向量。
subs函数可以将符号表达式中的符号变量用数值代替,其主要调用格式如下。
g=subs(f,old,new); 在表达式中,用new代替old中的值,并计算。 g=subs(f,new); 用new代替表达式中所有默认的符号变量的值,并计算。 g=subs(f); 替换符号表达式中所有的符号变量,其值可以从调用函数和MATLAB工作空间中调用,然后计算符号表达式的值。没有指定值的变量仍然可以作为变量。
例如,用代替符号表达式f=x+2sinx中的值,并计算f的值,其代码如下。
syms x; f=x+2*sin(x) subs(f,pi/4)
程序运行结果如下。
f = x + 2*sin(x) ans = pi/4 + 2^(1/2)
函数subs在多变量符号表达式中的应用举例如下。
已知符号表达式f=x2+y2,分别用x=3,y=4代替符号表达式中的x和y,并计算表达式的值。程序如下。
syms x y; f=x^2+y^2; g=subs(f,x,3) subs(g,y,4)
程序运行结果如下。
g = y^2 + 9 ans = 25
上一小节中我们已经讲述了sym函数的应用。其中有一条调用格式为Num=sym(Num,flag),该调用格式为符号与数值计算之间的转化。转化的方式则由参数flag来确定,分别为r、d、e和f。下面通过具体例子讲解符号与数值之间的转化关系。
【实例2-2】使用Num=sym(Num,flag)调用格式,比较flag取不同的值时,输出结果的差异。
思路点拨
sym函数中参数flag的默认值为r。
结果文件——配套资源“Ch2\SL202”文件
解:具体程序如下。
t=0.1; sym(t) sym(t,'r') sym(t,'f') sym(t,'d') sym(t,'e')
输出结果为
ans = 1/10 ans = 1/10 ans = 3602879701896397/36028797018963968 ans = 0.10000000000000000555111512312578 ans = eps/40 + 1/10
根据上述例子,读者可以比较出参数flag取不同的值时,其输出结果的差异。sym函数除了将符号转换为数值之外,还可以将数值转化为符号。
【实例2-3】将数值矩阵转化为符号矩阵。
思路点拨
本例仍然是一个sym函数的简单应用的例子。使用sym(A)即可将该数值矩阵转化为符号矩阵。
结果文件——配套资源“Ch2\SL203”文件
解:具体程序如下。
A=[0.3 0.5 0.3 0.2; 1.0 0.4 0.7 0.8; 0.5 0.5 0.3 0.25; 0.6 0.9 0.35 0.5]; sym(A)
程序运行结果如下。
ans = [ 3/10, 1/2, 3/10, 1/5] [ 1, 2/5, 7/10, 4/5] [ 1/2, 1/2, 3/10, 1/4] [ 3/5, 9/10, 7/20, 1/2]
数学表达式有各种不同的形式。对于具体问题,它们各具特点。例如,对于多项式,有普通的降幂排列的x的幂的多项式,也可以写成因子乘积,还可以写成嵌套形式。工具箱应用各种代数和三角恒等式把一个函数表达式转换成另外一种等价的表达式,称为符号表达式的化简。
MATLAB提供了多种符号表达式的操作命令,具体有合并同类项(collect)、对指定项展开(expand)、因式或因子分解(factor)、转换成嵌套形式(horner)、提取公因子(numden)、恒等式化简(simplify)、习惯书写方式表达(pretty)。现将各个函数的调用格式讲解如下。
用途:合并同类项。
调用格式:
R=collect(s); 返回合并同类项之后的表达式。 R=collect(s, v); 合并含有变量v的同类项。
例子:
syms x y; R1=collect((exp(x)+x)*(x+2)) R2=collect((x+y)*(x^2+y^2+1),y)
程序运行结果如下。
R1 = x^2 + (exp(x) + 2)*x + 2*exp(x) R2 = y^3 + x*y^2 + (x^2 + 1)*y + x*(x^2 + 1)
用途:对指定项展开。
调用格式:
expand(s); 对符号表达式s进行多项式展开。 expand(s,name, value); 对符号表达式添加其他选项进行展开。该调用格式读者适当地了解即可。
例子:
syms x expand((x-2)*(x-4))
程序运行结果:
ans = x^2 - 6*x + 8
例子:
syms x y expand(cos(x+y))
程序运行结果:
ans = cos(x)*cos(y) - sin(x)*sin(y)
用途:因式或因子分解。
调用格式:
f=factor(n); 返回n的因子,其结果为一个行向量。
例子:
f=factor(24)
程序运行结果:
f = 2 2 2 3
用途:转换成嵌套形式。调用格式:
horner(P); 假设P是一个多项式矩阵,则该结果返回P的嵌套形式。
例子:
syms x horner(x^3-6*x^2+11*x-6)
程序运行结果:
ans = x*(x*(x - 6) + 11) - 6
用途:提取公因式。
调用格式:
[N,D]=numden(A); 返回多项式A的分子和分母。
例子:
syms x y [n,d] = numden(x/y + y/x)
程序运行结果:
n = x^2 + y^2 d = x*y
用途:恒等式化简。调用格式:
B = simplify(A); 把表达式A化为最简形式。
例子:
syms x f=(1/x^3+6/x^2+12/x+8)^(1/3) simplify(f)
程序运行结果:
f = (12/x + 6/x^2 + 1/x^3 + 8)^(1/3) ans = ((2*x + 1)^3/x^3)^(1/3)
用途:将表达式化为习惯书写方式。
调用格式:
pretty(x); 将表达式化为习惯书写方式表达。
例子:
A=sym(magic(3)) pretty(A)
程序运行结果:
A = [ 8, 1, 6] [ 3, 5, 7] [ 4, 9, 2] / 8, 1, 6 \ | | | 3, 5, 7 | | | \ 4, 9, 2 /
从以上输出结果对比可以看出,经过美化输出之后的结果更符合数学表达式,因此更加美观。
微积分是高等数学中最重要的一部分,也是工程应用中经常用到的一部分,在数学和工程中的作用非常大。MATLAB符号工具箱提供了大量函数来支持基础的微积分计算,主要包括微分、积分、极限、级数求和和泰勒级数等。
MATLAB符号工具箱提供了limit函数来求解符号表达式的极限,其主要调用格式如下。
limit(expr,x,a); 求符号表达式expr当自变量x趋近于a时的极限。 limit(expr,a); 求符号表达式expr当默认自变量趋近于a时的极限。 limit(expr); 求符号表达式expr当默认自变量趋近于0时的极限。 limit(expr,x,a,'left'); 求符号表达式expr当默认自变量向左趋近于a时的左极限。 limit(expr,x,a,'right'); 求符号表达式expr当默认自变量向右趋近于a时的右极限。
例如,求极限。
程序如下。
syms x h limit(sin(x)/x) limit((sin(x+h)-sin(x))/h,h,0)
程序运行结果如下。
ans = 1 ans = cos(x)
再例如,求极限。
程序如下。
syms x t f=(1+2*t/x)^(3*x); limit(f,x,inf)
程序运行结果如下。
ans = exp(6*t)
MATLAB中提供了函数diff来求解导数和微分的计算,可以实现一元函数求导和多元函数求偏导数。若输入数据为离散数据时,则求的是差分。diff函数的调用格式主要有以下几种。
Y = diff(X); 计算X的导数。如果X是一个向量,那么返回的结果也是一个向量,求解的是向量X的差分,其返回值比X少一个值。 Y = diff(X,n); 返回X的n阶导数。 Y = diff(X,n,dim); 求解X沿着方向dim的n阶导数。
例如:
x=[1 2 3 4 5]; y=diff(x) z=diff(x,2)
程序运行结果如下。
y = 1 1 1 1 z = 0 0 0
例如:
syms x y=sin(x); Y=diff(y)
程序运行结果如下。
Y = cos(x)
在高等数学上,表达式的求和表示为。对于此类表达式,MATLAB提供了函数symsum来求解。其主要调用格式如下。
symsum(expr); 求表达式expr的和,其自变量的默认值为0~(v-1),其中v为默认的自变量。 symsum(expr,v); 求表达式expr的和,其自变量的默认值为0~(v-1)。 symsum(expr,a,b); 求表达式expr的和,其自变量的取值为a~b,其中v为默认的自变量。 symsum(expr,v,a,b); 求表达式expr的和,自变量v的取值为a~b。
【实例2-4】求表达式,
的极限值。
结果文件——配套资源“Ch2\SL204”文件
解:求第一个表达式极限值的程序如下。
syms n k f=1/(k*(k+1)); s=symsum(f,k,1,n)
程序运行结果如下。
s = n/(n + 1)
求第二个表达式极限值的程序如下。
syms x k f=x^(2*k-1)/(2*k-1); s=symsum(f,k,1,inf)
程序运行结果如下。
s = piecewise(abs(x) < 1, atanh(x))
积分是与微分对应的一种数学运算,也是高等数学中的重要部分。积分包括不定积分和定积分。与数值积分相比,符号积分具有指令简单、适应性强等特点,但符号积分的运算时间比较长,所计算的符号积分结果可能会比较复杂。在MATLAB中,提供了int函数来求解符号积分。其主要调用格式如下。
S=int(s); 求符号表达式s的不定积分,其积分变量由程序给定。 S=int(s,v); 求符号表达式s对自变量v的不定积分。 S=int(s,a,b); 求符号表达式s在区间[a,b]上的定积分。自变量为默认的自变量。 S=int(s,v,a,b); 求表达式s对自变量v在区间[a,b]的定积分。
【实例2-5】求不定积分。
结果文件——配套资源“Ch2\SL205”文件
解:程序如下。
syms x f=x*log(x); S=int(f,x)
程序运行结果如下。
S = (x^2*(log(x) - 1/2))/2
【实例2-6】求定积分。
结果文件——配套资源“Ch2\SL206”文件
解:程序如下。
syms x f=sin(x); S=int(f,x,0,pi/2)
程序运行结果如下。
S = 1
【实例2-7】计算二重不定积分。
结果文件——配套资源“Ch2\SL207”文件
解:程序如下。
syms x y f=x*exp(-x*y); F=int(int(f,'x'),'y')
程序运行结果如下。
F = exp(-x*y)/y
微分方程的数值解法,相对微分方程的符号解法来讲,显得更为复杂和困难。微分方程的符号解法在一定程度上解决了微分方程数值解法的难点。然而,符号解法有时候得不到简单的解,也有可能得不到微分方程的解,同时,符号解法的计算时间比较长。因此,在以后的科研工作中,我们要学会应用微分方程的数值解法和符号解法的交叉运用。
MATLAB提供了函数dsolve来求解符号微分方程,其主要调用格式如下。
R=dsolve('eqn','v'); 输入eqn为符号微分方程,v为自变量,系统默认的自变量为t,返回微分方程的通解。 R=dsolve('eq1,eq2,…','v'); 输入eq1,eq2,…为符号微分方程组,v为自变量,返回方程组的通解。 R=dsolve('eqn','cond1,cond2',…,'v'); 输入eqn为符号微分方程,而cond1,cond2,…为初始条件,v为自变量,返回方程特解。 R=dsolve('eq1,eq2,…','cond1,cond2,…','v'); 输入eq1,eq2,…为符号微分方程组,而cond1,cond2,…为初始条件,v为自变量,返回方程组的特解。
一阶导数dy/dx写成Dy,n阶导数写成Dny。
【实例2-8】求下列常微分方程的通解。
(1)dy/dx=2xy;
(2)dy/dx-2y/(x+1)=(x+1)5/2;
(3)。
结果文件——配套资源“Ch2\SL208”文件
解:(1)程序如下。
dsolve('Dy=2*x*y','x')
程序运行结果如下。
ans = C4*exp(x^2)
(2)程序如下。
dsolve('Dy-2*y/(x+1)=(x+1)^(5/2)','x')
程序运行结果如下。
ans = (2*(x + 1)^(7/2))/3 + C5*(x + 1)^2
(3)程序如下。
dsolve('D2y-5*Dy+6*y=x*exp(2*x)','x')
程序运行结果如下。
ans = C6*exp(2*x) - (x^2*exp(2*x))/2 - exp(2*x)*(x + 1) + C7*exp(3*x)
【实例2-9】求下列微分方程组的通解。
结果文件——配套资源“Ch2\SL209”文件
解:程序如下。
[Y,Z]=dsolve('Dy=3*y-2*z','Dz=2*y-z','x')
程序运行结果如下。
Y = 2*C8*exp(x) + C9*(exp(x) + 2*x*exp(x)) Z = 2*C8*exp(x) + 2*C9*x*exp(x)
【实例2-10】求微分方程
的特解,初始条件为y(1)=0,y(5)=0。
结果文件——配套资源“Ch2\SL210”文件
解:程序如下。
y=dsolve('x*D2y-3*Dy=x^2','y(1)=0,y(5)=0','x')
程序运行结果如下。
Y = 2*C8*exp(x) + C9*(exp(x) + 2*x*exp(x)) Z = 2*C8*exp(x) + 2*C9*x*exp(x)
说明
从以上3个例子可以看出,使用符号微分方程(组)的解法,可以很容易地求出微分方程的通解或特解,而不用经过复杂的手工计算,节省了大量的时间。
符号矩阵与数值矩阵存在着区别。例如,创建数值矩阵A=[1,2;3,4],那么这个矩阵在MATLAB中是可以识别的,然而矩阵A=[a,b;c,d]在MATLAB中则是不可识别的,必须通过符号矩阵进行创建。
在MATLAB中,我们使用str2sym函数创建符号矩阵,其调用格式如下。
A=str2sym('[]');
提示:(1)符号矩阵的内容与数值矩阵相同。(2)必须使用str2sym指令定义符号矩阵。(3)不能漏掉''标识。
例如:
A=str2sym('[a,2*b;3*a,0]')
输出结果为
A = [ a, 2*b] [ 3*a, 0]
这里需要注意的是,符号矩阵每一行的两端都有方括号,这是与MATLAB数值矩阵的一个重要区别。
除了使用sym指令创建符号矩阵,我们仍然可以使用字符串直接创建矩阵,例如,创建上述的矩阵A,采用字符串直接创建,可以输入如下程序。
A=['[a,2*b]';'[3*a,0]']
程序的输出结果为
A = [a,2*b] [3*a,0]
符号矩阵的修改方式有两种,一种是直接修改,另一种是通过指令的方式进行修改。现将两种修改方式讲解如下。
(1)直接修改。可用←或↑找到所要修改的矩阵,直接对矩阵中需要修改的值进行修改。
(2)指令修改。用指令的形式修改符号矩阵,有以下两种调用格式。
①A1=subs(A,'new','old');
②A1=subs(S,'old','new')。
【实例2-11】对于前面所叙述的矩阵A,将矩阵的第二行第二列的值修改为4b,然后将矩阵中的b用c来代替,试写出其程序。
结果文件——配套资源“Ch2\SL211”文件
解:程序如下。
A=str2sym('[a,2*b;3*a,0]'); %创建符号矩阵。 A(2,2)=str2sym('4*b') %直接修改。 A2=subs(A,'b','c') %将修改之后的值中的b用c来代替。
程序的输出结果如下。
A = [ a, 2*b] [ 3*a, 4*b] A2 = [ a, 2*c] [ 3*a, 4*c]
符号矩阵与数值矩阵之间是可以互相转化的,所用的函数仍然是sym函数,其调用格式为sym(A),其中A为数值矩阵。
【实例2-12】将数值矩阵转化为符号矩阵。
结果文件——配套资源“Ch2\SL212”文件
解:程序如下。
A=[1/3,2.5;1/0.7,2/5] sym(A)
程序的输出结果如下。
A = 0.3333 2.5000 1.4286 0.4000 ans = [ 1/3, 5/2] [ 10/7, 2/5]
最常用的符号矩阵分析函数如表2-1所示。
【实例2-13】求符号矩阵的行列式、特征值、逆矩阵。
结果文件——配套资源“Ch2\SL213”文件
解:程序如下。
syms a b c d A=[a b;c d] det(A) %行列式。 inv(A) %逆矩阵。 [V,D]=eig(A) %特征值和特征向量。
程序运行结果如下。
A = [ a, b] [ c, d] ans = a*d - b*c ans = [ d/(a*d - b*c), -b/(a*d - b*c)] [ -c/(a*d - b*c), a/(a*d - b*c)] V = [ (a/2 + d/2 - (a^2 - 2*a*d + d^2 + 4*b*c)^(1/2)/2)/c - d/c, (a/2 + d/2 + (a^2 - 2*a*d + d^2 + 4*b*c)^(1/2)/2)/c - d/c] [ 1, 1] D = [ a/2 + d/2 - (a^2 - 2*a*d + d^2 + 4*b*c)^(1/2)/2, 0] [ 0, a/2 + d/2 + (a^2 - 2*a*d + d^2 + 4*b*c)^(1/2)/2]
对于线性方程组的解法,通常采用矩阵的方式进行求解。因此,运用矩阵运算方法是求解线性方程组最简单有效的方法。符号方程组的解法和数值方程组的解法过程基本相同,运算指令也基本相同。
一般符号代数方程组的求解使用solve函数,其主要调用格式如下。
g=solve(eq); 求解方程eq=0的解,自变量由系统默认。 g=solve(eq,var); 求解自变量为var的方程eq=0的解。 g=solve(eq1,eq2,…,eqn); 求解方程组eq1,eq2,…,eqn构成的解,自变量由系统默认。 g=solve(eq1,eq2,…,eqn,var1,var2,…,varn); 求解自变量为var1,var2,…,varn的方程组eq1,eq2,…,eqn的解。
【实例2-14】求线性方程组的解。
思路点拨
本例题有两种解法,一种是使用克莱姆法则,即采用矩阵的方式进行求解;另一种是调用solve函数进行求解。
结果文件——配套资源“Ch2\SL214”文件
解:方法一:矩阵求解。
程序如下。
A=sym([1 -2 3 -4;0 1 -1 1;1 3 0 1;0 -7 3 1]); b=sym([4;-3;1;-3]); x=A\b
程序运行结果如下。
x = -8 3 6 0
方法二:调用solve函数。
程序如下。
eq1=str2sym('x1-2*x2+3*x3-4*x4-4'); eq2=str2sym('x2-x3+x4+3'); eq3=str2sym('x1+3*x2+x4-1'); eq4=str2sym('-7*x2+3*x3+x4+3'); S=solve(eq1,eq2,eq3,eq4,str2sym('x1'),str2sym('x2'),str2sym('x3'),str2sym ('x4')); disp([S.x1,S.x2,S.x3,S.x4])
程序运行结果如下。
[ -8, 3, 6, 0];
可以看出,两种计算方法得出的结果是一样的。但应注意到,后面采用disp函数显示结果。因为得出的结果在构架S中,不能直接显示结果,需要采用disp([S.x1,S.x2,S.x3,S.x4]),才可以正确显示方程组的解。
在数字信号处理这门学科中,傅里叶变换、拉普拉斯变换和Z变换及其反变换有着非常重要的作用,也是研究信号动态特性的必备基础知识。本节将介绍这3种积分变换及其反变换的MATLAB实现。
在信号处理学科中,时域信号f(t)与其在频域中的傅里叶变换有如下的对应关系。
在MATLAB中,提供了两个函数分别对应着上述的傅里叶变换及其反变换。这两个函数的名称及其调用格式如表2-2所示。
【实例2-15】求时域函数的傅里叶变换,并将傅里叶变换后的函数进行反变换,验证其正确性。
思路点拨
本例题需要用到fourier和ifourier函数,同时,我们也可以通过绘图函数观察时域曲线及傅里叶变换后的频域曲线。绘图函数将在稍后的章节中讲到,这里为了叙述方便,提前使用绘图函数。
结果文件——配套资源“Ch2\SL215”文件
解:(1)傅里叶变换。
程序如下。
syms t w; ft=sin(t); fw=fourier(ft,t,w)
程序运行结果如下。
fw = -pi*(dirac(t - 1) - dirac(t + 1))*1i
(2)傅里叶反变换。
程序如下。
f=ifourier(fw,w,t); simplify(f) %进一步简化
程序运行结果如下。
ans = sin(t)
可以看出,结果是正确的。
(3)现在绘制两个函数的图形,程序如下。
t=-2:0.1:2; ft=sin(t); subplot(211); plot(t,ft,'r'); subplot(212); ezplot(fw)
绘制后的图形如图2-1所示。
拉普拉斯变换及其反变换也是信号处理学科中应用非常广泛的一种积分变换,拉普拉斯变换及其反变换的定义如下。
与傅里叶变换一样,其函数及其调用格式如表2-3所示。
【实例2-16】求函数的拉普拉斯变换,并将拉普拉斯变换后的函数进行反变换。
思路点拨
本例题中所给出的函数是信号处理和自动控制原理课程中经常用到的函数,读者应该有所了解。
结果文件——配套资源“Ch2\SL216”文件
解:(1)拉普拉斯变换。
程序如下。
syms a s t; f1=exp(-a*t); f2=sin(t); f3=cos(t); Fs1=laplace(f1,t,s) Fs2=laplace(f2,t,s) Fs3=laplace(f3,t,s)
程序运行结果如下。
Fs1 = 1/(a + s) Fs2 = 1/(s^2 + 1) Fs3 = s/(s^2 + 1)
(2)拉普拉斯反变换。程序如下。
ft1=ilaplace(Fs1) ft2=ilaplace(Fs2) ft3=ilaplace(Fs3)
程序运行结果如下。
ft1 = exp(-a*t) ft2 = sin(t) ft3 = cos(t)
【实例2-17】求的拉普拉斯反变换。
思路点拨
求函数的拉普拉斯反变换采用函数ilaplace。
结果文件——配套资源“Ch2\SL217”文件
解:程序如下。
syms s; Fs=(s+3)/(s^3+3*s^2+6*s+4); ft=ilaplace(Fs); simplify(ft)
程序运行结果如下。
ans = (exp(-t)*(3^(1/2)*sin(3^(1/2)*t) - 2*cos(3^(1/2)*t) + 2))/3
Z变换是离散信号处理中应用非常广泛的一种积分变换。一个离散的因果序列的Z变换及其反变换的定义如下。
计算Z变换的反变换时,最常见的计算方法有3种:幂级数展开法、部分分式展开法及围线积分法。在MATLAB的符号工具箱中,所采用的计算Z变换的反变换的方法是围线积分法,其对应的表达式为
在MATLAB中,计算Z变换及其反变换的函数分别为ztrans和iztrans,其调用格式及用途如表2-4所示。
【实例2-18】求函数的Z变换表达式。
思路点拨
采用符号计算方法计算Z变换,首先需要定义符号变量k、l、T。
结果文件——配套资源“Ch2\SL218”文件
解:(1)Z变换。
程序如下。
syms k l T; fn=k*exp(-l*k*T); Fz=ztrans(fn)
程序运行结果如下。
Fz = (k*z)/(z - exp(-T*k))
(2)Z变换的反变换。
程序如下。
f=iztrans(Fz); simplify(f)
程序运行结果如下。
ans = k*exp(-T*k)^n
【实例2-19】求序列,
,
的Z变换及其反变换。
思路点拨
本题的思路和上述的例题相似,仍然需要定义符号变量。
结果文件——配套资源“Ch2\SL219”文件
解:(1)Z变换。
程序如下。
syms n w T z; f1=6*(1-0.5^n); f2=sin(w*n*T); f3=1; Fn1=ztrans(f1) Fn2=ztrans(f2) Fn3=ztrans(f3,n,z)
程序运行结果如下。
Fn1 = (6*z)/(z - 1) - (6*z)/(z - 1/2) Fn2 = (z*sin(T*w))/(z^2 - 2*cos(T*w)*z + 1) Fn3 = z/(z - 1)
(2)Z变换的反变换。
程序如下。
fn1=simplify(iztrans(Fn1)) fn2=simplify(iztrans(Fn2)) fn3=simplify(iztrans(Fn3))
程序运行结果如下。
fn1 = 6 - 6/2^n fn2 = sin(T*n*w) fn3 = 1
在自动控制原理的教材中,通过方框图求取或通过信号流图求取控制系统的传递函数,必然都会讲到使用梅森增益公式。梅森增益公式的定义为
式中,Y、U分别表示系统的输出和输入;Δ是方框图或信号流图的特征多项式;pk是从输入到输出的第k条前向通道增益;Δk是与第k条前向通道对应的余子式;n为输入输出间的前向通道总数。
在自动控制原理的课程中,我们都会讲解用手工计算系统的传递函数,这对于结构简单的控制系统来说是可以使用的,但当系统的阶数和结构比较复杂时,手工计算就显得非常复杂和困难,而且容易出错。在Simulink仿真中,我们可以通过创建模型,从而进一步求解系统的传递函数,在工程上,这是一种最优的解法。本节将讲解使用符号计算方法,通过系统的方框图和信号流图计算系统的传递函数。
【实例2-20】用符号计算方法求图2-2所示系统的传递函数。
思路点拨
本例在计算之前首先要做的工作:①将各个状态变量依次标注在方框图中;②建立系统的状态方程;③通过状态方程推导传递函数的表达形式。
结果文件——配套资源“Ch2\SL220”文件
解:(1)标注状态变量。
状态变量依次标注为x1,x2,…,x7,如图2-3所示。
(2)建立系统的状态方程。
根据自动控制原理的知识可以知道,系统的状态方程可以建立为
其中,U和Y分别为系统的输入和输出。
根据方框图,我们可以得出该系统的状态方程为
(3)传递函数表达形式。
根据上述的状态方程,通过推导,可以得到系统的传递函数的表达形式为
其中I为单位矩阵。
(4)计算程序如下。
syms G1 G2 G3 G4 H1 H2 H3; A=[0 0 0 0 0 0 -G1; G2 0 0 0 0 -G2 0; 0 G3 0 0 G3 0 0; 0 0 G4 0 0 0 0; 0 0 0 H2 0 0 0; 0 0 0 H1 0 0 0; 0 0 0 H3 0 0 0]; b=[G1;0;0;0;0;0;0]; c=[0 0 0 1 0 0 0]; G=c*((eye(size(A))-A)\b); [num,den]=numden(G); num/den
程序的运行结果如下。
ans = (G1*G2*G3*G4)/(G2*G3*G4*H1 - G3*G4*H2 + G1*G2*G3*G4*H3 + 1)
化为符合阅读的形式,则得出的结果为
G1 G2 G3 G4 ------------------------------------------- G2 G3 G4 H1 - G3 G4 H2 + G1 G2 G3 G4 H3 + 1
提示:细心的读者可以发现,该解法也只是适合于阶数较小的系统,若是系统的阶数较高,状态矩阵的输入也是相当烦琐的。这里的eye函数是产生单位矩阵,这将在第3章中讲到。
在自动控制原理的教材中,除了用系统的方框图表示系统之外,还可以使用信号流图表示系统的结构和参数。具体的细节读者可以参考自动控制原理的教材。那么,本节就来讲解如何通过系统的信号流图来计算系统的传递函数。
【实例2-21】对于实例2-20所讲的系统方框图,其对应的信号流图如图2-4所示。
试通过信号流图求取系统的传递函数。
思路点拨
以信号流图为载体求取系统的传递函数与以系统的方框图为载体求系统的传递函数的具体步骤是相似的,只不过这里系统的状态矩阵发生了变化。具体过程如下。
结果文件——配套资源“Ch2\SL221”文件
解:(1)系统的状态方程。
根据自动控制原理知识,建立系统的状态方程为
根据信号流图,可以写出系统的状态方程为
(2)传递函数。
由系统的状态方程表示的传递函数为
其中I为单位矩阵。
(3)计算程序如下。
syms G1 G2 G3 G4 H1 H2 H3 A=[0 0 0 0 -H3; G1 0 0 0 -H1; 0 G2 0 0 H2; 0 0 G3 0 0; 0 0 0 G4 0]; b=[1;0;0;0;0]; c=[0 0 0 0 1]; G=c*((eye(size(A))-A)\b); [num,den]=numden(G); num/den; pretty(num/den)
程序的运行结果如下。
G1 G2 G3 G4 ------------------------------------------- G2 G3 G4 H1 - G3 G4 H2 + G1 G2 G3 G4 H3 + 1
从以上两个例子可以看出,通过信号流图计算的传递函数与通过系统方框图计算的传递函数的结果是一样的。对于其他的自动控制系统,都可以运用类似的方法进行传递函数的求解。
图形在函数的理解中占有非常重要的地位,MATLAB提供了强大的图形绘制功能,符号计算和符号绘图函数为用户提供了更多的便利。本节主要讲解MATLAB符号工具箱中提供的绘图函数。
解:程序如下。
二维图形在数学图形中占据着非常大的比例。MATLAB提供的二维绘图函数为ezplot。本小节就ezplot函数的使用进行详细的说明。ezplot可以绘制显函数或隐函数的图形,同样也可以绘制参数方程的图形。
ezplot的主要调用格式如下。
ezplot(fun); 绘制函数fun在默认区间[-2π,2π]的图形,这里函数fun的自变量只有x。 ezplot(fun,[xmin,xmax]); 绘制函数fun在区间的图形。 ezplot(fun2); 绘制隐函数fun2在默认区间
的图形。 ezplot(fun2,[xymin,xymax]); 绘制隐函数fun2在区间
的函数图形。 ezplot(fun2,[xmin,xmax,ymin,ymax]); 绘制隐函数fun2在区间
,
的函数图形。 ezplot(funx,funy); 绘制参数方程funx、funy在默认自变量区间
的函数图形。 ezplot(funx,funy,[tmin,tmax]); 绘制参数方程funx、funy在参数t的取值范围为
的函数图形。
下面通过具体实例来讲解函数ezplot的各种调用格式的图形效果。
【实例2-22】绘制函数y=x2的图形。
思路点拨
利用ezplot函数的第一种调用格式。
结果文件——配套资源“Ch2\SL222”文件
ezplot('x^2')
函数图形如图2-5所示。
从图形中可以看出,其默认的函数区间为。
【实例2-23】绘制函数在区间
的图形。
思路点拨
ezplot函数的第二种调用方式,绘制函数在指定区间的图形。
结果文件——配套资源“Ch2\SL223”文件
解:程序如下。
ezplot('x^2',[-1,1]); grid;
函数图形如图2-6所示。
【实例2-24】绘制隐函数的函数图形。
思路点拨
利用ezplot绘制隐函数在默认区间的函数图形。
结果文件——配套资源“Ch2\SL224”文件
解:程序如下。
ezplot('x^2-y^4'); grid;
函数图形如图2-7所示。
【实例2-25】绘制隐函数在区间[-2,2]的函数图形。
思路点拨
利用ezplot绘制隐函数在指定区间的函数图形,调用格式如下。
ezplot(fun2,[xymin, xymax]);
结果文件——配套资源“Ch2\SL225”文件
解:程序如下。
ezplot('x^2-y^4',[-2,2]); grid;
函数图形如图2-8所示。
【实例2-26】绘制参数方程的函数图形。
思路点拨
利用ezplot函数绘制参数方程的函数图形,调用格式如下。
ezplot(funx,funy);
结果文件——配套资源“Ch2\SL226”文件
解:程序如下。
syms x y t x=t*cos(t); y=t*sin(t); ezplot(x,y); grid;
函数图形如图2-9所示。
函数ezplot3可以用于绘制三维曲线,其调用格式如下。
ezplot3(funx,funy,funz) 绘制三维曲线x=x(t),y=y(t),z=z(t)在默认区间的函数图形。 ezplot3(funx,funy,funz,[tmin,tmax]) 绘制三维曲线x=x(t),y=y(t),z=z(t)在区间[tmin,tmax]的函数图形。 ezplot3(...,'animate') 生成空间曲线的动态轨迹。
下面通过具体的实例讲解三维绘图函数ezplot3的调用。
【实例2-27】绘制三维曲线在默认区间的函数图形。
思路点拨
本实例讲解ezplot3的具体使用,调用格式如下。
ezplot3(funx,funy,funz)
结果文件——配套资源“Ch2\SL227”文件
解:程序如下。
syms x y z t x=cos(t); y=sin(t); z=t; ezplot3(x,y,z);
函数图形如图2-10所示。
等高线是非线性规划理论中的一部分,其在寻找目标函数的最优解中有着非常重要的作用。MATLAB提供了ezcontour和ezcontourf两个函数分别用于绘制函数等高线和带有区域填充的等高线。
ezcontour的调用格式如下。
ezcontour(fun); 绘制函数fun(x,y)在默认区间的等高线,该函数的默认区间为。 ezcontour(fun,domain);绘制函数fun(x,y)在指定区间domain的等高线。 ezcontour(...,n); 绘制函数的等高线图,其数目由n指定,默认值n=60。
ezcontourf的调用格式如下。
ezcontourf(fun) ezcontourf(fun,domain) ezcontourf(...,n)
其描述与ezcontour相同,这里不再赘述。
下面通过实例讲解这两个函数的具体使用。
【实例2-28】绘制函数的等高线图,在同一张图中分别用ezcontour和ezcontourf绘制。
思路点拨
利用ezcontour和ezcontourf绘制函数等高线图,利用subplot函数将图纸分成两部分。subplot函数将在以后的章节中讲解。
结果文件——配套资源“Ch2\SL228”文件
解:程序如下。
syms x y f=3*(1-x^2)*exp(-x^2-y^2)+5*(x-x^4-y^3)-1/3*exp(-(x+1)^2-y^2); subplot(121); ezcontour(f); subplot(122); ezcontourf(f);
程序运行结果如图2-11所示。
在MATLAB中,提供了ezmesh、ezmeshc、ezsurf和ezsurfc函数实现三维曲面的绘制。下面分别介绍这4个函数的用途及调用格式。其中,ezmesh和ezsurf的调用格式相同,ezmeshc和ezsurfc的调用格式相同。
用途:绘制三维网格曲面图。
调用格式:
ezmesh(fun) 绘制二维函数fun(x,y)在默认区间-2π < x <2π,-2π< y < 2π的网格图。 ezmesh(fun,domain) 绘制二维函数fun(x,y)在指定区域domain的网格图。 ezmesh(funx,funy,funz) 绘制三维函数funx(s,t)、funy(s,t)、funz(s,t)在s、t的默认取值范围为-2π < s <2π, -2π < t < 2π的网格图。 ezmesh(funx,funy,funz,[smin,smax,tmin,tmax]) 绘制三维函数funx(s,t)、funy(s,t)、funz(s,t)在s、t的取值范围为[smin,smax,tmin,tmax]的网格图。 ezmesh(funx,funy,funz,[min,max]) 绘制三维函数funx(s,t)、funy(s,t)、funz(s,t)在s、t的取值范围为[min,max]的网格图。 ezmesh(...,n) 绘制函数fun的网格图,其网格数目由n指定,默认值为n=60。
用途:绘制函数的三维表面图。
调用格式:
ezsurf(fun) ezsurf(fun,domain) ezsurf(funx,funy,funz) ezsurf(funx,funy,funz,[smin,smax,tmin,tmax]) ezsurf(funx,funy,funz,[min,max]) ezsurf(...,n)
其具体函数描述与函数ezmesh相同,这里不再赘述。
下面通过实例描述ezmesh及ezsurf的具体调用。
【实例2-29】绘制函数的网格图和三维表面图。
思路点拨
本实例涉及函数ezmesh和函数ezsurf的使用,以及subplot函数的使用。
结果文件——配套资源“Ch2\SL229”文件
解:程序如下。
syms x y f=x*exp(-x^2-y^2); subplot(121); ezmesh(f); subplot(122); ezsurf(f);
绘制的函数图形如图2-12所示。
用途:绘制函数的三维网格图的同时绘制函数的等高线。
调用格式:
ezmeshc(fun) ezmeshc(fun,domain) ezmeshc(funx,funy,funz) ezmeshc(funx,funy,funz,[smin,smax,tmin,tmax]) ezmeshc(funx,funy,funz,[min,max]) ezmeshc(...,n)
调用格式的具体描述仍然与函数ezmesh相同,这里不再赘述。
用途:绘制三维曲面的同时绘制函数的等高线。
调用格式:
ezsurfc(fun) ezsurfc(fun,domain) ezsurfc(funx,funy,funz) ezsurfc(funx,funy,funz,[smin,smax,tmin,tmax]) ezsurfc(funx,funy,funz,[min,max]) ezsurfc(...,n)
调用格式的具体描述仍然与函数ezmesh相同,这里不再赘述。
下面通过实例来讲解这两个函数的具体调用。
【实例2-30】绘制函数的网格图、三维表面图及所对应的等高线图。
思路点拨
本实例涉及函数ezmeshc和函数ezsurfc的调用,以及subplot函数的使用。
结果文件——配套资源“Ch2\SL230”文件
解:程序如下。
syms x y f=x*exp(-x^2-y^2); subplot(121); ezmeshc(f); subplot(122); ezsurfc(f);
绘制的函数图形如图2-13所示。