
数学建模M对ATLAB培训.ppt
255页MATLAB在数学建模中的应用在数学建模中的应用 上海电机学院上海电机学院 武文佳武文佳 wuwj@ 2013.7.8全国大学生数学建模竞赛全国大学生数学建模竞赛((CUMCM))China Undergraduates Mathematical Contest in Modeling• 1992年由中国工业与应用数学学会年由中国工业与应用数学学会(CSIAM)组织第一次竞赛组织第一次竞赛• 1994年起由教育部高教司和年起由教育部高教司和CSIAM共同举办,每年一次共同举办,每年一次(9月月)• 2012 年,来自全国年,来自全国33个省个省/市市/自治区自治区(包括香港和澳门特区包括香港和澳门特区)及及新加坡的新加坡的1284所院校、所院校、21219个队(其中本科组个队(其中本科组17741队、专科队、专科组组3478队)、队)、63600多名大学生报名参加本项竞赛多名大学生报名参加本项竞赛• 网址:网址:• 奖励:证书奖励:证书 ((“一次参赛,终身受益一次参赛,终身受益”))• 等级:全国一等奖等级:全国一等奖~3%、二等奖、二等奖~ 7%;赛区一、二等奖;赛区一、二等奖~1/3 • 2013年高教社杯全国大学生数学建模竞赛时间:年高教社杯全国大学生数学建模竞赛时间: 2013年年9月月13日上午日上午8:00竞赛内容与形式竞赛内容与形式内容内容• 赛题:工程技术、管理科学等科学领域的实际问题赛题:工程技术、管理科学等科学领域的实际问题• 答卷:一篇包含模型假设、建立、求解、计算方法设计和答卷:一篇包含模型假设、建立、求解、计算方法设计和计算机实现、结果分析和检验、模型改进等方面的论文计算机实现、结果分析和检验、模型改进等方面的论文形式形式• 3名大学生组队,在名大学生组队,在3天内完成天内完成—“队长队长”• 可使用任何材料(图书、计算机、软件、互联网等),可使用任何材料(图书、计算机、软件、互联网等),但不得与队外任何人讨论(包括上网讨论)但不得与队外任何人讨论(包括上网讨论)宗旨宗旨创新意识创新意识 团队精神团队精神 重在参与重在参与 公平竞争公平竞争标准标准假设的合理性,建模的创造性,假设的合理性,建模的创造性,结果的正确性,表述的清晰性结果的正确性,表述的清晰性数学建模过程数学建模过程现实对象的信息数学模型的解答现实对象的解答数学模型表述(归纳)求解(演绎)解释验证现实对象与数学模型的关系 数学建模步骤模型准备模型假设模型建立模型求解模型分析模型检验模型应用1)模型准备: 了解问题的实际背景实际背景,明确建模目的目的,掌握对象的各种信息各种信息如统计数据等,弄清实际对象的特征特征。
----查找资料,读懂题意建模步骤建模步骤2)模型假设:根据实际对象的特征特征和建模目的目的,对问题进行必要地合理地简化必要地合理地简化不同的假设会得到不同的模型Ø过度的简化而得到模型可能无实用价值Ø舍不得简化又可能导致得到一个无法求解的模型或模型的解非常复杂,以致无法应用注意:对于一个假设,最重要的是它是否符合实际情况,而不是为了解决问题的方便 有些假设在建模过程中才会发现因此在建模是要注意调整假设3)模型建立:模型建立: •分清变量类型,恰当使用数学工具;•抓住问题的本质,简化变量之间的关系;•要有严密的数学推理,模型本身要正确;•要有足够的精确度4)模型求解:选择恰当的方法求解所建立的数学模模型求解:选择恰当的方法求解所建立的数学模型,包括画图等型,包括画图等编程求解:MATLAB,Lingo/Lindo,Mathematica等建模步骤建模步骤6)模型检验模型检验: 把模型分析的结果“翻译”回到实际对象中,用实际现象、数据等检验模型的合理性和适应性如果模型不实用,必须从模型假设那里重新开始,直到得到可用模型7)模型应用和推广模型应用和推广:应用中可能发现新问题,需继续完善;所建立的模型稍加处理可推广到其他领域。
5)模型分析模型分析:结果分析、数据分析变量之间的依赖关系或稳定性态;数学预测;最优决策控制建模步骤建模步骤从论文评阅看学生参加竞赛中的问题从论文评阅看学生参加竞赛中的问题• 吃透题意方面的不足;吃透题意方面的不足;• 就事论事,形成数学模型的意识和能力欠缺;就事论事,形成数学模型的意识和能力欠缺;• 不管具体条件,套用现成的方法,导致错误;不管具体条件,套用现成的方法,导致错误;• 对结果的分析不够,怎样符合实际考虑不周;对结果的分析不够,怎样符合实际考虑不周;• 写作方面的问题(摘要、简明、优缺点、参考文献)写作方面的问题(摘要、简明、优缺点、参考文献)要想在数学建模竞赛中取得好成绩,要要想在数学建模竞赛中取得好成绩,要注意注意 1. 建立好的数学模型,不在于用了什么高深的方 法,而要能有效、简便、恰当的解决实际问题2. 好的求解方法:算法和编程实现假期要注意多看优秀论文,熟悉建模常用算法并编程训练3. 高质量的论文:描述清晰,让评委知道你如何分析问题,数学模型是什么,用了什么方法,最后结论是什么把问题描述清楚注意事项:注意事项: 1.充分的准备和训练:通过培训和自学,熟悉常见模型和方法,多积累建模案例。
----量变到质变 2.重视建模论文的排版和技巧:建模论文是最后决定是否获奖的关键,注意固定的规范,平时多看建模论文软件准备:Office,Mathtype,MATLAB3.项目管理和时间管理:制定好三天时间的规划,队长必须具有好的协调组织和进程控制能力一旦选题,尽量不要中途换题目4.团队合作能力:一个人再厉害,在三天内也无法做出很好的建模论文Ø切勿自己只管自己那部分,要大家一起讨论Ø队长----相当于计算机中的CPU,一定要给力Ø互相讨论,各有侧重,互相帮助5.要有勇争第一的意识和勇气Ø 数学建模对队员的意志力要求比较高Ø 信心,相信自己能做好Ø 遇到困难不轻言放弃,很多时候,只要再坚持一下,就可以克服一些难题注意事项:注意事项: 13数学建模软件数学建模软件 MATLAB—— MATLAB 基础基础14主要内容主要内容n Matlab 介绍介绍n Matlab 的基本用法的基本用法 15培训要求:听课培训要求:听课+课后作业课后作业l将所有文件作为附件,以邮件形式发给将所有文件作为附件,以邮件形式发给 wuwj@ 主题为:主题为:数学建模数学建模-三位同学姓名三位同学姓名l两字段之间用英文状态下的减号连接两字段之间用英文状态下的减号连接l每个每个 M 文件的第一行添加一条注解语句文件的第一行添加一条注解语句:% 数学建模数学建模-三位同学姓名三位同学姓名-作业题号作业题号l交作业截止日期交作业截止日期::2013年年7月月15日日q 课后作业课后作业要求要求16数学建模软件数学建模软件l 程序设计语言:程序设计语言:BASIC,,Pascal,,FORTRAN,,C,,...l 数值计算软件:数值计算软件: Matlab,,Scilab,,Octave,,...l 符号计算软件:符号计算软件:Mathematica,,Maple,,...l 交互式数学软件:交互式数学软件:MathCAD,,Calcwin,,...l 统计软件:统计软件:SAS,,SPSS,,Minitab,,...l 数学规划软件:数学规划软件:Lingo,,Lindo,,...l 工程计算工程计算软件:软件:Ansys,,Fluent,,Phoenics,,... l 其它:其它:几何画板,几何画板,MathLab,, ...l 数学相关软件数学相关软件17Matlab 介绍介绍l 在欧美各高等院校,在欧美各高等院校,Matlab 是线性代数、数值分析、数理统是线性代数、数值分析、数理统计、自动控制、数字信号处理、动态系统仿真、图像处理等课计、自动控制、数字信号处理、动态系统仿真、图像处理等课程的基本教学工具,已成为程的基本教学工具,已成为大学生必须掌握的基本技能之一。
大学生必须掌握的基本技能之一l Matlab是一种广泛应用于是一种广泛应用于工程计算工程计算及及数值分析数值分析领域的新型高级语言,自领域的新型高级语言,自 1984 年推向市场以来,经过多年的发展与竞年推向市场以来,经过多年的发展与竞争,现已成为国际公认的最优秀的工程争,现已成为国际公认的最优秀的工程应用开发环境应用开发环境Matrix Laboratory 矩阵实验室矩阵实验室Matlab18Matlab 的发展的发展l Matlab 的发展的发展l 1980年,年,Moler 教授用教授用 Fortran 语言编写了集语言编写了集命令翻译命令翻译、、 科学计算科学计算于一身的一套交互式软件系统于一身的一套交互式软件系统l 1984年,年,Moler 等成立了等成立了 The MathWorks 的公司,用的公司,用 C 语言语言完全改写完全改写 Matlab,,并推出第一个商业版并推出第一个商业版l 到九十年代,在国际上到九十年代,在国际上 30 几个数学类科技应用软件中,几个数学类科技应用软件中, Matlab 在数值计算方面独占鳌头在数值计算方面独占鳌头。
l 目前,目前,Matlab 已成为世界顶尖的数学应用软件就影响而言,已成为世界顶尖的数学应用软件就影响而言, 至今仍然没有一个别的计算软件可与至今仍然没有一个别的计算软件可与 Matlab 匹敌19l Matlab 的发行版本的发行版本1984年,年,Matlab 1.0 ((DOS版,版,182K,,20多个函数)多个函数)1992年,年,Matlab 4.0 ((93年推出年推出Windows版,加入版,加入 simulink))1994年,年,Matlab 4.2(得到广泛重视和应用)(得到广泛重视和应用)1999年,年,Matlab 5.3(真正实现(真正实现32位运算)位运算)2002年,年,Matlab 6.5(采用(采用JIT加速器)加速器)2004年,年,Matlab 7.0自自2006年起,年起,Matlab每年更新两次每年更新两次目前最新版为目前最新版为 R2013a ((2013年年3月发布)月发布)Matlab 的发展的发展20Matlab 的功能与特点的功能与特点l Matlab 具有很强的数值计算功能具有很强的数值计算功能l Matlab 以以矩阵矩阵作为数据操作的基本单位,作为数据操作的基本单位, 但无需预先指定矩阵维数(但无需预先指定矩阵维数(动态定维动态定维))l 按照按照 IEEE 的数值计算标准进行计算的数值计算标准进行计算l 提供十分丰富的数值计算函数,方便计算,提高效率提供十分丰富的数值计算函数,方便计算,提高效率l Matlab 命令命令与数学中的符号、公式非常接近与数学中的符号、公式非常接近,, 可读性强,容易掌握可读性强,容易掌握l Matlab 是一个交互式软件系统是一个交互式软件系统l 输入一条命令,立即就可以得到该命令的运行结果输入一条命令,立即就可以得到该命令的运行结果21Matlab 的特点与功能的特点与功能l Matlab 的符号计算功能的符号计算功能Matlab 可以进行一些常见的符号计算可以进行一些常见的符号计算l Matlab 的编程功能的编程功能Matlab具有程序结构控制、函数调用、数据结构、输入输具有程序结构控制、函数调用、数据结构、输入输出、面向对象等程序语言特征,且出、面向对象等程序语言特征,且简单易学、编程效率高简单易学、编程效率高l Matlab 的绘图功能的绘图功能Matlab提供丰富的绘图命令,提供丰富的绘图命令,很方便实现数据的可视化很方便实现数据的可视化22l Matlab 丰富的工具箱(丰富的工具箱(toolbox))Matlab 的特点与功能的特点与功能根据专门领域中的特殊需要而设计的各种可选工具箱根据专门领域中的特殊需要而设计的各种可选工具箱l Matlab 的的 Simulink 动态仿真集成环境动态仿真集成环境提供建立系统模型、选择仿真参数和数值算法、启动仿提供建立系统模型、选择仿真参数和数值算法、启动仿真程序对该系统进行仿真、设置不同的输出方式来观察真程序对该系统进行仿真、设置不同的输出方式来观察仿真结果等功能仿真结果等功能Symbolic Math PDEOptimizationSignal processImage ProcessStatisticsControl SystemSystem Identification … …23l 获取获取 Matlab 软件软件Matlab 的安装的安装l 插入光盘,自动运行;插入光盘,自动运行; 或点击安装程序或点击安装程序 setup.exe24Matlab 的基本用法的基本用法l Matlab 的启动的启动l 使用使用 Windows “开始开始” 菜单菜单l 运行运行 Matlab 系统启动程序系统启动程序 matlabl 双击双击 Matlab 快捷图标快捷图标l Matlab 的退出的退出l 在在 Matlab 主窗口主窗口 File 菜单中选择菜单中选择 Exit Matlabl 在在 Matlab 命令窗口输入命令窗口输入 exit 或或 quitl 单击单击 Matlab 主窗口的主窗口的“关闭关闭”按钮按钮25Matlab 的工作界面的工作界面当前工作当前工作空间空间当前目录当前目录中的文件中的文件命令窗口命令窗口命令命令历史记录历史记录命令行提示符命令行提示符当前当前目录目录直观认识直观认识Matlab---基本数学运算基本数学运算在在MATLAB下进行基本数学运算,只需将运算式直接打在提示下进行基本数学运算,只需将运算式直接打在提示号号 >> 后面,并按后面,并按Enter键。
键MATLAB将计算将计算 的结果以的结果以ans显示例】求【例】求 的算术运算结果的算术运算结果1)用键盘在)用键盘在MATLAB指令窗中输入以下内容指令窗中输入以下内容>> (12+2*(7-4))/3^2 ((2)在上述表达式输入完成后,按【)在上述表达式输入完成后,按【Enter】键,该就指令被执行键,该就指令被执行3)在指令执行后,)在指令执行后,MATLAB指令窗中将显示以下结果指令窗中将显示以下结果ans = 2 我们也可给运算式的结果设定一个变量我们也可给运算式的结果设定一个变量x:: x = (5*2+1.3-0.8)*10^2/25 x = 42 变量变量x的值可以在下个语句中调用:的值可以在下个语句中调用: y= 2*x+1y = 85 MATLAB提供基本的算术运算有:提供基本的算术运算有: 加加 (+)、减、减 (-)、乘、乘 (*)、除、除 (/)、幂次方、幂次方 (^),,范例为:范例为:5+3, 5-3, 5*3, 5/3, 5^3MATLAB书写表达式的规则与“手写算式”差不多相同,但要求所有表达式都是以纯文本形式输入。
如果一个指令过长可以在结尾加上...(代表此行指令与下一行连续), 例如:>> 1*2+3*4+5*6+7*8+9*10+11*12+...13*14+15*16ans =744MATLAB常用数学函数--三角函数和双曲函数名称含义名称含义名称含义sin正弦csc余割atanh反双曲正切cos余弦asec反正割acoth反双曲余切tan正切acsc反余割sech双曲正割cot余切sinh双曲正弦csch双曲余割asin反正弦cosh双曲余弦asech反双曲正割acos反余弦tanh双曲正切acsch反双曲余割atan反正切coth双曲余切atan2四象限反正切acot反余切asinh反双曲正弦sec正割acosh反双曲余弦指数函数名称含义名称含义名称含义expE为底的指数log1010为底的对数pow22的幂log自然对数log22为底的对数sqrt平方根 复数函数名称含义名称含义名称含义abs绝对值conj复数共轭real复数实部angle相角imag复数虚部 其他函数名称含义名称含义min最小值max最大值mean平均值median中位数std标准差diff相邻元素的差sort排序length个数norm欧氏(Euclidean)长度sum总和prod总乘积dot内积cumsum累计元素总和cumprod累计元素总乘积cross外积31l Matlab 变量的命名规则变量的命名规则一一.Matlab 变量变量l 以以字母开头字母开头 l 后面可以跟后面可以跟 字母字母、、数字数字 和和 下划线下划线l 长度一般不要超过长度一般不要超过 63 个字符个字符l 字母区分字母区分 大小大小 写写l Matlab 语句的通常形式语句的通常形式变量变量 = 表达式表达式l 表达式是用运算符将有关运算量连接起来的式子表达式是用运算符将有关运算量连接起来的式子l 计算表达式的结果,并赋给赋值号计算表达式的结果,并赋给赋值号“=”左边的变量左边的变量Matlab 命令的执行:命令的执行:回车回车q 输出格式Matlab 的输出的输出u Matlab 以双精度执行所有的运算,运算结果可以在屏幕上输出,同时赋给指定变量;若无指定变量,则系统会自动将结果赋给变量 “ans” u Matlab 中数的输出格式可以通过 format 命令指定format 只改变变量的输出格式,但不会影响变量的值!各种各种 format 格式格式格式格式解释解释例例format短格式(缺省显示格式),同短格式(缺省显示格式),同short3.1416format short短格式(缺省显示格式),只显示短格式(缺省显示格式),只显示5位位3.1416format long长格式,双精度数长格式,双精度数15位,单精度数位,单精度数7位位3.14159265358979format short e短格式短格式e方式(科学计数格式方式(科学计数格式))3.1416e+000format long e长格式长格式e方式方式3.141592653589793e+000format short g短格式短格式g方式方式3.1416format long g长格式长格式g方式方式3.14159265358979format compact压缩格式压缩格式format loose自由格式自由格式format + / format bank / format rat / format hex (详情查看联机帮助详情查看联机帮助)变量的存储变量的存储q 存储当前工作空间中的变量u save 将所有变量存入文件 matlab.matu save mydata 将所有变量存入指定文件 mydata.matq 存储指定的变量u save mydata.mat 将所有变量存入文件 mydata.matsave 文件名 变量名列表例:>> save mydata A x z 变量名列表中各变量之间用空格分隔变量的读取变量的读取q 将数据文件中的变量载入当前工作空间u load mydata 载入数据文件中的所有变量u load mydata A x 从数据文件中提取指定变量q 清除当前工作空间中的变量u clear 清除当前工作空间中的所有变量u clear A x 清除指定的变量36l 查看已定义的变量:查看已定义的变量:who、、whos变量的查看变量的查看l 清除变量:清除变量:clearwho显示当前工作空间中的所有变量显示当前工作空间中的所有变量whos显示所有变量的详细属性显示所有变量的详细属性clear清除工作空间中的所有变量清除工作空间中的所有变量clear all清除所有变量,包括全局变量、函数链接等清除所有变量,包括全局变量、函数链接等clear 变量名变量名 清除指定的变量清除指定的变量37l 特殊变量特殊变量 ans注:应尽量避免给系统预定义变量重新赋值!注:应尽量避免给系统预定义变量重新赋值!l 系统预定义的变量系统预定义的变量系统预定义系统预定义变量变量pi圆周率圆周率 ,其值为,其值为 imag(log(-1))inf, Inf无穷大无穷大NaN, nanNot-a-Number,一个不定值,如,一个不定值,如 0/0eps浮点运算相对精度浮点运算相对精度i, j虚部单位虚部单位38Matlab 数值运算数值运算l 默认是双精度实数,默认是双精度实数,可用浮点数或科学计数法表示可用浮点数或科学计数法表示例:例:3, 0.4, 1.603e-12l 浮点运算的浮点运算的相对误差为相对误差为 eps,,大约为大约为 2.2 10-16l 浮点数表示范围为浮点数表示范围为::10-308 ~~ 10308l 复数的输入复数的输入例:例:z=3+4i (4 与与 i 之间不能有空格之间不能有空格)l Matlab 中的数与算术表达式中的数与算术表达式注:复数作为矩阵元素输入时,加号两边不要加空格注:复数作为矩阵元素输入时,加号两边不要加空格! !39l 命令分隔符命令分隔符l 算术运算算术运算 Matlab 数值运算数值运算+ - * ^加,减,乘,幂加,减,乘,幂/ \右除,左除右除,左除l 一行可以写多个语句,语句间用一行可以写多个语句,语句间用逗号或分号逗号或分号隔开隔开l 若不想在屏幕上输出结果,可以在语句最后加分号若不想在屏幕上输出结果,可以在语句最后加分号 l 如果语句很长,可用如果语句很长,可用续行符续行符 “…”(三个点)续行(三个点)续行 续行符的前面最好留一个空格续行符的前面最好留一个空格l 分号的作用分号的作用l 续行符续行符q 分号和续行符的作用分号和续行符的作用Matlab 数值运算数值运算l 若不想在屏幕上输出结果,可以在语句最后加分号 l 如果语句很长,可用续行符 “…”(三个点)续行 续行符的前面最好留一个空格例:41几个小技巧几个小技巧l Matlab 的命令记忆功能:的命令记忆功能:上下箭头键上下箭头键l 命令补全功能:命令补全功能: Tab 键键 l 用用 Esc 键键 删除命令行删除命令行l 命令命令 home、、clc可以先输入命令的前几个字符,再按上下键缩小搜索范围可以先输入命令的前几个字符,再按上下键缩小搜索范围42Matlab帮助系统帮助系统l 如何寻找帮助如何寻找帮助help 显示指定命令的简短使用说明显示指定命令的简短使用说明doc已网页形式显示完整的使用帮助已网页形式显示完整的使用帮助help sizedoc size例例::l 查找命令查找命令lookfor 按指定的关键词查询与之相关的命令按指定的关键词查询与之相关的命令which显示命令或函数所在的目录显示命令或函数所在的目录l 其它相关命令其它相关命令cd、、dir、、more更多更多 Matlab 命令,参见课程主页命令,参见课程主页43l 定义矩阵:直接输入法定义矩阵:直接输入法l 矩阵用方括号矩阵用方括号 “[ ]” 括起括起l 矩阵同一行中的元素之间用矩阵同一行中的元素之间用 空格空格 或或 逗号逗号 分隔分隔l 矩阵行与行之间用矩阵行与行之间用 分号分号 分开,也可以用分开,也可以用 回车回车 代替代替A=[1 2 3; 4 5 6; 7 8 9]二二. .矩阵的输入矩阵的输入l Matlab 的操作对象的操作对象 矩阵矩阵例:例:44l 矩阵元素可以是任何数值表达式矩阵元素可以是任何数值表达式例:例:x=[-1.3, sqrt(3), (1+2+3)*4/5]矩阵元素赋值矩阵元素赋值l 矩阵元素的单独赋值矩阵元素的单独赋值例:例:x(2)=6.8例:例:x(5)=abs(x(6)) ??动态定维功能:动态定维功能:Matlab Matlab 会会会会自动扩展向量的长度,自动扩展向量的长度, 并将没有赋值的部分置零并将没有赋值的部分置零 例:例:x(5)=abs(x(1))45l 大矩阵可以把小矩阵作为其元素大矩阵可以把小矩阵作为其元素矩阵元素赋值矩阵元素赋值例:例: A=[A ; 11 12 13]在原矩阵的下方加一行在原矩阵的下方加一行思考:思考:如何在原矩阵的右边添加一列?如何在原矩阵的右边添加一列?l 空矩阵空矩阵例:例: B=[]46l 单个元素的引用单个元素的引用例:例: x=A(2,3)+A(1,2)矩阵元素的引用矩阵元素的引用x(i) 向量向量 x 中的第中的第 i 个元素个元素A(i,j)矩阵矩阵 A 中的第中的第 i 行,第行,第 j 列元素列元素l 多个元素的引用:冒号的特殊用法多个元素的引用:冒号的特殊用法a:b:cl 产生一个由等差序列组成的向量产生一个由等差序列组成的向量l a 是首项,是首项,b 是公差,是公差,c 确定最后一项确定最后一项l 若若 b = 1,,则则 b 和其前面的冒号可以省略和其前面的冒号可以省略例:例:x=1:2:5 y=1:2:6例:例:x=2:1:5 y=2:5例:例:x=3:1:047例:例:y=x(1:3)矩阵元素的引用矩阵元素的引用l 多个元素的引用(续)多个元素的引用(续)x(i:j) 向量向量 x 中的第中的第 i 到第到第 j 个元素个元素A(i:j,m:n)由第由第 i 至至 j 行和第行和第 m 至至 n 列组成的列组成的子矩阵子矩阵例:例:B=A(2:3,1:3) y=A(1,1:3)x(i:end) 向量向量 x 中的第中的第 i 个到最后一个元素个到最后一个元素A(i:end,m:n)A(i:j,m:end)第第 i 行到最后一行与行到最后一行与 m 至至 n 列(子矩阵)列(子矩阵)第第 m 列到最后一列与列到最后一列与 i 至至 j 行(子矩阵)行(子矩阵)48矩阵元素的引用矩阵元素的引用l 多个元素的引用(续)多个元素的引用(续)A(:,k) 矩阵的第矩阵的第 k 列列A(i,:)矩阵的第矩阵的第 i 行行A(i:j,:)矩阵的第矩阵的第 i 行到第行到第 j 行行A(:,m:n)矩阵的第矩阵的第 m 行到第行到第 n 列列A(:,:)整个矩阵整个矩阵x(:)取向量的所有元素,并按取向量的所有元素,并按列向量列向量方式输出方式输出A(:)将矩阵的所有元素将矩阵的所有元素按列按列排成一个排成一个列向量列向量49矩阵元素的引用矩阵元素的引用l 多个元素的引用:不连续元素的选取多个元素的引用:不连续元素的选取A([i1, i2, ..., ip],[j1, j2, .., jq]) 矩阵第矩阵第 i1, i2, ..., ip 行和第行和第 j1, j2, .., jq 列组成的子矩阵列组成的子矩阵例:例:A([1,3,4], [2,3])例:例:A([1,4,3], [2,3])l 删除指定的行或列删除指定的行或列A(i,:)=[] 删除第删除第 i 行行A(:,j)=[]删除第删除第 j 列列50特殊矩阵特殊矩阵l Matlab 提供了一些函数,用于生成一些常见的特殊矩阵提供了一些函数,用于生成一些常见的特殊矩阵例例::A=magic(3)B=ones(4)l 特殊矩阵的生成特殊矩阵的生成A=magic(5)a1=diag(A)a2=diag(A,1)a3=diag(A,-2)a=[1,2,3,4]A1=diag(a)A2=diag(a,1)A3=diag(a,-2)注意注意 diag 的用法的用法51常见矩阵生成函数常见矩阵生成函数zeros(m,n)zeros(n)生成一个生成一个 m 行行 n 列的零矩阵列的零矩阵m=n 时可简写为时可简写为 zeros(n)ones(m,n)ones(n)生成一个生成一个 m 行行 n 列的元素全为列的元素全为 1 的矩阵的矩阵 m=n 时可简写为时可简写为 ones(n)eye(m,n)eye(n)生成一个主对角线全为生成一个主对角线全为 1 的的 m 行行 n 列矩阵列矩阵m=n 时可简写为时可简写为 eye(n),,即为即为 n 维单位矩阵维单位矩阵diag(X)diag(X,k)若若 X 是矩阵,则是矩阵,则 diag(X) 为为 X 的主对角线向量的主对角线向量若若 X 是向量,是向量,diag(X) 产生以产生以 X 为主对角线的对角矩阵为主对角线的对角矩阵tril(A)提取一个矩阵的下三角部分提取一个矩阵的下三角部分triu(A)提取一个矩阵的上三角部分提取一个矩阵的上三角部分rand(m,n)rand(n)产生产生 0~~1 间均匀分布的随机矩阵间均匀分布的随机矩阵 m=n 时简写为时简写为 rand(n)randn(m,n)randn(n)产生均值为产生均值为0,方差为,方差为1的标准正态分布随机矩阵的标准正态分布随机矩阵m=n 时简写为时简写为 randn(n)其它特殊矩阵生成函数:其它特殊矩阵生成函数:magic、、hilb、、pascal 等等52矩阵基本运算矩阵基本运算l 矩阵的加减矩阵的加减::对应分量进行运算对应分量进行运算l 矩阵的普通乘法矩阵的普通乘法参与加减运算的矩阵具有参与加减运算的矩阵具有 相同的维数!相同的维数!A=[1,2; 3,4]; B=[5,6; 7,8]C=A+B D=B-A例例::参与运算的矩阵须满足线性代数中矩阵相乘的原则!参与运算的矩阵须满足线性代数中矩阵相乘的原则!A=[1,2,3; 4,5,6]; B= [2,1; 4,3]C=B*A例例::53矩阵基本运算矩阵基本运算l 矩阵的除法:矩阵的除法:若若 A 可逆方阵,则可逆方阵,则A\B <==> A 的逆左乘的逆左乘 B <==> inv(A)*BB/A <==> A 的逆右乘的逆右乘 B <==> B*inv(A)l 矩阵的幂:矩阵的幂:若若 A 是方阵,是方阵,p 是正整数,则是正整数,则A^p ==> A 的的 p 次幂,即次幂,即 p 个个 A 相乘相乘 右除右除左除左除l 矩阵的转置与共轭转置矩阵的转置与共轭转置A'共轭转置共轭转置A.'普通转置,不取共轭,普通转置,不取共轭,点与单引号之间不能有空格点与单引号之间不能有空格A = [1, 2-3i; 3, 1+4i]B = A'C = A.'例例::54翻转与旋转翻转与旋转l 矩阵的翻转与旋转矩阵的翻转与旋转例例::注意矩阵旋转与转置的区别注意矩阵旋转与转置的区别!!fliplr(A)左右左右翻转翻转flipud(A)上下翻转上下翻转rot90(A)rot90(A,k)逆时针旋转逆时针旋转 90 度度逆时针旋转逆时针旋转 k×90 度度A = [1 2 3;4 5 6]B = fliplr(A)C = flipud(A)D = rot90(A)E = rot90(A,-1)55改变矩阵的形状改变矩阵的形状l 改变矩阵的形状:改变矩阵的形状:reshape(A,m,n)将矩阵元素按将矩阵元素按 列方向列方向 进行重新排列成一个进行重新排列成一个 m×n 的新矩阵的新矩阵新矩阵的元素个数必须与原矩阵元素个数相等!新矩阵的元素个数必须与原矩阵元素个数相等!A=[1,2,3; 4,5,6; 7,8,9; 10,11,12]B=reshape(A,4,3)例例::C=reshape(A,2,6)C=reshape(A,5,2)×56查看矩阵的大小查看矩阵的大小l 查看矩阵的大小:查看矩阵的大小:size、、lengthsize(A)返回矩阵返回矩阵 A 的行数和列数的行数和列数size(A,1)返回矩阵返回矩阵 A 的行数的行数size(A,2)返回矩阵返回矩阵 A 的列数的列数length(x)length(X)若若 x 是向量,则返回是向量,则返回 x 的长度的长度若若 X 是矩阵,则返回行数和列数中大的一个是矩阵,则返回行数和列数中大的一个numel(A)返回返回 A 的的元素的个数元素的个数A=[1,2,3; 4,5,6]size(A)size(A,1)size(A,2)length(A), numel(A)x=1:5; length(x)例例::57 Matlab应用(一)应用(一)—— 矩阵运算矩阵运算58本讲主要内容本讲主要内容n数组运算数组运算n 函数的使用函数的使用n 变量的输入输出变量的输入输出 59矩阵的数组运算矩阵的数组运算l 数组运算:数组运算:对应元素进行运算对应元素进行运算l 数组运算包括:数组运算包括:点乘、点除、点幂点乘、点除、点幂l 相应的四个数组运算符为:相应的四个数组运算符为: .* ./ .\ .^ 点与算术运算符之间不能有空格!点与算术运算符之间不能有空格!参与运算的对象必须具有相同的形状!参与运算的对象必须具有相同的形状!A=[1,2,3; 4,5,6]; B=[3,2,1; 6,5,4];C=A.*B D=A./BE=A.^B例例::60函数取值函数取值设设 x 是变量,是变量, f 是一个函数是一个函数l 当当 x = a 是标量时,是标量时,f(x) = f(a) 也是一个标量也是一个标量l 当当 x = [x1, x2, … , xn ] 是向量时,则是向量时,则 f(x) = [ f(x1), f(x2), … , f(xn)] 是一个与是一个与 x 长度相同的向量长度相同的向量l 函数作用在矩阵上的取值函数作用在矩阵上的取值l 若若 A 是矩阵,则是矩阵,则 f (A) 是一个与是一个与 A 同形状的矩阵同形状的矩阵f 作用在作用在 x 的的每个分量每个分量上上!!x=[0:pi/4:pi]; A=[1,2,3; 4,5,6];y1=sin(x) y2=exp(A)y3=sqrt(A)例例::61矩阵的超越函数矩阵的超越函数l Matlab 提供的矩阵函数提供的矩阵函数::expm、、sqrtm、、logm详情参见联机帮助详情参见联机帮助((help expm / sqrtm / logm ))l 更一般的矩阵函数:更一般的矩阵函数: funmfunm(A, @fun)fun 可以是可以是 exp, log,,cos,,sin,,... ...怎样计算怎样计算 eA ?l 矩阵函数矩阵函数l 将矩阵作为一个整体参与运算将矩阵作为一个整体参与运算62矩阵与数的运算矩阵与数的运算l 加减加减::矩阵的每个元素都与数作加减运算矩阵的每个元素都与数作加减运算l 数乘:数乘:矩阵的每个元素都与数作乘法运算矩阵的每个元素都与数作乘法运算l 矩阵除以一个数:矩阵除以一个数:每个元素都除以这个数每个元素都除以这个数l 数与矩阵的点幂运算数与矩阵的点幂运算:采用数组运算:采用数组运算l 矩阵与数的运算矩阵与数的运算例例::x=[1 2 3]; x.^2=[1^2,2^2,3^2]=[1,4,9]2.^x=[2^1,2^2,2^3]=[2,4,8]Matlab中所有标点符号必须在英文状态下输入中所有标点符号必须在英文状态下输入!63常用数学函数常用数学函数sin(x)、、cos(x)、、tan(x)、、cot(x)、、sec(x)、、csc(x)、、sinh(x)、、cosh(x)、、tanh(x) ...asin(x)、、acos(x)、、atan(x)、、acot(x)、、asec(x)、、acsc(x) ...exp(x) % ex 自然指数自然指数 (以以 e 为底为底)pow2(x) % 2x 以以 2 为底的指数为底的指数 log(x) % ln(x) 自然对数自然对数 (以以 e 为底为底)log2(x) % 以以 2 为底的对数为底的对数log10(x) % 以以 10 为底的对数为底的对数sqrt(x) % 平方根平方根abs(x) % 绝对值绝对值64常用数学函数常用数学函数conj(z) % 复数的共轭复数的共轭 real(z) % 复数的实部复数的实部 imag(z) % 复数的虚部复数的虚部angle(z) % 复数的辐角复数的辐角sign(x) % 符号函数符号函数round(x) % 取整函数取整函数 (四舍五入四舍五入)fix(x)、、floor(x)、、ceil(x) % 另外三个取整函数另外三个取整函数 mod(x,y) % 计算计算 x 除以除以 y 的余数(结果与的余数(结果与 y 同号)同号)rem(x,y) % 计算计算 x 除以除以 y 的余数(结果与的余数(结果与 x 同号)同号)gcd(x,y) % 最大公约数最大公约数lcm(x,y) % 最小公倍数最小公倍数65常用数学函数常用数学函数linspace(a,b,n) % 生成生成 a 到到 b,,n 个数的等差数列个数的等差数列logspace(a,b,n) % 生成生成 10a 到到 10b,,n 个数的等比数列个数的等比数列max(x) % 求求 向量向量 x 中的最大值中的最大值min(x) % 求最小值求最小值mean(x) % 求平均值求平均值sum(x) % 求和求和sort(x) % 排序排序det(A) % 矩阵行列式矩阵行列式inv(A) % 矩阵的逆矩阵的逆eig(A) % 矩阵的特征值矩阵的特征值rank(A) % 矩阵的秩矩阵的秩若参数若参数 x 是矩阵,是矩阵,则作用在其各列上则作用在其各列上66l 输出格式输出格式Matlab 的输出格式的输出格式l Matlab 以双精度执行所有的运算,运算结果可以以双精度执行所有的运算,运算结果可以在屏幕在屏幕上输出上输出,同时,同时赋给指定变量赋给指定变量;若无指定变量,则系统会自动;若无指定变量,则系统会自动将结果赋给变量将结果赋给变量 “ans” l 在屏幕上输出运算结果时,可以在屏幕上输出运算结果时,可以通过通过 format 命令指命令指定输出格式定输出格式format 只只改变改变输出格式,不会改变变量的值输出格式,不会改变变量的值!!67各种各种 format格式格式解释解释例例format短格式(缺省格式),同短格式(缺省格式),同 short3.1416format short短格式(缺省格式),小数点后短格式(缺省格式),小数点后 4 位位3.1416format long长格式,双精度长格式,双精度 15位,单精度位,单精度 7位位3.14159265358979format short e短格式短格式e方式(科学计数格式方式(科学计数格式))3.1416e+000format long e长格式长格式e方式方式3.141592653589793e+000format short g短格式短格式g方式方式3.1416format long g长格式长格式g方式方式3.14159265358979format rat分数形式分数形式355/113format compact压缩格式压缩格式format loose自由格式自由格式format +,, format bank,, format hex (详情查看联机帮助详情查看联机帮助)68变量的存储变量的存储l 将将变量变量保存到保存到 mat 文件中文件中save将将所有变量所有变量保存到文件保存到文件 matlab.mat 中中save fnamesave fname.mat 将将所有变量所有变量保存到文件保存到文件 fname.mat 中中save fname 变量变量将将指定变量指定变量保存到文件保存到文件 fname.mat 中中l 可同时保存多个变量,各变量之间用可同时保存多个变量,各变量之间用空格空格隔开隔开例例::x=2:5; A=magic(3); a=2.4;save mydata A x;l 从从 mat 文件中读取文件中读取变量变量load fname读取读取 fname.mat 中的中的所有变量所有变量load fname 变量变量从从 fname.mat 中读取中读取指定的变量指定的变量69Matlab应用(二)应用(二)—— 二维平面作图二维平面作图—— 三维空间作图三维空间作图70本讲主要内容本讲主要内容n 二维平面作图二维平面作图n 三维空间作图三维空间作图n 符号作图符号作图n Matlab 绘图过程绘图过程/原理原理 71手工作图手工作图如何画出如何画出 y==sin(x) 在在 [0, 2 ] 上的图像?上的图像?72Matlab 作图作图l 找点找点:: x = 0, pi/4, pi/3, pi/2, pi, ...l 求值求值:: y = sin(0), sin(pi/4), sin(pi/3), ...l 描点:在坐标系中画出这些离散点描点:在坐标系中画出这些离散点l 连线:用直线或曲线连接这些点,得到函数的大致图形连线:用直线或曲线连接这些点,得到函数的大致图形l 手工作图手工作图l Matlab 作图作图l 找点找点:: x=[0:pi/10:2*pi];l 求值求值:: y=sin(x);l 描点、连线:使用描点、连线:使用 Matlab 提供的绘图函数提供的绘图函数 plotx=0:pi/10:2*pi; y=sin(x);plot(x,y);例例::73二维作图命令二维作图命令l 平面曲线绘图命令:平面曲线绘图命令: plotl 这里这里 x, y 都是向量,长度必须相同都是向量,长度必须相同l 以以 x 的分量为横坐标,的分量为横坐标, y 的分量为纵坐标,作平面曲线的分量为纵坐标,作平面曲线x=0:pi/10:4*pi; y=cos(x);plot(x,y);例例::作作 y = cos(x) 在在 [0, 4 ] 上的图像上的图像plot(x,y)74二维作图命令二维作图命令l 平面曲线绘图命令:平面曲线绘图命令: plotl 绘制绘制向量向量 y 的线性图的线性图 即以下标为横坐标,即以下标为横坐标,y 的分量为纵坐标,等价于:的分量为纵坐标,等价于:y=[0,0.4,0.8,1.0,0.9,6.1];plot(y);例例::plot(y)x=[1:length(y)]; plot(x,y);思考思考::plot(y) 与与 plot(x,y) 有什么区别?有什么区别?75图形的属性图形的属性这里的这里的 str 是用是用 单引号单引号 括起来的字符串,用来指定图形括起来的字符串,用来指定图形的属性的属性::点、线的形状和颜色点、线的形状和颜色l 指定点和线的属性指定点和线的属性plot(x,y,str)x=0:pi/20:2*pi;plot(x,cos(x),'r+:');例例::红色、虚线、红色、虚线、点用加号表示点用加号表示x=0:pi/20:2*pi;plot(x,cos(x),'bo--');蓝色、间断线、蓝色、间断线、点用圆圈表示点用圆圈表示颜色,线型,点标记:可以全部指定,也可颜色,线型,点标记:可以全部指定,也可以部分指定,以部分指定,顺序任意顺序任意76点和线的基本属性点和线的基本属性线型线型点标记点标记颜色颜色- 实线实线: 虚线虚线-. 点划线点划线-- 间断线间断线 空白空白( (不画线不画线) ). 点点o 小圆圈小圆圈x 叉子符叉子符+ 加号加号* 星号星号s 方格方格d 菱形菱形^ 朝上三角朝上三角v 朝下三角朝下三角> 朝右三角朝右三角< 朝左三角朝左三角p 五角星五角星h 六角星六角星y 黄色黄色 m 洋红洋红/magenta c 青色青色/cyanr 红色红色g 绿色绿色b 蓝色蓝色w 白色白色k 黑色黑色help plot77标题和坐标轴标注标题和坐标轴标注title(str)l 添加标题添加标题l 这里的这里的 str 是用是用 单引号单引号 括起来的字符串括起来的字符串l 添加坐标轴标注添加坐标轴标注xlabel(str)ylabel(str)x=0:pi/20:2*pi;plot(x,cos(x));title('y=cos(x) 的图像的图像');xlabel('x 轴轴');ylabel('y 轴轴');例例::78绘制多个函数图像绘制多个函数图像plot(x1,y1, x2,y2, ...)l 另一中实现方法:另一中实现方法:hold onhold onplot(x1,y1,str1)plot(x2,y2,str2)...hold offl 在同一个绘图窗口绘制多个图像在同一个绘图窗口绘制多个图像plot(x1,y1,str1, x2,y2,str2, ...)l 也可以同时指定每条曲线的属性也可以同时指定每条曲线的属性x=0:pi/20:2*pi;y1=sin(x); y2=cos(x);plot(x,y1, x,y2);例例::hold on;plot(x,y1);plot(x,y2);79图例图例legend(str1,str2, ...)l 添加图例添加图例x=0:pi/20:2*pi;y1=sin(x); y2=cos(x);plot(x,y1,'bo-', x,y2,'ks--');legend('sin(x)','cos(x)')例例::l 在任何指定的地方添加文本在任何指定的地方添加文本text(x,y,str)l 将将 str 放到由放到由 (x,y) 坐标指定的地方坐标指定的地方直观方法:可以直接在绘图窗口进行编辑80划分绘图划分绘图窗口窗口subplot(m,n,p)l 将一个绘图窗口分割成将一个绘图窗口分割成 m n 个子区域,并个子区域,并 按行按行 从左至从左至右右 依次编号依次编号 ,,p 表示第表示第 p 个绘图子区域。
个绘图子区域x=-pi:pi/20:pi;subplot(2,2,1); plot(x,sin(x));subplot(2,2,2); plot(x,cos(x));subplot(2,2,3); plot(x,x.^2);subplot(2,2,4); plot(x,exp(x));例例::l 划分绘图窗口划分绘图窗口81其他相关命令其他相关命令l 保留当前绘图窗口中的图像保留当前绘图窗口中的图像hold on / hold offl 新建绘图窗口新建绘图窗口/选取绘图窗口选取绘图窗口figure(n)l 显示网格显示网格grid on / grid offl 关闭绘图窗口关闭绘图窗口close / close all82本讲主要内容本讲主要内容n 二维平面作图二维平面作图n 三维空间作图三维空间作图n 符号作图符号作图n Matlab 绘图过程绘图过程/原理原理l 三维曲线三维曲线l 空间曲面空间曲面83三维曲线三维曲线l 三维曲线绘图命令三维曲线绘图命令 :: plot3设三维曲线的设三维曲线的参数方程参数方程为:为:x=x(t),,y=y(t),,z=z(t),,则其图形可由下面的命令绘出则其图形可由下面的命令绘出::例:例:三维螺旋线三维螺旋线l plot3 只能绘制用参数方程表示的三维曲线只能绘制用参数方程表示的三维曲线 l plot3 的用法与的用法与 plot 类似类似t=0:pi/10:10*pi;x=sin(t); y=cos(t); z=2*t;plot3(x,y,z);plot3(x,y,z)84三维曲面示例三维曲面示例85三维曲面三维曲面l 绘制曲面的网格图绘制曲面的网格图 绘制由矩阵绘制由矩阵 X,Y,Z 所确定的曲面的所确定的曲面的网格图网格图mesh(X,Y,Z)[X,Y]=meshgrid(-3:1/8:3);Z=peaks(X,Y); mesh(X,Y,Z);例:例:86三维曲面绘制过程三维曲面绘制过程l 绘制空间曲面绘制空间曲面 z = z(x,y) 网格图的步骤:网格图的步骤:(1) 对对 x 的取值区域和的取值区域和 y 的取值区域进行分割,的取值区域进行分割, 得到离散的点得到离散的点 (xij, yij),这些离散的点称为,这些离散的点称为网格点网格点(2) 这些这些网格点网格点构成了网格矩阵,即矩阵构成了网格矩阵,即矩阵 X 和和 Y (3) 计算计算 z 在这些网格点上的函数值,即可得矩阵在这些网格点上的函数值,即可得矩阵 Z(4) 调用调用 Matlab 的绘图命令的绘图命令 mesh 绘出曲面图形绘出曲面图形l 怎样得到网格矩阵怎样得到网格矩阵 X 和和 Y ??—— 利用利用 Matlab 的网格生成函数:的网格生成函数: meshgrid87网格生成函数网格生成函数若若 y = x, 则可简写为:则可简写为:[X, Y]=meshgrid(x)[X,Y]=meshgrid(x,y)l x,y 是分别对是分别对 x 取值区域取值区域和和 y 取值区域取值区域进行分割后进行分割后 得到的向量得到的向量l X, Y 即为我们所需要的网格矩阵即为我们所需要的网格矩阵l 网格生成函数网格生成函数 88例:例:绘制墨西哥帽子绘制墨西哥帽子墨西哥帽子墨西哥帽子l a = 8 时的曲面图形时的曲面图形x=-8:0.5:8; y=-8:0.5:8;[X,Y]=meshgrid(x,y);r=sqrt(X.^2+Y.^2)+eps;Z=sin(r)./r;mesh(X,Y,Z);l x 方向与方向与 y 方向可以取不同的步长方向可以取不同的步长l 注意要使用注意要使用数组运算数组运算++eps??89meshc 和和 meshzl 绘制带绘制带等高线等高线的空间曲面:的空间曲面:meshc - 使用方式与使用方式与 mesh 相同,在相同,在 mesh 基础上增加等高线基础上增加等高线l 其它网格曲面绘制其它网格曲面绘制函数函数::meshc、、meshz l 绘制带绘制带屏蔽面屏蔽面的空间曲面:的空间曲面:meshz - 使用方式与使用方式与 mesh 相同,在相同,在 mesh 基础上屏蔽边界面基础上屏蔽边界面meshcmeshz90Mesh 绘图绘图l 显式方程绘图:显式方程绘图:x=a:h1:b; y=c:h2:d; % 区域划分区域划分[X,Y]=meshgrid(x,y); % 生成网格生成网格Z=z(X,Y); % 计算网格上的函数值计算网格上的函数值mesh(X,Y,Z); % 调用绘图命令调用绘图命令l 参数方程绘图:参数方程绘图:u=a:h1:b; v=c:h2:d; % 区域划分区域划分[U,V]=meshgrid(u,v); % 生成网格生成网格X=x(U,V); Y=y(U,V); Z=z(U,V); % 计算函数值计算函数值mesh(X,Y,Z);; % 调用绘图命令调用绘图命令91Mesh 绘图举例绘图举例例:例:绘制马鞍面绘制马鞍面x=-2:0.1:2; y=-3:0.1:3;[X,Y]=meshgrid(x,y);Z=X.^2/4-Y.^2/9;mesh(X,Y,Z);显式方程绘图显式方程绘图92Mesh 绘图举例绘图举例例:例:绘制椭圆抛物面绘制椭圆抛物面t=0:pi/20:2*pi;r=0:0.1:5;[T,R]=meshgrid(t,r);X=3*R.*cos(T);Y=4*R.*sin(T);Z=R.^2;mesh(X,Y,Z);参数方程绘图参数方程绘图93曲面作图其它命令曲面作图其它命令l 空间曲面其它作图命令空间曲面其它作图命令 注:注:mesh 绘制绘制网格图网格图,,surf 绘制着色绘制着色表面表面图图l 绘制绘制带颜色的带颜色的表面表面图图 (surface),参数,参数含义同含义同 mesh注:注:sphere 只能画单位球面!只能画单位球面!surf(X,Y,Z)sphere(n)l 绘制绘制单位球面,单位球面,n 代表网格的多少代表网格的多少94surf 作图举例作图举例[X,Y]=meshgrid(-8:0.5:8);r=sqrt(X.^2+Y.^2)+eps;Z=sin(r)./r;surf(X,Y,Z);surfmesh95如果没有给出如果没有给出 n 的值,的值,则系统默认为则系统默认为 n=20sphere 作图作图sphere;>> sphere(60);>> axis equal;96l 其它调用方式:其它调用方式:坐标轴控制坐标轴控制axis([xmin,xmax, ymin,ymax, zmin,zmax])l 作用:指定坐标轴的显示范围作用:指定坐标轴的显示范围l 坐标轴控制命令坐标轴控制命令axis auto自动,使得图形的坐标满足图中的一切元素自动,使得图形的坐标满足图中的一切元素axis equal 各坐标轴采用各坐标轴采用等长刻度等长刻度axis square 使绘图区域为使绘图区域为正方形正方形axis manual 以当前的坐标限制图形的绘制(多图时)以当前的坐标限制图形的绘制(多图时)... ...更多用法参见联机帮助:更多用法参见联机帮助:help axisaxis on/off % 显示显示/ /不显示坐标轴不显示坐标轴97l s 为字符串,表示所采用的色系,常用的值有为字符串,表示所采用的色系,常用的值有颜色映象颜色映象相应的颜色系相应的颜色系autumn红黄色系红黄色系gray线性灰色系线性灰色系cool青和洋红色系青和洋红色系pink柔和色系柔和色系... ...更多参见联机帮助更多参见联机帮助: help colormap图像的着色方案图像的着色方案colormap(s)l 图形图形的着色方案的着色方案98绘图小结绘图小结l 平面曲线绘图:平面曲线绘图:X=a:h:b;(1) 绘图区域划分绘图区域划分y=f(x); % (2) 计算分割点上的函数值计算分割点上的函数值plot(x,y); (3) 调用调用 Matlab 绘图命令绘图命令99绘图小结绘图小结l 三维曲面绘图:三维曲面绘图:x=a:h1:b; y=c:h2:d;(1) 绘图区域划分绘图区域划分[X,Y]=meshgrid(x,y); (2) 生成网格生成网格Z=z(X,Y); % 数组运算数组运算(3) 计算在网格点上的函数值计算在网格点上的函数值mesh(X,Y,Z); (4) 调用调用 Matlab 绘图命令绘图命令100绘图小结绘图小结l 三维曲面参数方程绘图:三维曲面参数方程绘图:u=a:h1:b; v=c:h2:d;(1) 绘图区域划分绘图区域划分[U,V]=meshgrid(u,v); (2) 生成网格生成网格X=x(U,V); Y=y(U,V); Z=z(U,V); % 数组运算数组运算(3) 计算在网格点上的函数值计算在网格点上的函数值mesh(X,Y,Z); (4) 调用调用 Matlab 绘图命令绘图命令101本讲主要内容本讲主要内容n 二维平面作图二维平面作图n 三维空间作图三维空间作图n 符号作图符号作图n Matlab 绘图过程绘图过程/原理原理102二维曲线二维曲线 ezplotl 二维曲线符号绘图函数二维曲线符号绘图函数ezplot(f(x),[a,b])绘制绘制 y = f (x) 在区域在区域 a x b 上的图形上的图形ezplot(f(x,y),[a,b,c,d])绘制绘制 f (x, y) = 0 在区域在区域 a x b, c y d 上的图形上的图形ezplot(x(t),y(t),[a,b])绘制绘制 x = x(t), y = y(t) 在区域在区域 a t b 上的图形上的图形103二维曲线二维曲线 ezplotezplot(f(x))绘制绘制 y = f (x) 在区域在区域 -2 x 2 上的图形上的图形ezplot(f(x,y))绘制绘制 f (x, y) = 0 在区域在区域 -2 x, y 2 上的图形上的图形ezplot(x(t),y(t))绘制绘制 x = x(t), y = y(t) 在区域在区域 0 t 2 上的图形上的图形缺省的绘图区间为缺省的绘图区间为 [-2 , 2 ]缺省的绘图区间为缺省的绘图区间为 [-2 , 2 ]缺省的绘图区间为缺省的绘图区间为 [0, 2 ]104ezplot 作图作图ezplot('sin(x)');ezplot('sin(x)',[-pi,pi]);符号作图时要注意使用符号作图时要注意使用 单引号单引号!!105Matlab 符号作图符号作图l 空间曲线符号作图空间曲线符号作图ezplot3(x(t),y(t),z(t),[a,b])l 绘制空间曲线:绘制空间曲线:x = x (t) , y = y (t) , z = z (t) , a t bezplot3(x(t),y(t),z(t))l 绘制空间曲线:绘制空间曲线:x = x (t) , y = y (t) , z = z (t) , 0 t 2 缺省的绘图区间为缺省的绘图区间为 [0, 2 ]ezplot3('2*t','sin(t)','cos(t)',[0,20])例:例:106Matlab 符号作图符号作图l 空间曲面符号绘图函数:空间曲面符号绘图函数: ezmesh、、ezsurf ezmesh(z(x,y),[a,b,c,d]) ezmesh(z(x,y),[a,b]) ezmesh(z(x,y))ezsurf 的用法的用法与与 ezmesh 相同相同107Matlab 符号作图符号作图l 空间曲面符号绘图函数:空间曲面符号绘图函数: ezmesh、、ezsurf ezmesh(x(s,t),y(s,t),z(s,t),[a,b,c,d]) ezmesh(x(s,t),y(s,t),z(s,t),[a,b]) ezmesh(x(s,t),y(s,t),z(s,t))108本讲主要内容本讲主要内容n 二维平面作图二维平面作图n 三维空间作图三维空间作图n 符号作图符号作图n Matlab 绘图过程绘图过程/原理原理109曲线作图过程曲线作图过程l 基本原理:点基本原理:点 线,即线,即先画点,后连线先画点,后连线二、连线二、连线x=0:pi/5:2*pi;plot(x,sin(x),'r.-')例:例:一、画点一、画点x=0:pi/5:2*pi;plot(x,sin(x),'.')三、加密三、加密x=0:pi/20:2*pi;plot(x,sin(x),'r.-')110线线: 分别沿分别沿 x 方向和方向和 y 方向方向 连接这些点即可得到连接这些点即可得到三维曲面作图三维曲面作图先画点,后连线,构成曲面网格图先画点,后连线,构成曲面网格图点点: :111 Matlab应用(三)应用(三)—— Matlab 符号运算符号运算112主要内容主要内容n Matlab 符号运算介绍符号运算介绍n 符号对象与基本符号运算符号对象与基本符号运算n symvar、、 subs 和和 vpan 常见的符号计算常见的符号计算113符号运算符号运算l 计算以计算以推理方式推理方式进行,不受计算误差累积所带来的困扰进行,不受计算误差累积所带来的困扰 l 符号计算指令的调用比较简单,与教科书上的公式相近符号计算指令的调用比较简单,与教科书上的公式相近 l 符号计算可以给出完全正确的封闭解,或任意精度的数符号计算可以给出完全正确的封闭解,或任意精度的数值解(封闭解不存在时值解(封闭解不存在时 ))l 符号计算所需的符号计算所需的运行时间相对较长运行时间相对较长l 符号运算的特点符号运算的特点 114Matlab 符号运算符号运算l Matlab 符号运算是通过符号运算是通过符号数学工具箱符号数学工具箱((Symbolic Math Toolbox))来实现的。
来实现的 l Matlab 的符号数学工具箱可以完成几乎所有得符号运算的符号数学工具箱可以完成几乎所有得符号运算功能,如:功能,如:符号表达式的运算符号表达式的运算,,符号矩阵的运算符号矩阵的运算,,符号微符号微积分积分,,符号作图符号作图,,符号代数方程求解符号代数方程求解,,符号微分方程求解符号微分方程求解等l 此外,该工具箱还支持此外,该工具箱还支持可变精度运算可变精度运算,即支持以指定的,即支持以指定的精度返回结果精度返回结果 l Matlab 符号运算符号运算 115符号运算举例符号运算举例l 求一元二次方程求一元二次方程 ax2 + bx + c = 0 的根的根 solve('a*x^2+b*x+c=0')l 求的根求的根 f (x) = (cos x)2 的一次导数的一次导数x=sym('x');diff(cos(x)^2)l 计算计算 f (x) = x2 在区间在区间 [a, b] 上的定积分上的定积分syms a b x;int(x^2,a,b)116内容提要内容提要n Matlab 符号运算介绍符号运算介绍n 符号对象与基本符号运算符号对象与基本符号运算n symvar、、 subs 和和 vpan 常见的符号计算常见的符号计算117l 在进行符号运算时,必须先定义基本的在进行符号运算时,必须先定义基本的符号对象符号对象,可以是,可以是 符号变量符号变量、、符号表达式符号表达式等等 l 符号对象是一种数据结构符号对象是一种数据结构 符号对象符号对象l 符号表达式符号表达式::含有符号对象的表达式含有符号对象的表达式l 符号矩阵符号矩阵/数组数组:元素为符号表达式的矩阵:元素为符号表达式的矩阵/数组数组 l Matlab 符号对象符号对象 118l sym 用来建立用来建立单个单个符号对象,一般调用格式为:符号对象,一般调用格式为:l 符号对象的符号对象的定义定义/声明声明::sym、、syms符号对象符号对象的建立的建立例:例:a=sym('a') 符号变量符号变量 = sym(x)参数参数 x 可以是一个数或数值矩阵,也可以是字符串可以是一个数或数值矩阵,也可以是字符串a 是符号变量是符号变量b 是符号常量是符号常量b=sym('1/3')C 是符号矩阵是符号矩阵C=sym('[1 ab; c d]')119符号对象符号对象的建立的建立syms 符号变量符号变量1 符号变量符号变量2 ... 符号变量符号变量n 例:例:syms a b c;a=sym('a');b=sym('b');c=sym('c');l syms 用来声明用来声明多个多个符号变量,一般调用格式为:符号变量,一般调用格式为:l 符号对象的符号对象的定义定义/声明声明::sym、、syms120例:例:l 建立符号表达式通常有以下建立符号表达式通常有以下 2 种方法:种方法: (1) 用用 sym 函数直接建立符号表达式函数直接建立符号表达式 (2) 使用已经定义的符号变量组成符号表达式使用已经定义的符号变量组成符号表达式 y=sym('sin(x)+cos(x)')x=sym('x');y=sin(x)+cos(x)符号符号表达式表达式syms x;y=sin(x)+cos(x)l 符号表达式:符号表达式:含符号对象的表达式含符号对象的表达式121Matlab 符号运算采用的运算符和基本函数,在形状、名称符号运算采用的运算符和基本函数,在形状、名称和使用上,都与数值计算中的运算符和基本函数完全相同和使用上,都与数值计算中的运算符和基本函数完全相同基本符号基本符号运算运算l 普通运算:普通运算:l 数组运算:数组运算:l 矩阵转置:矩阵转置:l 基本运算基本运算l 基本数学函数基本数学函数三角函数与反三角函数、三角函数与反三角函数、指数函数、对数函数等指数函数、对数函数等sin,cos,asin,acos,exp,log,abs,diag,tril,triu, ...+ - * \ / ^.* .\ ./ .^' .'122符号符号矩阵矩阵A=sym('[1+x, sin(x); 5, exp(x)]')l 使用使用 sym 函数直接生成函数直接生成l 将数值矩阵转化成符号矩阵将数值矩阵转化成符号矩阵l 符号矩阵中元素的引用和修改符号矩阵中元素的引用和修改B=[2/3, sqrt(2); 5.2, log(3)]; C=sym(B)A=sym('[1+x, sin(x); 5, exp(x)]');A(1,2) % % 引用引用A(2,2)=sym('cos(x)') % % 重新赋值重新赋值l 符号矩阵符号矩阵的生成的生成123内容提要内容提要n Matlab 符号运算介绍符号运算介绍n 符号对象与基本符号运算符号对象与基本符号运算n symvar、、 subs 和和 vpan 常见的符号计算常见的符号计算124symvarsymvar(s)symvar(s, N)l 列出符号表达式中的符号变量列出符号表达式中的符号变量l 按字母顺序列出按字母顺序列出符号表达式符号表达式 s 中的所有符号变量中的所有符号变量l 列出列出符号表达式符号表达式 s 中离中离 x 最近的最近的 N 个符号变量个符号变量l 若有两个符号变量与若有两个符号变量与 x 的距离相等,则的距离相等,则ASCII 码大者优先码大者优先l 常量常量 pi, i, j 不作为符号变量不作为符号变量f=sym('2*v-3*y+z^2+5*a')symvar(f)symvar(f,2)例:例:125subsl 用用 a 替换替换符号表达式符号表达式 s 中的符号变量中的符号变量 xl 这里这里 a 可以是可以是 数数/变量变量/表达式表达式 或或 符号变量符号变量/表达式表达式l 符号替换符号替换l 用给定的用给定的数据数据替换符号表达式中的替换符号表达式中的指定的符号变量指定的符号变量subs(s,x,a)syms x y u v;f1=2*x+y-1;f2=subs(f1,x,u)f3=subs(f1,y,2+3)f3=subs(f1,{x,y},{u,v}) 例:例:126subs 举例举例f=sym('2*u');f1=subs(f,'u',2)f2=subs(f,'u','u+2')f3=subs(f,'u',[1,2])a=3; f4=subs(f2,'u',a+2)f5=subs(f2,'u','a+2')syms x y;f6=subs(f,'u',x+y)f7=subs(f6,{x,y},{1,2})f8=subs(f6,{x,y},{x+y,x+y})例:例:指出下面各条语句的输出结果指出下面各条语句的输出结果符号变量若没有声明,则需要加上单引号!符号变量若没有声明,则需要加上单引号!f=2*uf1=4f2=2*u+4f3=[2,4]f4=14f5=2*a+8f6=2*x+2*yf7=6f8=4*x+4*y127vpal 计算表达式计算表达式 s 的值,保留的值,保留 n 位有效数字位有效数字l 返回值是符号对象返回值是符号对象l 可变精度可变精度vpa(s,n)x1=vpa(sin(pi/2),10)x2=vpa(pi^3,3)x3=vpa(pi,100) 例:例:128内容提要内容提要n Matlab 符号运算介绍符号运算介绍n 符号对象与基本符号运算符号对象与基本符号运算n symvar、、 subs 和和 vpan 常见的符号计算常见的符号计算l 因式分解、展开、合并、简化及通分等因式分解、展开、合并、简化及通分等l 计算极限计算极限l 计算导数计算导数l 计算积分计算积分l 符号符号级数级数求和求和l 代数方程和微分方程代数方程和微分方程的的求解求解129因式分解因式分解factor(f)syms x; f=x^6+1; factor(f)l factor 也可用于正整数的分解也可用于正整数的分解s=factor(100)factor(12345678901234567890) % ERRORfactor(sym('12345678901234567890'))对大整数进行因式分解时可以先将其转化成符号常量对大整数进行因式分解时可以先将其转化成符号常量例:例:例:例:l 因式分解因式分解130函数展开函数展开expand(f)syms x; f=(x+1)^6;expand(f)l 多项式展开多项式展开l 三角函数展开三角函数展开syms x y; f=sin(x+y);expand(f)l 函数展开函数展开例:例:例:例:131合并同类项合并同类项syms x y; f=x^2*y+y*x+y^2+2*x ;collect(f)collect(f,y)例:例:collect(f,v) % 按指定变量按指定变量 v v 进行进行合并合并collect(f) % 按按默认默认变量变量进行进行合并合并l 合并同类项合并同类项l 默认变量默认变量::symvar(f,1) 的返回结果的返回结果syms u v; g=u^2*v+u*v^3-u^2+v;collect(g)132函数简化函数简化y=simplify(f)l 函数简化函数简化l 对对符号符号表达式表达式 f 进行简化进行简化syms x; f=sin(x)^2 + cos(x)^2;y=simplify(f)例:例:133函数简化函数简化y=simple(f)l 函数简化函数简化l 对对 f 尝试多种不同的尝试多种不同的方法(包括方法(包括 simplify)进行简化)进行简化,, 以寻求其以寻求其最简短形式最简短形式例:例:化简化简syms x; f=(cos(x)^2-sin(x)^2)*sin(2*x)*(exp(2*x) ... -2*exp(x)+1)/(exp(2*x)-1);y1=simplify(f)y2=simple(f)134函数简化函数简化[N,D]=numden(f)l 通分通分l N 为通分后的分子,为通分后的分子,D 为通分后的分母为通分后的分母syms x y; f=x/y+y/x;[N,D]=numden(f )[n,d]=numden(sym(112/1024))例:例:135horner 多项式多项式l horner 多项式:嵌套形式的多项式多项式:嵌套形式的多项式syms x; f=x^4+2*x^3+4*x^2+x+1;g=horner(f)例:例:136计算极限计算极限limit(f,x,a) % 计算计算limit(f,a) % 当当默认变量默认变量趋向于趋向于 a 时的极限时的极限limit(f) % 计算计算 a=0 时的极限时的极限limit(f,x,a,'right') % 计算右极限计算右极限limit(f,x,a,'left') % 计算左极限计算左极限例:例:计算计算 ,,syms x h n; L=limit((log(x+h)-log(x))/h,h,0)M=limit((1-x/n)^n,n,inf)l 计算极限计算极限137计算计算导数导数g=diff(f,v) % 求符号表达式求符号表达式 f 关于变量关于变量 v 的导数的导数g=diff(f) % 计算关于计算关于默认变量默认变量的导数的导数g=diff(f,v,n) % 求求 f 关于关于 v 的的 n 阶导数阶导数l 计算导数计算导数syms x;f=sin(x)+3*x^2; g1=diff(f,x)g2=diff(f,x,3)例:例:138计算计算积分积分int(f,v,a,b) % 计算定积分计算定积分int(f,a,b) % 计算关于计算关于默认变量默认变量的定积分的定积分int(f,v) % 计算不定积分计算不定积分int(f) % 计算关于计算关于默认变量默认变量的不定积分的不定积分syms x; f=(x^2+1)/(x^2-2*x+2)^2;I=int(f,x)K=int(exp(-x^2),x,0,inf)例:例:计算计算 和和l 计算积分计算积分139符号符号级数求和级数求和syms n; f=1/n^2;S=symsum(f,n,1,inf)S100=symsum(f,n,1,100)symsum(f,v,a,b) % 级数求和级数求和symsum(f,a,b) % 关于关于默认变量默认变量求和求和例:例:计算级数计算级数 及其前及其前100项的部分和项的部分和 S100例:例:计算函数级数计算函数级数syms n x; f=x/n^2; S=symsum(f,n,1,inf)l 符号级数求和符号级数求和140代数方程代数方程求解求解solve(f,v) % 求方程关于指定自变量的解求方程关于指定自变量的解l 代数方程求解代数方程求解l 这里这里 f 可以可以用字符串表示用字符串表示或或符号表达式符号表达式l solve 也可解方程组(通常是非线性的)也可解方程组(通常是非线性的)l 得不到解析解时,给出数值解得不到解析解时,给出数值解例:例:solve('2*x-3') % 或或 solve('2*x-3=0')syms x; solve(2*x-3) % 不能写成不能写成 solve(2*x-3=0)syms x; solve(2*x-sin(x)+1)141微分方程微分方程求解求解l 常微分方程求解常微分方程求解y=dsolve(eq1,eq2,...,cond1,cond2,... ,'v')l 这里这里 eq1、、eq2、、. . . 为微分方程为微分方程 cond1、、cond2、、...为初值条件,为初值条件,v 为自变量为自变量 y 为输出的解。
为输出的解142其它运算其它运算l 反函数反函数finverse(f,v) % 求求 f 关于指定变量关于指定变量 v 的反函数的反函数finverse(f) % 求求 f 关于关于默认变量默认变量的反函数的反函数syms x t; f=x^2+2*t;g1=finverse(f,x)g2=finverse(f,t)例:例:计算函数计算函数 的反函数的反函数143 Matlab应用(四)应用(四)—— 多项式运算多项式运算—— 代数方程求解代数方程求解144l 多项式转化为符号表达式:多项式转化为符号表达式:poly2syml 四则运算:四则运算:conv、、deconvl 导数与积分:导数与积分:ployder、、polyintl 求值与零点:求值与零点:polyval、、polyvalm、、roots、、polyn 多项式运算多项式运算内容提要内容提要n 代数方程求解代数方程求解l 线性方程组数值求解:线性方程组数值求解:linsolvel 非线性方程数值求解:非线性方程数值求解:fzero l 非线性方程符号求解:非线性方程符号求解:solve145多项式表示方法多项式表示方法l 在在 Matlab 中,中,n 次多项式用一个长度为次多项式用一个长度为 n+1的向量来表示的向量来表示在在 Matlab中表示为向量:中表示为向量:注:系数中的零不能省!注:系数中的零不能省!例:例: 2x3 - x2 + 3 [2, -1, 0, 3]l Matlab 中多项式的表示方法中多项式的表示方法l 将多项式转化成符号表达式:将多项式转化成符号表达式:poly2sympoly2sym([2,-1,0,3])例:例:146多项式加减多项式加减l Matlab 没有提供专门进行多项式加减运算的函数没有提供专门进行多项式加减运算的函数l 多项式的加减就是其所对应的多项式的加减就是其所对应的系数向量的加减系数向量的加减运算运算l 次数相同的多项式,可直接对其系数向量进行加减运算次数相同的多项式,可直接对其系数向量进行加减运算l 如果两个多项式次数不同,则应该把低次多项式中系数不如果两个多项式次数不同,则应该把低次多项式中系数不足的足的高次项用高次项用 0 补足补足,然后再进行加减运算,然后再进行加减运算 例:例: p1 = 2x3 - x2 + 3 p2 = 2x + 1 p1 + p2 = 2x3 - x2 + 2x + 4 [2, -1, 0, 3] [2, 1] [0, 0, 2, 1] [2, -1, 2, 4]l 多项式加减运算多项式加减运算147多项式乘除多项式乘除k=conv(p,q)例:例:计算多项式计算多项式 2x3 - x2 + 3 和和 2x + 1 的乘积的乘积p=[2,-1,0,3]; q=[2,1];k=conv(p,q) l 多项式除法运算:多项式除法运算:[k,r]=deconv(p,q)l 其中其中 k 返回的是多项式返回的是多项式 p 除以除以 q 的商的商,,r 是余式是余式[k,r]=deconv(p,q)p=conv(q,k)+rl 多项式乘法运算:多项式乘法运算:148多项式多项式求求导导k1=polyder([2,-1,0,3]); k2=polyder([2,-1,0,3],[2,1]);[k3,d]=polyder([2,-1,0,3],[2,1]);例:例:已知已知 p1(x) = 2x3 - x2 + 3,,p2(x) = 2x + 1求:求: p1’,,( p1 p2 )’,, ( p1 /p2 )’l 多项式求导:多项式求导: polyderk=polyder(p)多项式多项式 p 的导数的导数k=polyder(p,q) p*q 的导数的导数[k,d]=polyder(p,q)p/q 的导数,的导数,k 是分子,是分子,d 是分母是分母149多项式多项式积分积分l 多项式积分:多项式积分: polyintI=polyint(p,c)不定积分,常数项取不定积分,常数项取 cI=polyint(p) 不定积分,常数项不定积分,常数项取取 0I=polyint([2,-1,0,3],5); 例:例:已知已知 p(x) = 2x3 - x2 + 3求求 ,,常数项取常数项取 5150多项式多项式求值求值l 多项式求值:多项式求值: polyvaly=polyval(p,x)计算多项式计算多项式 p 在在 x 点的值点的值l 这里的这里的 x 可以是向量或矩阵,此时采用的是可以是向量或矩阵,此时采用的是数组运算数组运算!!p=[2,-1,0,3]; x=2; y=[-1, 2; -2,1];z1=polyval(p,x)z2=polyval(p,y)例:例:已知已知 p(x) = 2x3 - x2 + 3,计算,计算 p 在在 x 和和 y 的每个分量上的每个分量上的值,其中的值,其中 x=2, y=[-1,2; -2,1]151矩阵矩阵多项式多项式求值求值l 矩阵多项式求值:矩阵多项式求值: polyvalmY=polyvalm(p,A)计算多项式计算多项式 p 作用在矩阵作用在矩阵 A 上的值上的值l 这里的这里的 A 必须是方阵,采用的是必须是方阵,采用的是普通矩阵运算普通矩阵运算!!例:例:已知已知 p(x) = 2x3 - x2 + 3 ,则,则polyvalm(p,A)=2*A*A*A - A*A + 3*eye(size(A)) polyval(p,A) = 2*A.*A.*A - A.*A + 3*ones(size(A))p=[1,0,0]; % p(x)=x2x=[1, 2; 3, 4];y1=polyval(p,x)y2=polyvalm(p,x)152多项式多项式的零点的零点l 多项式的零点:多项式的零点: rootsx=roots(p)计算多项式计算多项式 p 的所有零点的所有零点l 这里的这里的 x 是由是由 p 的所有零点组成的向量的所有零点组成的向量例:例:已知已知 p(x) = 2x3 - x2 + 3 ,求,求 p(x) 的零点的零点p=[2,-1,0,3]; x=roots(p)l 若已知多项式的全部零点,则可用若已知多项式的全部零点,则可用 poly 函数给出该多项式函数给出该多项式p=poly(x)153 k=conv(p,q)[k,r]=deconv(p,q) k=polyder(p) k=polyder(p,q)[k,d]=polyder(p,q) y=polyval(p,x) Y=polyvalm(p,A) x=roots(p)多项式多项式运算运算小结小结多项式运算中,多项式运算中,使用的是多项式使用的是多项式 系数向量,,不涉及符号计算!不涉及符号计算!poly2sym(p), poly(x) I=polyint(p,c) I=polyint(p)154l 多项式转化为符号表达式:多项式转化为符号表达式:poly2syml 四则运算:四则运算:conv、、deconvl 导数与积分:导数与积分:ployder、、polyintl 求值与零点:求值与零点:polyval、、polyvalm、、roots、、polyn 多项式运算多项式运算内容提要内容提要n 代数方程求解代数方程求解l 线性方程组数值求解:线性方程组数值求解:linsolvel 非线性方程数值求解:非线性方程数值求解:fzero l 非线性方程符号求解:非线性方程符号求解:solve155线性方程组求解线性方程组求解l 线性方程组求解:线性方程组求解: linsolvex=linsolve(A,b)解线性方程组解线性方程组 Ax = b例:例:解方程组解方程组A=[1 2 -1; 1 0 1; 1 3 0];b=[2; 3; 8];x=linsolve(A,b)l 注意:这里的右端项注意:这里的右端项 b 必须是列向量!必须是列向量!156非非线性方程求解线性方程求解l 非线性方程求解:非线性方程求解: fzerol 方程可能有多个根,但方程可能有多个根,但 fzero 只给出只给出 x0 附近的一个附近的一个l x0 是一个标量,为参考点,不能缺省是一个标量,为参考点,不能缺省l fzero 先找出一个包含先找出一个包含 x0 的区间,使得的区间,使得 f 在这个区间的在这个区间的 两个端点上的函数值异号,然后再在这个区间内寻找方程两个端点上的函数值异号,然后再在这个区间内寻找方程 f(x)=0 的解;如果找不到这样的区间,则返回的解;如果找不到这样的区间,则返回 NaNl 由于由于 fzero 是根据函数是否穿越横轴来决定零点,因此它是根据函数是否穿越横轴来决定零点,因此它 无法确定函数曲线仅触及横轴但不穿越的零点,如无法确定函数曲线仅触及横轴但不穿越的零点,如 |sin(x)|l f(x)=0 在在 [a,b] 内可能有多个解,但内可能有多个解,但 fzero 只给出一个只给出一个x=fzero(f,x0)求方程求方程 f(x)=0 在在 x0 附近的一个解附近的一个解x=fzero(f,[a,b]) 找出区间找出区间 [a,b] 内的一个解内的一个解157非非线性方程求解线性方程求解l 非线性方程求解:非线性方程求解: fzerox=fzero(f,x0)求方程求方程 f(x)=0 在在 x0 附近的一个解附近的一个解x=fzero(f,[a,b]) 找出区间找出区间 [a,b] 内的一个解内的一个解l 参数参数 f 是一个函数句柄,可通过以下方式给出是一个函数句柄,可通过以下方式给出l 内联函数:内联函数:f=inline('x^3-3*x+1'); fzero(f,2)l 匿名函数:匿名函数:f=@(x) x^3-3*x+1; fzero(f, 2) l 函数文件(略)函数文件(略) 注意:注意:f 不是方程!也不能使用符号表达式!不是方程!也不能使用符号表达式!158fzero(@sin,10)f=inline('x^3-3*x+1');x=fzero(f,2)y=fzero(f,[-2,0])用用 fzero 求零点时可以先通过作图确定零点的大致范围求零点时可以先通过作图确定零点的大致范围例:例:fzero 举例举例f=@(x) x^3-3*x+1;x=fzero(f,2)y=fzero(f,[-2,0])159代数代数方程方程符号符号求解求解l 代数方程代数方程符号求解符号求解:: solves=solve(f,v)关于指定自变量求解关于指定自变量求解s=solve(f) 关于关于默认变量默认变量求解求解l 参数参数 f 是一个符号表达式或方程是一个符号表达式或方程例:例:解方程解方程 x3 - 3x + 1=0syms x; f=x^3-3*x+1; s=solve(f,x) % 或或 s=solve(f)syms x;s=solve(x^3-3*x+1==0,x) % 方程方程, R2012版本版本160代数代数方程符号求解方程符号求解l solve 也可以用来解方程组也可以用来解方程组solve(f1,f2, ...,fN, v1,v2, ...,vN)l 求由求由 f1 , f2 , ... , fN 确定的方程组关于确定的方程组关于 v1 , v2 , ... , vN 的解的解例:例:解方程组解方程组syms x y z;[s1,s2,s3]=solve(x+2*y-z-27, x+z-3, ... x^2+3*y^2-28, x,y,z)l 注意输出变量的对应顺序!注意输出变量的对应顺序!l 如果得不到解析解,如果得不到解析解, solve 会给出数值解会给出数值解161roots(p)::多项式的多项式的所有零点所有零点,,p 是多项式系数向量是多项式系数向量fzero(f,x0)::求求 f(x)=0 在在 x0 附近的一个根,附近的一个根,f 是函是函数句柄,可以通过内联函数,匿名函数或函数文件来定义,数句柄,可以通过内联函数,匿名函数或函数文件来定义,但不能是方程或符号表达式!但不能是方程或符号表达式!solve(f,v)::求方程关于指定自变量的解,求方程关于指定自变量的解,f 是是符号表达符号表达式式或或符号方程符号方程;;l solve 也可解方程组也可解方程组 (包含非线性包含非线性)l 得不到解析解时,给出数值解得不到解析解时,给出数值解linsolve(A,b)::解线性方程组解线性方程组求解方程函数小结求解方程函数小结162上机作业(一)上机作业(一)4.2、已知多项式、已知多项式(a)求出求出 p(x) 的所有零点;的所有零点;(b) 用用 fzero 计算计算 p(x) 的第二大零点的第二大零点4.3、求方程组、求方程组 的解的解4.1、已知多项式、已知多项式计算计算 及它们的导数及它们的导数 163上机作业上机作业4.4、已知、已知 Chebyshev 多项式定义如下:多项式定义如下:试编程计算试编程计算 T20(x) 的导数(注:的导数(注:Tn(x) 为为 n 阶多项式)阶多项式)164Matlab应用(五)应用(五)—— 1.编程基础(脚本文件)编程基础(脚本文件)165本讲主要内容本讲主要内容n M 文件文件n 基本运算:算术、关系、逻辑基本运算:算术、关系、逻辑n 简单的输入输出简单的输入输出n 控制结构:顺序、选择、循环控制结构:顺序、选择、循环166Matlab 编程编程l Matlab 作为一种广泛应用于科学计算的工具软件,不仅作为一种广泛应用于科学计算的工具软件,不仅具有强大的数值计算能力和丰富的绘图功能,同时也可以具有强大的数值计算能力和丰富的绘图功能,同时也可以与与 C、、FORTRAN 等高级语言一样进行等高级语言一样进行程序设计程序设计l 利用利用 Matlab 的程序控制功能,将相关的程序控制功能,将相关 Matlab 命令编成命令编成程序存储在一个文件中(程序存储在一个文件中(M 文件文件),然后在命令窗口中运),然后在命令窗口中运行该文件,行该文件,Matlab 就会自动依次执行文件中的命令,直到就会自动依次执行文件中的命令,直到全部命令执行完毕全部命令执行完毕l 在在 Matlab 程序设计中,要充分利用程序设计中,要充分利用 Matlab 数据结构的数据结构的特点,提高编程效率特点,提高编程效率l Matlab 编程编程167l 用用 Matlab 语言编写的程序称为语言编写的程序称为 M 文件文件l M 文件以文件以 .m 为扩展名为扩展名l M 文件是由若干文件是由若干 Matlab 命令组合在一起构成的,它可命令组合在一起构成的,它可以完成某些操作,也可以实现某种算法以完成某些操作,也可以实现某种算法l M 文件分类(根据调用方式的不同)文件分类(根据调用方式的不同)l Script::脚本文件脚本文件/命令文件命令文件l Function::函数文件函数文件 M 文件文件l M 文件介绍文件介绍可以直接运行的可以直接运行的M文件文件168l M 文件的创建的与编辑文件的创建的与编辑M 文件文件l 新建一个新建一个 M 文件文件l 菜单操作菜单操作 ( File New Script / Function)l 命令操作命令操作 ( edit M 文件名文件名 )l 命令按钮命令按钮 ( 快捷键快捷键 )l 打开已有的打开已有的 M 文件文件l 菜单操作菜单操作 ( File Open )l 命令操作命令操作 ( edit M 文件名文件名 )l 命令按钮命令按钮 ( 快捷键快捷键 )l 双击双击 M 文件文件 M 文件是文本文件,可以用任何文本编辑器来建立和编辑,文件是文本文件,可以用任何文本编辑器来建立和编辑,通常使用通常使用 Matlab 自带的自带的 M 文件编辑器文件编辑器169编程示例编程示例l 编程方式:新建一个编程方式:新建一个 M 文件文件,,将上面的内容输入到该文将上面的内容输入到该文件中,然后在命令窗口中输入该文件名,即可执行件中,然后在命令窗口中输入该文件名,即可执行例:例:用用 mesh 绘制半径为绘制半径为 3 的球的球 l 命令行方式:命令行方式:u=[0:pi/60:2*pi]; v=[0:pi/60:pi]; R=3; [U,V]=meshgrid(u,v);X=R*sin(V).*cos(U); Y=R*sin(V).*sin(U); Z=R*cos(V); mesh(X,Y,Z);axis equal;注:注:M 文件的命名规则与变量相同!文件的命名规则与变量相同!170l 在命令窗口中输入在命令窗口中输入 f2c,,即可执行该即可执行该 M 文件文件例:例:编写编写M文件,将华氏温度转化为摄氏温度:文件,将华氏温度转化为摄氏温度:编程示例编程示例clear; % 清除当前工作空间中的所有变量清除当前工作空间中的所有变量f=input('Please input f:');c=5*(f-32)/9;fprintf('c=%g\n',c);l 新建一个脚本文件新建一个脚本文件 f2c.m,,内容如下:内容如下:l 脚本文件运行所产生的变量都驻留在脚本文件运行所产生的变量都驻留在 Matlab 当前工作空间当前工作空间l 百分号是百分号是注释符注释符l M文件必须在文件必须在当前工作目录当前工作目录下才能运行下才能运行171本讲主要内容本讲主要内容n M 文件文件n 基本运算:算术(略)、关系、逻辑基本运算:算术(略)、关系、逻辑n 简单的输入输出简单的输入输出n 控制结构:顺序、选择、循环控制结构:顺序、选择、循环172关系运算关系运算l 比较大小,如果结论是比较大小,如果结论是 真真 则返回则返回 1 ,否则返回,否则返回 0l 注意注意 = = 与与 = 的区别的区别l 可以对两个可以对两个同样大小同样大小的数组进行比较运算,即对应分量的数组进行比较运算,即对应分量进行比较,结果为一个同样大小的进行比较,结果为一个同样大小的0-1数组数组l 也可以对也可以对一个数组和一个标量一个数组和一个标量进行比较运算,此时标量进行比较运算,此时标量和数组中的每一个元素进行比较,结果也是一个和数组中的每一个元素进行比较,结果也是一个0-1数组数组l 关系运算:比较大小关系运算:比较大小>大于大于>=大于等于大于等于==等于等于<小于小于<=小于等于小于等于~=不等于不等于173例:例:关系运算关系运算举例举例2+2==4A=[1 3 5; 2 0 6] B=[3 1 0; 2 4 6] A>=BB<4x=pi^2<8174逻辑运算逻辑运算l 逻辑运算逻辑运算and(x,y) 与与or(x,y)或或xor(x,y) 异或异或 not(x)非非&&与(短格式)与(短格式)||或(短格式)或(短格式)注意注意 &,,| 与与 &&,,|| 的区别的区别&逻辑与逻辑与|逻辑或逻辑或~逻辑非逻辑非 例:例:x=5;3
问:是否存在使该过程永不中止的整数?问:是否存在使该过程永不中止的整数?n=input('请输入一个正整数请输入一个正整数 n: ');x=n; while x>1 if mod(x,2)==0 x=x/2; else x=3*x+1; end fprintf(' x=%d \n', x);end195循环的终止循环的终止l 循环的中断循环的中断l 跳出循环体,终止循环跳出循环体,终止循环l break 只能跳出一层循环只能跳出一层循环l 结束本轮结束本轮循环循环,,执行下一执行下一轮轮循环循环break continue break 和和 continue 通常需要与通常需要与 if 语句配合使用语句配合使用若想强行终止运行中的程序,可以使用若想强行终止运行中的程序,可以使用 Ctrl+c196pausepause % 暂停程序的运行,按任意键后继续暂停程序的运行,按任意键后继续pause(x) % 暂停程序暂停程序 x 秒秒l 这里的这里的 x 可以是小数可以是小数l pause off 屏蔽程序中所有屏蔽程序中所有 pause 的作用的作用l pause on 打开打开 pause 的作用的作用l 程序暂停程序暂停l 返回返回/退出退出l 退出退出正在运行的脚本或函数,通常用在函数文件中正在运行的脚本或函数,通常用在函数文件中return 197上机作业(二)上机作业(二)5.1、已知程序:、已知程序:5.2、已知、已知 sin(x) 的幂级数展开公式为的幂级数展开公式为试利用该公式计算试利用该公式计算 sin( /2)和和 sin(31 /2) 的值(直到级数某项的绝对的值(直到级数某项的绝对值小于值小于 10-16 为止),并与为止),并与 Matlab 自带的自带的 sin 函数比较,误差分别多函数比较,误差分别多大?为什么?大?为什么?(程序取名(程序取名 m52.m))(在程序中将最后两个值输出来,程序取名(在程序中将最后两个值输出来,程序取名 m51.m 中)中)试说明程序运行结束后,最后得到的试说明程序运行结束后,最后得到的 x 和倒数第二个和倒数第二个 x 值分别为多少?值分别为多少?若将程序改为下面的语句,结果又如何?若将程序改为下面的语句,结果又如何? x=1; while (x+x>x), x=2*x; endx=1; while (x+x>x), x=x/2; end198上机作业(二)上机作业(二)学生的成绩有两种表示方法:等级制和百分制。
对应关系如下:学生的成绩有两种表示方法:等级制和百分制对应关系如下:(a) 要求从键盘输入一个分数,然后输出其对应的等级,要求用要求从键盘输入一个分数,然后输出其对应的等级,要求用 if 语句实语句实现,程序取名为:现,程序取名为:m56.m等级等级ABCDE分数分数90--10080--8970--7960--690--59请编写程序,实现它们之间的互换,即请编写程序,实现它们之间的互换,即(b) 从键盘输入一个等级,然后输出其对应的分数区间,要求用从键盘输入一个等级,然后输出其对应的分数区间,要求用 switch 语语句实现,程序取名为:句实现,程序取名为:m57.m注:输入时要有提示,如注:输入时要有提示,如 “请输入成绩(百分制):请输入成绩(百分制):”5.3、按下面的要求编写程序、按下面的要求编写程序199Matlab应用(五)应用(五)—— 2.Matlab 编程(函数)编程(函数)200内容提要内容提要n 函数文件的定义函数文件的定义n 递归函数递归函数n 函数参数的可调性函数参数的可调性n 局部变量与全局变量局部变量与全局变量n 子函数子函数n 函数句柄、内联函数、匿名函数函数句柄、内联函数、匿名函数201l M 文件根据调用方式的不同可以分为两类文件根据调用方式的不同可以分为两类 l Script::脚本文件脚本文件,,直接输入文件名即可运行直接输入文件名即可运行l Function::函数文件函数文件 Matlab 编程编程供其它供其它M文件调用,通常带输入参数和输出参数文件调用,通常带输入参数和输出参数202function 输出形参列表输出形参列表=函数名函数名(输入形参列表输入形参列表) % 注释说明部分注释说明部分 (可选可选)函数体语句函数体语句 l 第一行为第一行为引导行引导行,表示该,表示该 M文件是函数文件文件是函数文件l 函数名的命名规则与变量名相同函数名的命名规则与变量名相同 ( 必须以字母开头必须以字母开头 )l 当当输出形参输出形参多于一个时,用多于一个时,用方括号方括号括起来括起来函数文件函数文件l 函数文件一般格式函数文件一般格式l 函数必须是一个函数必须是一个单独的单独的 M文件文件l 函数文件的函数文件的文件名必须与函数名一致文件名必须与函数名一致203l 函数文件函数文件(f2cf.m)::例:例:将华氏温度转化为摄氏温度:将华氏温度转化为摄氏温度:编程示例编程示例clear; f=input('Please input f:');c=5*(f-32)/9;l 脚本文件脚本文件 (f2cs.m)::function c=f2cf(f)c=5*(f-32)/9;204函数文件举例函数文件举例function [a,b] = myswap(x,y)% swap x and y a = y; b = x;例:例:交换两个变量的值交换两个变量的值 myswap.ml 函数可以有多个输入参数和多个输出参数函数可以有多个输入参数和多个输出参数l 也可以没有输入参数或输出参数也可以没有输入参数或输出参数205function printyh(n) % 打印杨辉三角形打印杨辉三角形, 本函数没有输出参数本函数没有输出参数yh=1; disp(yh); if n==1, return; endyh=[1,1]; disp(yh);for k=3:n yh_old=yh; k2=ceil(k/2); for i=2:k2 yh(i)=yh_old(i-1)+yh_old(i); end yh(k2+1:k)=yh(k-k2:-1:1); disp(yh);end函数文件举例函数文件举例例:例:打印杨辉三角形打印杨辉三角形 printyh.m206l 函数调用的一般格式函数调用的一般格式输出输出实参实参列表列表=函数名函数名(输入输入实参实参列表列表)l 函数调用时,函数调用时,实参的顺序实参的顺序应与函数定义时应与函数定义时形参的顺序形参的顺序一致一致l 实参实参与与形参形参之间的结合是通过之间的结合是通过值传递值传递实现的实现的l 函数可以函数可以嵌套调用嵌套调用,即一个函数可以被其它函数调用,,即一个函数可以被其它函数调用, 甚至可以被它自身调用,此时称为甚至可以被它自身调用,此时称为递归调用递归调用l 函数所传递的参数具有可调性,函数所传递的参数具有可调性,Matlab 用两个永久变量用两个永久变量 nargin 和和 nargout 分别记录调用该函数时的输入实参分别记录调用该函数时的输入实参 和输出实参的个数和输出实参的个数函数调用函数调用207% 函数文件函数文件 myfactor.mfunction y=myfactor(n)if n<=1 y=1;else y=n*myfactor(n-1);end例:例:利用函数的递归调用计算利用函数的递归调用计算 n!递归函数举例递归函数举例208% main.mclear;s=0;n=10;for i=1:n s=s+myfactor(i);endfprintf(' s=%d \n', s)例:例:计算计算 1! + 2! + … + 10!递归函数举例递归函数举例209% ex4nargin.mfunction y=ex4nargin(a,b)if nargin==1 y = a;elseif nargin==2 y = a*b;end参数的可调性举例参数的可调性举例例:例:nargin 和和 nargout 的使用的使用% ex4nargout.mfunction [p,q]=ex4nargout(a,b)if nargout==1 p=a+b;elseif nargout==2 p=a+b; q=a-b;end>> y1=ex4nargin(3)>> y2=ex4nargin(3,4)>> x=ex4nargout(5,3)>> [x,y]=ex4nargin(5,3)210内容提要内容提要n 函数文件的定义函数文件的定义n 递归函数递归函数n 函数参数的可调性函数参数的可调性n 局部变量与全局变量局部变量与全局变量n 子函数子函数n 函数句柄、内联函数、匿名函数函数句柄、内联函数、匿名函数211l 局部变量:只能在其被定义的局部变量:只能在其被定义的 M 文件中使用文件中使用l 全局变量:可以在多个全局变量:可以在多个 M 文件中使用文件中使用l Matlab 中,变量默认是局部变量中,变量默认是局部变量局部变量与全局变量局部变量与全局变量l 局部变量与全局变量局部变量与全局变量l 局部变量局部变量l Matlab 中,变量默认是局部变量,即一个中,变量默认是局部变量,即一个M文件中定义文件中定义的变量不能被其它的变量不能被其它 M 文件引用文件引用l 当函数调用完毕后,该函数文件中所定义的所有局部变当函数调用完毕后,该函数文件中所定义的所有局部变量都将被释放,即量都将被释放,即全部被清除全部被清除l 函数通过函数通过输入和输出参数输入和输出参数与其它与其它 M 文件进行数据传递文件进行数据传递212程序示例程序示例% main.mclear; a=1; b=3;z=mysquaresum(a,b);fprintf(' z=%d \n', z); disp(mysum) % ERROR% mysquaresum.mfunction mysum = mysquaresum(x,y)mysum=x^2+y^2; mysum=a^2+b^2; % ERROR213局部变量与全局变量局部变量与全局变量l 全局变量全局变量global 变量名列表变量名列表l 全局变量的定义或声明全局变量的定义或声明l 变量名列表中的各个变量变量名列表中的各个变量用空格隔开用空格隔开,不能用逗号!,不能用逗号!l 在需要使用全局变量的所有在需要使用全局变量的所有M文件中,都要进行声明文件中,都要进行声明l 定义全局变量是定义全局变量是 M文件间传递信息的一种手段文件间传递信息的一种手段214程序示例程序示例% main.mclear; global a b; % 声明声明 a b 是全局变量是全局变量a=1; b=3;z=mysquaresum();fprintf(' z=%d \n', z); disp(mysum); % ERROR,,mysum 不是全局变量不是全局变量% mysquaresum.mfunction mysum = mysquaresum()global a b; % 这里也必须声明这里也必须声明 a b 是全局变量是全局变量global mysum;mysum=a^2+b^2; % OK215全局变量给函数间的数据传递带来了方便,但却破坏全局变量给函数间的数据传递带来了方便,但却破坏了函数对变量的封装,降低了程序的可读性,因而了函数对变量的封装,降低了程序的可读性,因而在在结构化程序设计中,全局变量是不受欢迎的结构化程序设计中,全局变量是不受欢迎的。
特别是特别是当程序较大,子程序较多时,全局变量将给程序调试当程序较大,子程序较多时,全局变量将给程序调试和维护带来不便,故和维护带来不便,故一般不提倡使用全局变量一般不提倡使用全局变量全局变量全局变量216程序示例程序示例% ex4global.mclear; global a b;a=1; b=3;z=mysquaresum(a,b);fprintf(' a=%d, b=%d \n', a,b);z=myproduct(a,b);fprintf(' a=%d, b=%d \n', a,b);% mysquaresum.mfunction mysum=mysquaresum(x,y)mysum=x^2+y^2; a=x+y;% myproduct.mfunction myprod=myproduct(x,y)global amyprod=x*y; a=x+y;217内容提要内容提要n 函数文件的定义函数文件的定义n 递归函数递归函数n 函数参数的可调性函数参数的可调性n 局部变量与全局变量局部变量与全局变量n 子函数子函数n 函数句柄、内联函数、匿名函数函数句柄、内联函数、匿名函数218子函数子函数l 一个函数文件中可以包含一个或多个函数,一个函数文件中可以包含一个或多个函数, 其中第一个称为其中第一个称为主函数主函数,其它函数称为,其它函数称为子函数子函数l 除全局变量外,所有函数(主函数、子函数)中的变量都除全局变量外,所有函数(主函数、子函数)中的变量都是局部变量,函数之间通过输入、输出参数进行数据传递是局部变量,函数之间通过输入、输出参数进行数据传递l 主函数必须位于最前面,子函数出现的次序任意主函数必须位于最前面,子函数出现的次序任意l 子函数只能被主函数和位于同一个子函数只能被主函数和位于同一个M文件中的其它子函文件中的其它子函数调用数调用l 外部外部 M 文件只能调用主函数文件只能调用主函数l 子函数子函数 219子函数举例子函数举例% ex4subfun.mfunction [avg, med]=ex4subfun(x) % 主函数主函数 n=length(x);avg=mymean(x,n);med=mymedian(x,n);function y=mymean(x,n) % 子函数,计算平均值子函数,计算平均值y=sum(x)/n;function y=mymedian(x,n) % 子函数,计算中值子函数,计算中值x=sort(x);if rem(n,2)==1 y=x((n+1)/2);else y=(x(n/2)+x(n/2+1))/2;end>> x=rand(6,1)>> [y1,y2]=ex4subfun(x)220函数句柄函数句柄l 函数句柄的定义函数句柄的定义fhandle=@ 函数名函数名 函数句柄函数句柄::可以理解成一个函数的代号或别名,调用函数句柄可以理解成一个函数的代号或别名,调用函数句柄就等价于调用该函数。
就等价于调用该函数l @ 的作用就是将一个函数的函数句柄赋值给左边的变量的作用就是将一个函数的函数句柄赋值给左边的变量 例:例:f = @sin;y = f(pi/3)221内联函数内联函数l 内联函数的定义内联函数的定义函数名函数名=inline('函数表达式函数表达式', '变量变量1', '变量变量2',,...) MATLAB中的内联函数借鉴了中的内联函数借鉴了C语言中的内联函数,使用内联语言中的内联函数,使用内联函数可以减少调用的时间和空间开销函数可以减少调用的时间和空间开销l 由于内联函数是储存于内存中而不是在由于内联函数是储存于内存中而不是在M文件中,省去了文件文件中,省去了文件访问的时间,加快了程序的运行效率访问的时间,加快了程序的运行效率l 但内联函数只能定义一些简单的函数表达式但内联函数只能定义一些简单的函数表达式l 若调用函数时涉及数组运算,则定义函数时也要用数组运算!若调用函数时涉及数组运算,则定义函数时也要用数组运算!例:例:f=inline('x^2 + y^2','x','y');y=f(2,3)222匿名函数匿名函数l 匿名函数的定义匿名函数的定义fhandle=@ (输入参数列表输入参数列表)运算表达式运算表达式例:例:f=@(x,y) x^2 + y^2; y=f(2,3)匿名函数匿名函数是是 Matlab 7.0 版提出的一种全新的函数描述形式,和版提出的一种全新的函数描述形式,和内联函数类似,可以让用户编写简单的函数而不需要创建内联函数类似,可以让用户编写简单的函数而不需要创建M文文件件;它具有内联函数的所有优点,并且效率比内联函数高。
它具有内联函数的所有优点,并且效率比内联函数高223匿名函数匿名函数p=3; q=5;f=@(x,y) x^p + y^q;y=f(2,3)p=2; q=4;f=@(x,y) x^p + y^q; % 当参数发生改变时,函数必须重新定义当参数发生改变时,函数必须重新定义y=f(2,3) l 若调用函数时涉及数组运算,则定义函数时也需要使用数组若调用函数时涉及数组运算,则定义函数时也需要使用数组运算运算l 匿名函数匿名函数支持变量替换支持变量替换f=@(x) x.^2 + 1;x=1:5;y=f(x)224上机作业(三)上机作业(三)5.4、、兔子繁殖问题:兔子繁殖问题:( Fibonacci number ) 假设假设每对每对大大兔每月生兔每月生出出一对一对小兔,且新生的小兔满二个月小兔,且新生的小兔满二个月后长成大兔就能生育,后长成大兔就能生育,那么从刚出生的一对小兔算起,那么从刚出生的一对小兔算起,12个个月后总共有月后总共有多少对兔子?多少对兔子?三年后呢?试编写一个三年后呢?试编写一个函数函数计算该计算该题,期中输入为月数,输出为兔子对数题,期中输入为月数,输出为兔子对数。
函数名取为(函数名取为 m541)(只需交函数文件))(只需交函数文件)5.5、、编写一个函数,编写一个函数,函数名为函数名为 m551,,要求要求::l 一个输出参数,三个输入参数一个输出参数,三个输入参数l 当输入一个参数时,输出一个出错信息,并返回当输入一个参数时,输出一个出错信息,并返回l 当输入两个或三个参数时,计算它们的阶乘的和当输入两个或三个参数时,计算它们的阶乘的和225Matlab应用(六)应用(六)—— 自定义函数自定义函数的几种方式的几种方式226q Matlab 中中自定义函数的自定义函数的常见常见方式方式l 脚本文件脚本文件/函数文件函数文件+ 函数文件函数文件自定义函数的方式自定义函数的方式l 函数文件函数文件 + 子函数子函数l 内联函数和匿名函数内联函数和匿名函数l 符号表达式符号表达式 + subs227% 脚本文件脚本文件::myfile1.mclearfor t=1:10; y=mylfg(t); fprintf('%4d^(1/3) = %6.4f\n',t,y);end% 函数文件函数文件::mylfg.mfunction y = mylfg(x)y=x^(1/3);函数必须单独写一个文件!函数必须单独写一个文件!不能与命令文件写在同一个文件中!不能与命令文件写在同一个文件中!函数名与文件名必须一致!函数名与文件名必须一致!调用函数时要注意调用函数时要注意实参实参与与形参形参的匹配!的匹配!函数文件函数文件l 方式一:方式一:命令文件命令文件/函数文件函数文件 + 函数文件函数文件228子函数子函数% 函数文件函数文件::funtry2.m function []=funtry2()for t=1:10 y=lfg2(t); fprintf('%4d^(1/3) = %6.4f\n',t,y);endfunction y=lfg2(x) % 子函数子函数y=x^(1/3);函数文件中可以定义一个或多个函数文件中可以定义一个或多个子函数子函数,此时我们称该函,此时我们称该函数为数为主函数主函数,子函数,子函数只能只能被主函数或同一个函数文件中的被主函数或同一个函数文件中的其它子函数调用!其它子函数调用!l 方式二:函数文件方式二:函数文件 + 子函数子函数函数可以使用函数可以使用 end 表示结束,但这不是必须的。
表示结束,但这不是必须的229f=inline('函数表达式函数表达式','变量变量1','变量变量2',...)y=f(实参列表实参列表)实参列表实参列表应与定义时的应与定义时的变量变量顺序保持一致顺序保持一致例:例:内联函数内联函数l 方式三:内联函数和匿名函数方式三:内联函数和匿名函数 l 内联函数内联函数l 调用方式调用方式 f=inline('x^2+y','x','y')y=f(2,3) 根据实际情况,定义函数时可能需要使用数组运算根据实际情况,定义函数时可能需要使用数组运算230例:例:匿名函数匿名函数l 方式三:内联函数和匿名函数方式三:内联函数和匿名函数 l 匿名函数匿名函数 + 函数句柄函数句柄f = @ (变量列表变量列表) 表达式表达式y=f(实参列表实参列表)l 调用方式调用方式 f = @(x,y) x^2 + y;y = f(2,3)实参列表实参列表应与定义时的应与定义时的变量列表变量列表保持一致保持一致根据实际情况,可能需要使用数组运算根据实际情况,可能需要使用数组运算231l 这种函数定义方式是将这种函数定义方式是将 f 作为一个内部函数调用其特作为一个内部函数调用。
其特点是:调用方式点是:调用方式最接近于我们平时对函数的定义最接近于我们平时对函数的定义,使程序,使程序更具可读性同时由于它是基于更具可读性同时由于它是基于 Matlab 的数值计算内核的,的数值计算内核的,所以它的所以它的运算速度较快运算速度较快,程序更有效率程序更有效率l 这种定义方式的缺点:这种定义方式的缺点:l 只能定义一些简单的函数;只能定义一些简单的函数;l 不支持不支持符号运算符号运算匿名函数匿名函数232l 首先定义一个首先定义一个符号表达式符号表达式/函数函数,用,用 subs 命令调用命令调用syms x f=1/(1+x^2); subs(f,x,代替代替 x 的数值或符号的数值或符号)符号表达式符号表达式l 方式四:符号表达式方式四:符号表达式 + subsl 优点:可以进行符号计算优点:可以进行符号计算l 缺点:由于使用符号运算内核,运算速度会大大降低缺点:由于使用符号运算内核,运算速度会大大降低233Matlab应用(七)应用(七)—— 文件操作文件操作234内容提要内容提要n 文件的打开与关闭文件的打开与关闭n 文本文件的写与读文本文件的写与读n 二进制文件的写与读二进制文件的写与读235q 文文件件操操作作是是一一种种重重要要的的输输入入输输出出方方式式,,Matlab 提提供了一系列输入输出函数,专门用于文件操作。
供了一系列输入输出函数,专门用于文件操作q Matlab文件操作三步骤:文件操作三步骤:q Matlab中中的的输输入入输输出出函函数数是是以以 C 语语言言标标准准库库函函数数中中的的输输入入输输出出函函数数为为基基础础开开发发的的,,所所以以这这些些函函数数与与 C 语言的输入输出函数相类似语言的输入输出函数相类似Matlab 文件操作介绍文件操作介绍(1) 打开打开文件文件(2) 对文件进行对文件进行读写读写操作操作(3) 关闭关闭文件文件236l 打开方式有(若不指定打开方式,则表示只读)打开方式有(若不指定打开方式,则表示只读) ::fid=fopen(文件名,打开方式文件名,打开方式)'r'只读,文件必须存在(缺省的打开方式)只读,文件必须存在(缺省的打开方式)'w'写文件,若文件已存在则原内容将被覆盖;若文写文件,若文件已存在则原内容将被覆盖;若文件不存在则新建一个件不存在则新建一个'a'在文件末尾添加,文件若不存在则新建一个在文件末尾添加,文件若不存在则新建一个'r+' 可读可写,文件必须存在可读可写,文件必须存在'w+'可读可写,若文件已存在则原内容将被覆盖;若可读可写,若文件已存在则原内容将被覆盖;若文件不存在则新建一个文件不存在则新建一个'a+' 可读可写可添加,文件若不存在则新建一个可读可写可添加,文件若不存在则新建一个文件的打开文件的打开l 其中文件名用字符串形式表示(可以带路径名)其中文件名用字符串形式表示(可以带路径名)l 文件的打开文件的打开237l fid 为文件句柄,通过它才能对该文件进行操作为文件句柄,通过它才能对该文件进行操作l 如果句柄值大于如果句柄值大于 0,则表示文件打开成功;,则表示文件打开成功;l 若文件打开失败,若文件打开失败,fid 的返回值为的返回值为 -1。
l 有两个标准代码文件,不需打开就可以直接使用,分别为:有两个标准代码文件,不需打开就可以直接使用,分别为:fid=1 标准输出文件,标准输出文件,fid=2 标准错误文件标准错误文件文件的打开文件的打开fid=fopen('output.txt',,'wt+');fprintf(fid,'Hello world!\n');fclose(fid);fprintf(1,'Hello world!\n');fprintf(2,'Hello world!\n');fid=fopen(文件名,打开方式文件名,打开方式)238文件的关闭文件的关闭l 其中其中 fid 为所要关闭的文件的句柄为所要关闭的文件的句柄l status 为关闭文件的返回代码,若成功则为为关闭文件的返回代码,若成功则为 0,否则为,否则为 -1l 文件操作结束后一定要关闭文件操作结束后一定要关闭status=fclose(fid);l 文件的关闭文件的关闭239内容提要内容提要n 文件的打开与关闭文件的打开与关闭n 文本文件的写与读文本文件的写与读n 二进制文件的写与读二进制文件的写与读240l 将将指定的变量指定的变量按指定的格式写入文本文件中按指定的格式写入文本文件中l 若省略若省略 fid,,则表示在屏幕上输出则表示在屏幕上输出l count 返回所写入的数据的个数(可省)返回所写入的数据的个数(可省)l format 用来指定写数据时采用的格式,通常由三部分组成用来指定写数据时采用的格式,通常由三部分组成 普通字符串、格式字符串、转义字符普通字符串、格式字符串、转义字符count=fprintf(fid,format,输出变量列表输出变量列表)文本文件的写入文本文件的写入l 向文本文件中写数据向文本文件中写数据x=3.14; str='math'; fid=fopen('output.txt','wt');fprintf(fid,'x=%f, str=%s\n', x, str);status=fclose(fid);241l 数据输出时采用的格式(数据输出时采用的格式(format))文本文件的写入文本文件的写入n flags (可选可选)n width and precision (可选可选)n conversion character (格式说明符,必须格式说明符,必须) (1) 普通字符串普通字符串:按原样输出:按原样输出(2) 格式字符串格式字符串:指定变量的输出格式,以:指定变量的输出格式,以 % 开头,包括开头,包括(3) 转义字符转义字符:输出特殊符号,如换行等,常见的有::输出特殊符号,如换行等,常见的有:\b退后一格退后一格\t水平制表符水平制表符\f换页换页\\反斜杠反斜杠\n换行换行''单引号单引号\r回车回车%%百分号百分号242格式字符串格式字符串fprintf('x= %-12.5f \n', x)以以 % 开头开头flagfield widthprecision格式说明符格式说明符- :左对齐:左对齐+ :输出符号:输出符号0 :空白处添:空白处添 0空格空格:前面加一空格:前面加一空格字段宽度字段宽度指定小数指定小数点后位数点后位数l 格式字符串示例格式字符串示例243格式说明符格式说明符l 常见的格式说明符常见的格式说明符c字符型字符型g浮点数(自动)浮点数(自动)d十进制整数十进制整数o八进制八进制e浮点数(科学计数法)浮点数(科学计数法)s字符串字符串f浮点数(小数形式)浮点数(小数形式)x/X十六进制十六进制x=sqrt(2);fid=fopen('out2.txt','wt');fprintf(fid,'x=%12.5f, \n', x);fprintf(fid,'x=%-12.5f, \n', x);status=fclose(fid);例:例:244x=0:0.1:1; y=exp(x);fid=fopen('output.txt','wt');fprintf(fid,' x exp(x)\n');for k=1:length(x) fprintf(fid,'%6.2f %12.8f\n', x(k),y(k));endstatus=fclose(fid);例:例:文本文件写入举例文本文件写入举例l 注:格式的重复使用注:格式的重复使用x=0:0.1:1; y=exp(x); z=[x; y];... ... fprintf(fid,'%6.2f %12.8f\n', z);... ...245l A 用来存放读取的数据用来存放读取的数据l count 返回读取数据的个数,为可选项返回读取数据的个数,为可选项l fid 为文件句柄为文件句柄l size 为可选项,若缺省,则读取整个文件,为可选项,若缺省,则读取整个文件, 若给出,则取值可以是:若给出,则取值可以是:[A,count]=fscanf(fid,format,size)文本文件的读取文本文件的读取N读取读取 N 个数据,组成一个列向量个数据,组成一个列向量Inf读取整个文件,组成一个列向量读取整个文件,组成一个列向量[m,n] 读取读取 m n 个数据,组成到一个个数据,组成到一个 m n 矩阵,矩阵,按列存放按列存放l 从文本文件中读取数据从文本文件中读取数据246文本文件读取举例文本文件读取举例x=0:0.1:1; y=exp(x); z=[x; y];% 文本文件读取文本文件读取fid=fopen('output.txt','wt');fprintf(fid,'%6.2f %12.8f\n', z); status=fclose(fid);% 文本文件读取文本文件读取fid=fopen('output.txt','rt');A=fscanf(fid,'%f'); % 注意格式字符串注意格式字符串% A=fscanf(fid,'%f',[2,11]);status=fclose(fid);例:例:247内容提要内容提要n 文件的打开与关闭文件的打开与关闭n 文本文件的写与读文本文件的写与读n 二进制文件的写与读二进制文件的写与读248l 按指定的数据类型将矩阵按指定的数据类型将矩阵 A 中的元素写入到文件中。
中的元素写入到文件中 其中其中 count 返回所写入的数据元素个数(可省)返回所写入的数据元素个数(可省)count=fwrite(fid,A,precision)A=magic(5); fid=fopen('magic5.dat','wb');fwrite(fid,A,'int8');fclose(fid);fid=fopen('magic5.dat','rb');[B,count]=fread(fid,[5,inf],'int8');fclose(fid);二进制文件的写入二进制文件的写入例:例:l 向二进制文件中写入数据向二进制文件中写入数据249l precision 代表写入的数据的类型,缺省为代表写入的数据的类型,缺省为 uchar'uchar'无符号字符无符号字符'uint16'16位无符号整数位无符号整数'schar'带符号字符带符号字符'uint32'32位无符号整数位无符号整数'int8'8位带符号整数位带符号整数'uint64'64位无符号整数位无符号整数'int16'16位带符号整数位带符号整数'float32'32位浮点数位浮点数'int32'32位带符号整数位带符号整数'float64'64位浮点数位浮点数'int64'64位带符号整数位带符号整数'double'64位双精度数位双精度数'uint8'8位无符号整数位无符号整数二进制文件二进制文件250'char'带符号字符带符号字符'short'16位带符号整数位带符号整数'int'32位带符号整数位带符号整数'long'32或或64位带符号整数位带符号整数'ushort'16位无符号整数位无符号整数'uint'32位无符号整数位无符号整数'ulong'32或或64位无符号整数位无符号整数'float'32位浮点数位浮点数l 以下数据类型与使用的平台有关:以下数据类型与使用的平台有关:二进制文件二进制文件251[A,count]=fread(fid,size,precision)A=fread(fid,size,precision)N读取读取 N 个数据,组成一个列向量个数据,组成一个列向量Inf读取整个文件,组成一个列向量读取整个文件,组成一个列向量[m,n] 读取读取 m n 个数据到一个个数据到一个 m n 矩阵中,矩阵中,按列存放按列存放二进制文件的读二进制文件的读l A 用来存放读取的数据用来存放读取的数据l count 返回读取数据的个数,可选项返回读取数据的个数,可选项l fid 为文件句柄为文件句柄l size 为可选项,缺省为读取整个文件。
取值可以是:为可选项,缺省为读取整个文件取值可以是:l 从二进制文件中读取数据从二进制文件中读取数据252fid=fopen('output.dat','rb');A=fread(fid,100,'double');status=fclose(fid);fid=fopen('output.dat','rb');[A,count]=fread(fid,[100,100],'double');status=fclose(fid);例:例:二进制文件读写举例二进制文件读写举例253l 打开文件读写数据时,需要判断和控制文件的打开文件读写数据时,需要判断和控制文件的读写位置读写位置,,如数据是否读完,或者需要读写指定位置上的数据等如数据是否读完,或者需要读写指定位置上的数据等l 在读写文件时,在读写文件时,Matlab 自动创建一个自动创建一个文件位置指针文件位置指针来管理来管理和维护文件读写数据的起始位置和维护文件读写数据的起始位置l Matlab 提供了几个文件位置指针定位操作函数:提供了几个文件位置指针定位操作函数: fseek、、ftell 、、 frewind 和和 feof读写的定位读写的定位l 读写的定位读写的定位254status=fseek(fid,offset,origin)l fid 为文件句柄为文件句柄l offset 表表示示位位置置指指针针相相对对偏偏移移的的字字节节数数,,若若为为正正表表示示向向文件尾方偏移,若为负表示向文件头方向偏移文件尾方偏移,若为负表示向文件头方向偏移fseekn 'cof' 表示当前位置,表示当前位置,n 'bof' 表示文件的开始位置,表示文件的开始位置,n 'eof' 表示文件末尾;表示文件末尾;l 若定位成功,若定位成功,status 返回值为返回值为 0,否则返回,否则返回 -1l origin 表示位置指针移动的参照位置,有三种取值:表示位置指针移动的参照位置,有三种取值:l 读写的定位读写的定位255frewind(fid)eofstat=ftell(fid)l 判判断断文文件件位位置置指指针针是是否否达达到到文文件件结结束束位位置置,,若若文文件件位位置指针已在文件末尾,则返回置指针已在文件末尾,则返回 1,否则返回,否则返回 0position=ftell(fid)l 返回值为从文件开始到指针当前位置的字节数返回值为从文件开始到指针当前位置的字节数l 将位置指针返回到文件的起始位置将位置指针返回到文件的起始位置ftell、、frewind 和和 feofl 读写的定位读写的定位。
