《MATLAB程序设计与调试优化》由会员分享,可在线阅读,更多相关《MATLAB程序设计与调试优化(35页珍藏版)》请在金锄头文库上搜索。
1、2018/8/26,1,MATLAB 程序设计与调试优化,2018/8/26,2,非线性方程求解的牛顿-拉夫逊法,2018/8/26,3,2018/8/26,4,2018/8/26,5,2018/8/26,6,多变量的牛顿-拉夫逊法,对于含n个未知数的n个方程,,估计值与解之间的误差为,2018/8/26,7,多变量的求解方法,J,2018/8/26,8,应用背景,已知电源的幅值和相位,M处的有功和无功(分别为2和1),Z的值,如何计算M处的电压(幅值和相位)?,Z=j0.1,P+jQ,M,2018/8/26,9,数学方程,2018/8/26,10,求解方法,2018/8/26,11,MATL
2、AB程序的基本组成部分,说明部分(或称之为注释部分) 清除命令(可选) 定义变量(局部变量和全局变量) 按照顺序行执行的命令语句 控制语句开始控制语句体控制语句结束 其他命令(如绘图等),2018/8/26,12,工作环境的设定,设置路径的原因:对于用户程序中使用的文件名和变量名,系统按照以 下顺序搜索: (1)查找对象是否是工作空间的变量。 (2)查找对象是否是系统的内部函数。 (3)查找对象是否是在系统的当前目录下,2018/8/26,13,MatLab的基本语法,数据类型 常量和变量 程序运算符 程序控制语句 M文件,2018/8/26,14,MatLab的基本语法 -数据类型(1),M
3、atLab 6.5 共有7种基本的数据类型以及若干衍生类型。汇总如下图所示。,2018/8/26,15,MatLab的基本语法 -常量和变量,MatLab中的常量:类似于c语言中的整型常量和实型常量,常量的表方法一般采用十进制数来表示,可以带正负号和小数点,当然也可采用科学记数法。如1、25、0.0033、2e7、pi、2十3i等都是MATLAB的合法常量。这里的2十3i是复数常量,它是由实数与虚数单位i组成 MATLAB中的变量:一般无需事先定义。一个程序中的变量以其名称在操作语句第一次合法出现而定义。如果这个变量已经存在,那么MATLAB将改变它的内容,如a2.5定义了一个变量a,并给它赋
4、值2.5;如果再输入a3,那么变量a的值就变为3。,2018/8/26,16,MatLab的基本语法 -常量和变量(2),MATLAB中的变量命名应该遵循以下规则: 变量名必须以字母开头,后面可以是任意的字母、数字或下划线。 MATLAB变量名有效的最大长度是31。 MLAB的变量要区分大小写,如:MY_NAME,My_name,my_name分别表示不同的变量。 MatLab自身带有一些具有特殊含义的变量和常量,用户在使用时不能对这些量进行变更。例如:pi表示圆周率,inf表示数学中的正无穷大等。,2018/8/26,17,MatLab的基本语法 程序运算符,MATLAB的运算符可分为三类:
5、 算术运算符 关系运算符 逻辑运算符,2018/8/26,18,MatLab的基本语法 程序控制语句,MATLAB控制语句主要有以下几类: for循环结构 While循环结构 ifelseend分支结构 switchcase分支结构,2018/8/26,19,MatLab的基本语法 程序控制语句,for循环结构for循环语句通常用来执行循环次数已知的情况。它可以按照用户指定的次数来执行循环体中的内容。调用格式:for x初值:步长:终值循环体end注意:变量x通常称为循环变量;初值、终值和步长可以是标量,也可以是表达式。当循环语句开始执行时,变量x的值被赋为和初值相同的内容。每执行一次循环体中
6、的内容,变量x的值就会按照步长的大小来改变。如果步长是一个正数,那么变量x的值增加一个步长;如果步长是一个负数,那么变量的值就减小一个步长。在步长为正的情况下,如果变量的值小于终值,就将继续执行循环体中的内容。当步长为负时,如果变量的值大于终值,也将继续执行循环体中的内容。如此循环,直到变量的值大于或者小于终值的内容,这个for语句循环就结束,而继续执行end语句下面的命令。语句中的步长可以省略不写,在这种情况下,默认的步长值为1。for循环语句允许嵌套,每一个“for”关键字必须和一个“end”配对。,2018/8/26,20,MatLab的基本语法 程序控制语句,While循环结构whil
7、e语句根据一个控制表达式的值来确定程序的运行方式。常用于事先不能确定循环次数的情况。调用格式:while表达式循环体end当表达式中的值为真时,执行循环体。当循环体执行完毕后,继续判断表达式的值,如果仍为真,那么继续执行循环体,如此循环,直到表达式的值为假时终止循环。当表达式的值是一个矩阵,且矩阵中所有元素都不为零时,才执行循环体中的内容。如果表达式A是一个空矩阵,那么循环体中的内容永远不会被执行。另外,要想在任何时候终止循环(for或while循环),可利用break语句。终止循环后继续执行end语句下面的语句。,2018/8/26,21,MatLab的基本语法 程序控制语句,ifelsee
8、nd分支结构if语句是一种条件选择结构语句,它根据不同逻辑表达式的值来判断程序在执行过程中需要执行哪些语句。 调用格式:if 逻辑表达式命令语句体end在程序执行该语句的过程中,首先判断逻辑表达式的值。如果逻辑表达式的值为真,那么程序就会执行命令语句体的所有语句。如果逻辑表达式的值为假,那么就跳过命令语句体,继续执行end语句之后的语句。,2018/8/26,22,MatLab的基本语法 程序控制语句,switchcase分支结构switch语句可以根据一个变量或表达式的值执行特定的语句。调用格式:switch表达式0case表达式l的值命令行lcase表达式2的值命令行2.otherwise
9、 命令行nend,先计算switch后面表达式0的值,然后检查case语句后面的值是否与表达式0的值相等,如表达式1的值与之相等,则执行命令行1,否则继续检查第二个case子句,以此类推,如果所有case子句的值均不等于表达式0的值,则执行othewise语句后面的命令行n。和c语言不同的是,在switch结构中,如果一个case条件满足,那么在执行完这个case语句中的语句体之后,就会立接去执行end语句后面的语句而不并判断其他case语句的情况。,2018/8/26,23,MatLab的基本语法 M文件,引入M文件的原因:对于比较简单的问题和一次性问题,通过指令窗中直接输入一组指令去求解,
10、也许是比较简便、快捷的。但当待解决问题所需的指令较多和所用指令结构较复杂时,或当一组指令通过改变少量参数就可以被反复使用去解决不同问题时,直接在指令窗中输入指令的方法就显得烦琐。为了代替在MATLAB提示符下输入的多条MATLAB命令语句,可以把这些命令写入一个文本文件,这个文本文件可用一个编辑器创建。每当用户输入这个文件名以及它的自变量时,这些命令就由MATLAB执行。当文件中最后一个命令被执行时,MATLAB能再从指令窗口读取命令,这样的文件就叫做M文件。,2018/8/26,24,MatLab的基本语法 M文件类型,M文件的类型 :脚本(Script)文件,教材中也称之为命令文件函数(F
11、unction)文件这两种文件均以“.m”为后缀。,2018/8/26,25,MatLab的基本语法 脚本M文件,脚本(Script)文件(命令文件):脚本文件的主要用途是使命令输入更加简单化。如果用户需要重复输入许多命令,即可将这些命令放在一个脚本文件里(脚本文件没有输入参数和输出参数)。可以说,脚本文件只不过是将用户在MATLAB的命令行窗口中输入的一串命令用另外一个名称代替而己,并且脚本文件的运行结果每次都是相同的。 特点如下:该文件中的指令形式和前后位置,与解决同一个问题时在指令窗中输入的那组指令没有任何区别。 MATLAB在运行这个脚本时,只是简单地从文件中读取一条条指令送到MATL
12、AB中执行。与在指令窗中直接运行指令一样,脚本文件运行产生的变量都是驻留在MATLAB基本工作空间中。,2018/8/26,26,MatLab的基本语法 函数M文件,函数(Function)文件:函数文件的主要用途是用来扩充MATLAB的应用范围和满足用户不同的实际应用需求。函数文件可以接受输入变量,也可以返回输出变量。除了输入变量和输出变量以外,在函数文件内部的其他变量通常为该函数文件的局部变量,并不会出现在MATLAB的工作空间内。而能够保留在MATLAB的工作空间内的变量只有该函数文件的输入和输出变量。也就是说,函数文件对于变量的运算是在函数本身的工作空间内进行的,它和MATLAB的命令
13、窗口中的工作空间是相互独立的。MATLAB对函数文件的处理与对脚本文件的处理不同,函数文件对外只表现其输入参数和输出结果,内部的运作对外是封闭的,利用这个特性,容易实现编程的模块化。函数文件的具体特点如下: 从形式上看,与脚本文件不同,函数文件的第一行总是以“function”引导的“函数申明行”。 从运行上看,与脚本文件运行不同,每当函数文件运行,MATLAB就会专门为它开辟一个临时工作空间。称之为函数工作空间(function workspace)。所有中间变量都存放在函数工作空间中。当执行完文件最后一条指令或遇到return时,就结束该函数文件的运行,同时该临时函数空间及其所有的中间变量
14、就立即被清除。 函数空间随具体M函数文件的被调用而产生,随调用结束而删除。函数空间相对基本空间是独立的、临时的。在MATLAB整个运行期间,可以产生任意多个临时函数空间。 假如在函数文件中,发生对某脚本文件的调用,那么该脚本文件运行产生的所有变量都存放于该函数空间之中,而不是存放在基本空间。,2018/8/26,27,M文件的命名,不能用数字作为文件名。不能用和Matlab特有变量名相同的名称。不能和已在workspace中的变量或常量同名。,2018/8/26,28,MatLab程序调试和代码优化,2018/8/26,29,MatLab程序的常见错误,编写M文件时,常见的错误有两种:语法错误
15、和运行错误。 语法错误:指变量名、函数名的误写,标点符号的缺漏等。这类错误Matlab能在运行前发现给出提示(包括相应的错误原因和所在位置),并终止运行。 运行错误:指算法本身引起的,发生在运行过程中的错误。相对语法错误,动态的运行错误较难查找和处理。,2018/8/26,30,运行错误难以查找和处理的原因,运行错误来源多元化。如来源于算法模型和期望目标是否一致,程序模型和算法是否一致,涉及用户对期望目标原理的理解、对算法的理解,还涉及用户对Matlab指令的理解、对程序流的理解,及对Matlab工作原理的理解。 运行错误的表现形式多样化:程序正常运行但结果不对,程序运行不正常而中断等。 运行
16、错误是动态错误。尤其是M函数文件,它一旦停止运行,其中间变量被删除一空,错误很难查找。另外有些情况下结果正常,有些情况下结果不正确。 程序的运行错误必须借助程序调试技术才能解决。,2018/8/26,31,MatLab程序调试方法,直接调试法利用调试器,2018/8/26,32,直接调试法,由于MatLab语言可读性强,对于较简单的程序直接调试法比较有效。直接调试一般包括以下几个方面: 检查所调用的函数或要载入的数据文件是否在当前目录或搜索路径上。 将重点怀疑的语句行、指令行后的“;”去掉,使计算结果能显示在主命令窗口。 在适当的位置加入显示某些关键变量值的语句(如用disp) 利用echo指令,使运行时,在屏幕上逐行显示文件内容。echo on能显示M脚本文件;echo FunName on能显示名为FunName的M函数文件。 在程序适当位置加入keyboard指令。Matlab运行到这一指令时,会暂停执行,并在MatLab指令窗口中出现K提示符。此时用户可以输入指令查看各种变量的值,也可修改变量的值。输入回车后结束查看,原文件继续运行。,