首页资源分类DSP > 精通Matlab2011a.pdf

精通Matlab2011a.pdf

已有 445510个资源

下载专区

文档信息举报收藏

标    签:MATLAB

分    享:

文档简介

本书包含MATLAB使用和数学知识的丰富层次。编著本书有四个主要目的:(1) 帮助初学者顺利跨入MATLAB大门;(2) 全面、多层次、细致而深入地叙述MATLAB中数值、字符串、胞元、构架、逻辑、函数句柄六种重要数据类型的应用规则、相互配用和编程规范;(3) 由浅入深地阐述MATLAB三种建模、分析、仿真环境——数值计算、符号计算和Simulink环境的特征和使用要领;(4) 以实例讲述MATLAB代表的现代计算能力对传统算法和思维的影响。

文档预览

内容简介 本书由纸质媒体和电子媒体有机结合而成。纸质媒体便于读者进行系统、全面、长时间连续地阅读, 便于随心翻阅、浏览;而电子媒体向读者提供色彩信息和动态交互的软件环境,提供读者实践本书内容所 需的各种文件。 本书包含 MATLAB 使用和数学知识的丰富层次。编著本书有四个主要目的:(1)帮助初学者顺利跨 入 MATLAB 大门;(2) 全面、多层次、细致而深入地叙述 MATLAB 中数值、字符串、胞元、构架、逻 辑、函数句柄六种重要数据类型的应用规则、相互配用和编程规范;(3) 由浅入深地阐述 MATLAB 三种 建模、分析、仿真环境——数值计算、符号计算和 Simulink 环境的特征和使用要领;(4) 以实例讲述 MATLAB 代表的现代计算能力对传统算法和思维的影响。 全书包含 276 个算例。所有算例的程序都是可靠、完整的。读者可以完整、准确地重现本书所提供的 算例结果,以掌握要领,举一反三,到达灵活应用的境地。 本书正文和算例所涉及的指令全部罗列在“附录 C 索引”中。该索引与目录组合,可为读者提供比较 完善的快速查阅环境。 随书光盘中包含:黑白纸质印刷版无法表现的各种彩色图形;用 Mbook 模板制作的“活性”的各章 DOC 文档;各算例运行所需的 M 文件和 MAT 数据文件;Simulink 块图模型的 MDL 文件;图形用户界面 的 FIG 文件。 本书既可作为理工科院校研究生、本科生系统学习的教材,又可以作为广大科技工作者借助 MATLAB 进行科学计算及仿真的自学和参考用书。 1 前言 1. 编写背景 MATLAB(MATrix LABoratory)自 20 世纪 80 年代初问世以来,历经 30 年的实践检 验、市场筛选和时间凝炼,已成为科学研究、工程技术等众多领域最可信赖的科学计算环 境和标准仿真平台,成为高等教学必须传授的学习和计算软件,成为学术演讲、交流中实 验数据和曲线图形的来源。 近年我国经济发展迅猛,“便携式个人电脑 + MATLAB”的配置工具在高校、科研院 所以惊人的速度迅速普及。这使得理工科高校的每位师生、科研院所的每位研发人员都拥 有了前所未有的巨大“计算潜能”。原有的研究方法、设计程式、论文写作方式以及教学 内容等都必将受到这种新的“计算潜能”的巨大的冲击。 为缓和巨大计算潜能和原有教材之间的矛盾,国内外理工科高校教材几乎都作出了把 MATLAB 引进教材的努力。这种努力大致可分为两个层面。第一层面,完全不改变原有教 材内容,而仅把 MATLAB 作为“手算的替身”用于相关内容的算例习题解算。第二层面, 对原有教材中“那些手算所不能处理”的内容加以改变,而成为由 MATLAB 实施的新章节; 或把原教学大纲中“那些采用硬件设备进行”的实验改成 MATLAB 仿真。 MATLAB 对我国高等教学的影响,虽然比国外晚 10 年左右,但变化之迅速却远非欧 美所及。在几乎“人手一机”和 MATLAB 普及使用的高校里,无论是教师或学生,也不管 有意识思考还是无意识感受,都会时时面临一个共同的问题:拥有崭新电脑工具的我们还 有必要循着计算尺时代形成的模式去学习分析和综合设计吗? 硬件的低成本化、外界的需求又反过来推动 MATLAB 自身的改变和发展。近 30 年的 历练,MATLAB 已经从纯指令操作软件发展为在各种界面进行交互式操作的平台,从单纯 的分析、计算软件发展成为集计算、仿真、硬件开发于一体的综合环境,从单一学科辅助 工具扩展为多门类多学科的计算资源库。 2. 编写宗旨及特点 本书作者自 2000 年编写《精通 MATLAB 5.3 版》和 2003 年编写《精通 MATLAB 6.5 版 》以来,主要精力一直投入于以 MATLAB 为工具的控制、信号处理及智能计算等研究。 与此同时,随着 MATLAB 的不断升级,每年也为《精通》一书写些修订和增补文档,直接 服务于面向本校学生的 MATLAB 课程。在此七、八年期间,本书作者曾多次尝试《精通》 一书的修订,但终因时间不足,致半途而废。 2008 年秋,MATLAB 的默认符号计算引擎由 Maple 更换为 MuPAD。这一重大变化促 使本书作者下定“重写《精通》”的决心。此后,历时 2 年多,完成此书初稿,共 1150 页 (A4 版面)。这样大的篇幅令人尴尬。一方面,恐因篇幅过大,而束缚对内容深度与广度应 有的舒展;另方面,这千余页篇幅,无疑不便于读者使用。经与编辑多次商讨后,决心对 MATLAB 与 C、C++等外部程序关联的内容作“切除留后”处理,对 MATLAB“自封闭” 内容则进行了削枝强干的调整。 现在本书具有如下几个特点。  秉承《精通 MATLAB 6.5 版》的编写宗旨:全面地多层次地描述 MATLAB 的通用功能。 “全面及多层次”表现为:  本书对 MATLAB 本身的入门引导写得相当细腻,即使是对 MATLAB 一无所知的 读者,也可以循着本书的第 1 章,顺利跨入门槛。  对于那些不大熟悉数值、符号、Simulink 等计算、建模的读者来说,只要找到相关 章节,沿着若干初始算例树立的“路标”,循序渐进,就能很快通过自我学习获 得熟练运用的能力。  涉及 MATLAB 较深应用层面,如数值计算泛函指令的参数传递、符号变量的非负、 1 整数域约束及跨空间计算、Simulink 的信息流控制、图形用户界面回调函数编写等 内容,本书的阐述也都可以为读者解除困惑。  本书 276 个算例中的绝大多数都是相对独立的,都配有可实际运行的完整解算指 令。即使 MATLAB 新手,或对算例所涉及知识不甚了解的读者,只要循序操作算 例指令,并阅读指令后的相关解释,也能顺利实践,获得启发后,更可举一反三。  继续保持《精通 MATLAB 6.5 版》的编写传统:在避免囫囵吞枣的限度内,尽可能简 明完整地透析 MATLAB 指令、Simulink 模块的数学本质及其应用。例如:  依托有限差分、积分等章节的算例,揭示建立在“浮点数系”基础上的数值计算, 如何受“精度、空间、时间”等微观、宏观测度有限性的影响。  借助奇异值分解阐述秩、范、子空间等矩阵结构计算的数值本质,借助特征值分 解描述矩阵函数的计算本质。  鉴于 MATLAB R2011a 版关于随机流概念的系统归纳和 rng 新指令的给出,本书用 较多篇幅阐述了伪随机流、随机序列的创建、重现控制和独立性控制的多种方法。 此外,还简明描述了均值、偏差、斜度、峭度等统计量的几何意义及计算指令。  提出求取系统传递函数的代数方程符号法,此法不仅系统性强而不依赖“人工技 巧”,而且还原了梅逊信流图法的数学实质。  借助积分模块的两种不同数学表述,隐喻 Simulink 积分解算方式与数值积分指令 的本质差异——前者体现“时间流”,后者依赖“数据流”。  保持并延伸《精通 MATLAB 6.5 版》所涉内容的数学知识纵深度,多方位地适应 MATLAB 用户知识层面的深化和多样化。例如:  在数值积分方面,不仅介绍了 MATLAB“求面积、求体积”的 quad 类指令,而且 介绍了样条积分、Monte Carlo 积分、Simulink 积分的基本原理和实现方法。  在随机变量和数理统计方面,较大篇幅增添的内容有:全局随机流、随机序列的 创建、重现控制和独立性控制,三阶斜度、四阶峭度计算等。  在模型拟合和参数估计方面,新增内容——以多项式拟合为算例,描述了拟合参 数标准差及置信区间、新观察预测区间等。  在优化计算方面,不仅介绍了无约束优化计算,还新增了带约束优化计算及全域 寻优算法和思想。  推介 MATLAB 现代计算能力在方法学层面的新表现,描述这种现代计算能力对“计算 尺时代”遗留下来的传统概念、方法和技巧的审视和冲击。例如:  第 5.7.1 节利用代数方程求根的现代计算能力和 MATLAB 的图形表现力,直接根 据不同放大倍数下求得的闭环根序列,绘制“精良根轨迹”,并进而借助 MATLAB 提供的数据探索工具形象、互动地表现放大倍数与闭环根之间的依赖关系。这种 新方法概念清晰、操作简单、图形精准。值得指出的是:现今高校教材所教授的 传统根轨迹绘制法,乃是建立在“计算尺能力”之上的。  第 5.7.2 节利用求解符号代数方程的现代能力,直接求取“方框图”或“信流图” 的系统传递函数。该方法系统性、规范性及计算的简单性远胜于“计算尺时代” 的梅逊法。值得指出的是:梅逊法至今仍广泛地存在于我国高校的“信号与系统” “自动控制原理”等教材中。  第 5.8.3 节,借助 MATLAB 的图形表现力,绘制误差曲面,形象地展示了泰勒近 似的“邻域适用性”。  第 8.7.51 小节利用微分方程单步仿真法绘制“状态轨迹”,其对系统性状的描述 能力远强于“传统相轨迹”。这种单步状态轨线,不仅能精确地表现稳定平衡点 周围的速度场,而且能同样精确地表现不稳定平衡点周围的速度场。  第 8.7.52 小节利用数值优化指令求得的 ITAE 标准型系统的性能显然优于“模拟机 时代”给出的那些传统 ITAE 标准型系统。  本书特别在第 6.8 节新增 3 小节用于表述 MATLAB 的交互式数据探索工具:数据 探针、数据刷和数据链。而算例 5.7.1 则综合地表现了数据探索工具的具体应用。  算例 4.53、4.121、4.123 分别表现了 MATLAB 图形能力在非线性方程求解、单变 量寻优、带约束二元函数寻优等方面的应用价值。  本书第 9 章详细叙述了对研究方法有重大影响的图形用户界面(GUI)的制作方法。 2 该章算例 9.21 展示了 GUI 表现二阶系统阶跃响应各种特征时所特有的能力。  此外,也对原《精通 MATLAB 6.5 版》少部分内容进行了删减。  完全删去原书中的“MATLAB 编译器”、“应用程序接口 API”两章。原因是: 一,避免因篇幅限制,使其内容显得肤浅;二,避免因外部程序变化,使其内容 不稳定。  删除原书中“句柄图形”一章。原因是:一,各种图形对象的属性,现已可在 MATLAB 图形窗中便捷地读取和设置;二,部分常用的图形对象属性的指令设置内容已被 融入新书的其他章节。  原书中“Notebook”一章,精简后以附录形式出现。 3. 内容简介 全书由目录、正文、附录和随书光盘组成。正文共 9 章。  第 1 章基础准备及入门 详细讲述 MATLAB 的工作平台、基本特征和使用方法,讲授如何借助 MATLAB 的帮 助系统解决所遇到的困难。任何 MATLAB 新手借助本章都可以比较顺利地跨入 MATLAB 门槛。  第 2 章数值数组及向量化运算 介绍 MATLAB 的两个数据类型(数值数组、逻辑数组),两个特有变量(“非数”及 “空”),两个 MATLAB 指令及编程特征(数组运算和向量化编程)。其中数值数组创建、 编址、援引寻访、扩展收缩等所涉的概念和技法也适用于其他数据类型数组。  第 3 章字符串、胞元和构架数组 集中介绍字符串、胞元、构架三种数据类型的创建、特点及相互转换。掌握这些数据 类型有助于理解 MATLAB(方程求解、优化)泛函指令、图形对象、Simulink 模型模块等 的参数设置和使用。  第 4 章数值计算 集中描述 MATLAB 的数值计算能力,其节次按数学类别划分。所涉数学理论知识大致 涵盖理工科本科及研究生知识层面。每个算例都会简明地勾勒问题的来龙去脉,帮助读者 克服由于理论数学、计算数学、MATLAB 指令间的知识跳跃和交叉引起的困惑。  第 5 章符号计算 MATLAB 由数值计算引擎驱动,其随带的符号计算引擎是 MuPAD。本章内容完全适 配 MuPAD 引擎。该章的解题理念、建模计算、结果表述等都不同于数值计算,而与传统 教科书的理论内容相似,因此学生更容易接受并使用。因为该章内容相对独立,所以在内 容设计上,安排了从简单入门到跨空间进入 MuPAD 环境的多层次节次。  第 6 章数据可视及探索 系统阐述离散数据绘制成图的基本机理、基本技法、绘图指令的调用和搭配。介绍 MATLAB 图形窗所具备的“数据——图形双向交互能力”,推介 MATLAB 最新体现的“交 互式数据探索”研究方法。  第 7 章 M 文件和函数句柄 系统介绍 MATLAB 编程的基本构件、数据流控制、各类子函数、两种函数句柄、泛函 计算指令、跨空间调用和赋值等内容,为编写较复杂程序读者所必读。  第 8 章 Simulink 交互仿真环境 Simulink 的建模、解算、结果表述既不同于数值计算,也不同于符号计算,相对独立, 由浅入深层次分明。第一个算例,非常详尽地描写 Simulink 的交互式建模步骤、操作要领、 注意事项,以使新手可循此例而入门。其他节次则涉及构造并运作复杂 Simulink 模型所必 需的各种连续和离散模块,各种条件控制子系统,各种操作指令。  第 9 章图形用户界面(GUI) 重点介绍 GUI 的 GUIDE 辅助设计法。算例 9.21 的细腻叙述,足以帮助对 GUI 完全陌 生的读者,初步掌握创建图形用户界面的全部操作要领。该章内容的重要性在于:GUI 不 仅使研发过程友善、结果表现形象生动,而且有孕育新研发技术和思维方式的潜能。 附录共 3 个。 3  附录 A Notebook 简扼介绍 Notebook 工作环境的创建、组织及应用。该附录将有助于读者创建集文字表 述、数学公式、解算指令、计算结果、图形表现于一体的学术演讲稿、教学课件、科研报 告、学位论文等。  附录 B 光盘使用说明 专为随书光盘编写,主要用于:说明光盘 mbook 目录上所载 DOC 文件的开启环境和使 用方法;说明光盘 mfile 目录上 M、MDL 文件的使用。  附录 C 索 引 根据英文字母排列次序,列出了本书叙述文字或算例中所涉及的所有符号、指令、模 块和图形对象属性的“英文关键词(或符)”。读者借助该“索引”,可以由“英文关键 词(或符)”找到相关的中文说明或使用算例。 4. 读者对象 MATLAB 自身性质决定了本书的主要读者对象是:需要数学建模、研究分析、理论验 证、计算机仿真的各类大学生、研究生、教师和科研人员。 本书的章节安排、各章内容、276 个算例是作者根据 MATLAB 所跨数学及程序语言两 大范畴的内涵融合而成的。与一般程序语言类书籍相比,本书的特点在于:包含了较大篇 幅的理论数学、计算数学及其他专业基础方面的理论描述。而与一般的数学教材、计算方 法书籍相比,不同之处又在于:本书并不停留于纯推理性阐述,而特别注重于表述完成计 算任务的 MATLAB 指令的使用要旨及注意事项。因此,本书可以用作为 MATLAB 编程、 数学建模、科学计算、数字仿真的综合教学用书和科研参考书。 本书在讲述数值建模、符号建模、Simulink 建模、及 GUI 制作等内容时,都专门设计 了操作步骤及引导性算例(所涉工具介绍得特别详细),用以帮助初学者顺利地入门,并 使他们在阅读指令的注解说明后,可以举一反三。因此,本书也可以供各类研发人员自学 使用。 除显而易见的简单算例外,本书作者在设计和编写算例时,尽力在理论和编程两方面 保持各算例的独立性和完整性,以供各类读者根据需要随时片段地翻阅,掌握具体的算法 和指令配合。换句话说,像字典一样,本书可用作查阅算法或 MATLAB 具体指令调用方法 的“手册”。 5. 使用建议  本书用于教学时,教师可参考本书章节次序安排教学进程。讲授时,不建议使用 PowerPoint 形式的课件,而建议采用 Notebook 制作的课件。这是因为,后者可以让听 课的学生在 Word 文字环境中看到 MATLAB 指令的实时操作和现场显示出的数值或图 形结果。本书为教师制作课件方便,在随书光盘里,提供了保持全书章节结构、算例 可运行 M 码的电子文档。  本书用于系统自学时,读者可不必循序阅读,也不建议通读。建议先认真阅读并实践 入门性算例,而不必强求自己去操练那些数学知识过深或编程过于复杂的算例。此外, 再次诚恳地建议:不要采用“复制随书光盘中现成 M 码”的方法,去实践本书算例, 而应采用“自己键入”的方式去实践,以体会编写程序的思路和过程。  本书用作“手册”查阅参考时,读者应注意目录、索引、英文关键词的不同检索功用。 目录用于“可能模糊的内容”检索;索引用于“已知指令名称”的交叉检索;(本书 中出现的)英文关键词专供 MATLAB 帮助浏览器信息的检索使用。  本书所有算例的 M 码都是可靠且可运行的,所有算例结果也都是可重现的。至于那些 无法通过纸质书籍表现的 Simulink 模型代码和彩色图形,读者都可以在随书光盘中找 到相应的 MDL 文件或电子文档。  随书光盘中,还存放有与《精通 MATLAB 6.5 版》相配的电子文档,以供读者不时之 需。 6. 致 谢 4 本书是作者长年科研和教学积累的结果。本书的成稿得到张昀、阮秀凯、靳种宝、李 娟娟、胡丽珍、谢逢博、冯子豪、王贵银、张传飞、朱捷、钱建平、江洁、蒋啸、王担担、 张蓉等博士和硕士研究生的帮助和支持,得到我始终一贯的合作者杨祖樱教授的全力支持。 借本书出版之际,向他们表示真诚的感谢。 最后还要感谢北京航空航天大学出版社长期一贯的支持和合作。 本书虽几经反复筛选提炼,但限于作者知识,赘病、错误和偏见仍难避免。在此,恳 切各方面专家和广大读者的不吝指教。作者电子信箱:zyzh@njupt.edu.cn 。 作者 5 第 1 章 基础准备及入门 1.1 MATLAB 的安装和工具包选择 1.2 Desktop 操作桌面的启动 1.2.1 MATLAB 的启动 1.2.2 Desktop 操作桌面简介 1.3 1.3.1 图 1.2-1 Desktop 操作桌面的外貌 Command Window 运行入门 Command Window 指令窗简介 1 图 1.3-1 几何独立的指令窗 1.3.2 最简单的计算器使用法 【例 1.3-1】求 [12  2  (7  4)]  32 的算术运算结果。 (1) >> (12+2*(7-4))/3^2 (2) ans = 2 〖说明〗 【例 1.3-2】“续行输入”法。本例演示:或由于指令太长,或出于某种需要,输入指令行 必须多行书写时,该如何处理。 S=1-1/2+1/3-1/4+ ... 1/5-1/6+1/7-1/8 S= 0.6345 〖说明〗 1.3.3 数值、变量和表达式 1 数值的记述 2 变量命名规则 3 MATLAB 默认的数学常数 预定义变量 表 1.3-1 MATLAB 为数学常数预定义的变量名 含义 预定义变量 含义 2 eps i或j Inf 或 inf intmax intmin 〖说明〗 NaN 或 nan pi realmax realmin 【例 1.3-3】运用以下指令,以便初步了解关于常数的预定义变量。 format short e RMAd=realmax('double') % RMAs=realmax('single') % RMAd = 1.7977e+308 RMAs = 3.4028e+038 IMA64=intmax('int64') % IMA32=intmax % IMA32=intmax('int16') % IMA64 = 9223372036854775807 IMA32 = 2147483647 IMA32 = 32767 format long e e1=eps % e2=eps(2) % e1 = 2.220446049250313e-016 e2 = 4.440892098500626e-016 pi ans = 3.141592653589793 4 运算符和表达式 (1) 加 减 乘 除 幂 圆括号 〖说明〗 表 1.3-2 MATLAB 表达式的基本运算符 数学表达式 矩阵运算符 ab ab ab ab ab a+b a-b a*b a/b 或b \a a^b () () 数组运算符 a+b a-b a .* b a ./ b 或 b .\ a a .^ b () (2) 3 5 面向复数设计的运算——MATLAB 特点之一 【例 1.3-4】复数 z1  4  3i, z2  1 2i, z3  i 2e 6 表达,及计算 z  z1 z2 z3 。 (1) z1= 4 + 3i % z1 = 4+ 3i 〖说明〗 (2) z2 = 1 + 2 * i z3=2*exp(i*pi/6) z=z1*z2/z3 z2 = 1+ z3 = 1.7321 + z= 1.884 + % % 2i 1i 5.2631i (3) real_z=real(z) image_z=imag(z) magnitude_z=abs(z) angle_z_radian=angle(z) % angle_z_degree=angle(z)*180/pi % real_z = 1.884 image_z = 5.2631 magnitude_z = 5.5902 angle_z_radian = 1.2271 angle_z_degree = 70.305 【例 1.3-5】图示复数 z1  4  3i, z2  1  2i 的和(配图 1.3-2)。 z1=4+3*i;z2=1+2*i; % % % z12=z1+z2 % clf,hold on % plot([0,z1,z12],'-b','LineWidth',3) plot([0,z12],'-r','LineWidth',3) plot([z1,z12],'ob','MarkerSize',8) hold off,grid on, axis equal axis([0,6,0,6]) text(3.5,2.3,'z1') text(5,4.5,'z2') text(2.5,3.5,'z12') xlabel('real') ylabel('image') z12 = 5.0000 + 5.0000i 4 6 5 z2 4 z12 3 z1 2 image 1 0 0 1 2 3 4 5 6 real 图 1.3-2 两个复数相加 【例 1.3-6】 用 MATLAB 计算 3  8 能得到 –2 吗(配图 1.3-3)? (1) a=-8; r_a=a^(1/3) % r_a = 1.0000 + 1.7321i (2) % p=[1,0,0,-a]; % % R=roots(p) % R= -2.0000 1.0000 + 1.7321i 1.0000 - 1.7321i (3) MR=abs(R(1)); % t=0:pi/20:2*pi; % x=MR*sin(t); y=MR*cos(t); plot(x,y,'b:'),grid on % % hold on plot(R(2),'.','MarkerSize',30,'Color','r') % plot(R([1,3]),'o','MarkerSize',15,'Color','b') % axis([-3,3,-3,3]),axis square % hold off 5 3 2 1 0 -1 -2 -3 -3 -2 -1 0 1 2 3 〖说明〗 图 1.3-3 (-8)的全部三次方根分布 6 面向数组设计的运算——MATLAB 特点之二 【例 1.3-7】实数数组 AR  1 2 (1) AR= [1,3;2,4] 3 4 的“一行”输入法。 (2) (3) AR = 1 3 2 4 〖说明〗 【例 1.3-8】实数数组 AI  5 6 AI=[5,7 6,8] AI = 5 7 6 8 7 8 的“分行”输入法。 〖说明〗 【例 1.3-9】对复数数组 A  1 2   5i 6i 3 4   7i 8i 进行求实部、虚部、模和幅角的运算。 6 (1) AR=[1,3;2,4];AI=[5,7;6,8]; A=AR-AI*i % A= 1.0000 - 5.0000i 3.0000 - 7.0000i 2.0000 - 6.0000i 4.0000 - 8.0000i (2) A_real=real(A) A_image=imag(A) A_real = 1 3 2 4 A_image = -5 -7 -6 -8 (3) for m=1:2 for n=1:2 Am1(m,n)=abs(A(m,n)); Aa1(m,n)=angle(A(m,n))*180/pi; % end end Am1,Aa1 Am1 = 5.0990 7.6158 6.3246 8.9443 Aa1 = -78.6901 -66.8014 -71.5651 -63.4349 (4) Am2=abs(A) Aa2=angle(A)*180/pi Am2 = 5.0990 7.6158 6.3246 8.9443 Aa2 = -78.6901 -66.8014 -71.5651 -63.4349 〖说明〗 t 【例 1.3-10】画出衰减振荡曲线 y  e 3 sin 3t , t 的取值范围是[0,4 ] (配图 1.3-4)。 t=0:pi/50:4*pi; % y=exp(-t/3).*sin(3*t); % plot(t,y,'-r','LineWidth',2) % axis([0,4*pi,-1,1]) xlabel('t'),ylabel('y') 7 1 0.8 0.6 0.4 0.2 y 0 -0.2 -0.4 -0.6 -0.8 -1 0 2 4 6 8 10 12 t 〖说明〗 图 1.3-4 衰减振荡曲线 【例 1.3-11】复数矩阵 B  3  2i 5  3i 2 4   6i 2i 的生成,及计算 A  B 矩阵乘积(A 取自算例 1.3-9)。 B=[3+2i,2+6i;5+3*i,4-2*i] % % C=A*B % B= 3.0000 + 2.0000i 2.0000 + 6.0000i 5.0000 + 3.0000i 4.0000 - 2.0000i C= 49.0000 -39.0000i 30.0000 -38.0000i 62.0000 -42.0000i 40.0000 -40.0000i 〖说明〗 1.4 Command Window 操作要旨 1.4.1 指令窗的显示方式 1 默认的输入显示方式 2 运算结果的显示 指令 format 表 1.4-1 数据显示格式的控制指令 含义 通常保证小数点后四位有效,最多不超 8 举例说明 format short format long format short e format long e format short g format long g format rat format hex format + format bank format compact format loose 〖说明〗 过 7 位;对于大于 1000 的实数,用 5 位 有效数字的科学记数形式显示。 小数点后 15 位数字表示 5 位科学记数表示 15 位科学记数表示 从 format short 和 format short e 中自动选 择最佳记数方式 从 format long 和 format long e 中自动选 择最佳记数方式 近似有理数表示 十六进制表示 显示大矩阵用。正数、负数、零 分别用 + , - , 空格表示。 (金融)元、角、分表示 显示变量之间没有空行 在显示变量之间有空行 3 显示方式的永久设置 1.4.2 指令行中的标点符号 名称 空格 逗号 黑点 分号 冒号 注释号 单引号对 圆括号 方括号 花括号 赋值号 下连符 续行号 “At”号 惊叹号 〖说明〗 表 1.4-2 MATLAB 常用标点的功能 标点 作 用 , . ; : % '' () [] {} = _ ... @ ! 1.4.3 指令 ans cd 指令窗的常用控制指令 表 1.4-3 常见的通用操作指令 含义 指令 含义 最新计算结果的默认变量名 设置当前工作目录。 edit 打开 M 文件编辑器 exit 关闭/退出 MATLAB 9 clf clc clear dir doc diary 清除图形窗 清除指令窗中显示内容 清除 MATLAB 工作空间中保存 的变量 列出指定目录下的文件和子目 录清单 在 MATLAB 浏览器中,显示帮 助信息 把指令窗输入记录为文件 〖说明〗 help more quit return type which 在指令窗中显示帮助信息 使其后的显示内容分页进行 关闭/退出 MATLAB 返回到上层调用程序;结束键 盘模式 显示指定 M 文件的内容 指出其后文件所在的目录 1.4.4 指令窗中指令行的编辑 键名     PageUp PageDown 〖说明〗 表 1.4-4 MATLAB 指令窗中实施指令行编辑的常用操作键 作用 键名 作用 前寻式调回已输入过的指令行 Home 使光标移到当前行的首端 后寻式调回已输入过的指令行 End 使光标移到当前行的尾端 在当前行中左移光标 Delete 删去光标右边的字符 在当前行中右移光标 Backspace 删去光标左边的字符 前寻式翻阅当前窗中的内容 Esc 清除当前行的全部内容 后寻式翻阅当前窗中的内容 【例 1.4-1】指令行操作过程示例。 (1) y1=2*sin(0.3*pi)/(1+sqrt(5)) (2) y1 = 0.5000 (3) y2=2*cos(0.3*pi)/(1+sqrt(5)) y2 = 0.3633 〖说明〗 1.5 Command History 历史指令窗 1.5.1 Command History 历史指令窗简介 应用功能 单行或多行指令 的复制 单行指令的运行 表 1.5-1 历史指令窗主要应用功能的操作方法 操作方法 10 简捷操作方法 鼠标左键双击 多行指令的运行 把多行指令写成 M 文件 1.5.2 历史指令的再运行 【例 1.5-1】演示如何再运行算例 1.3-10 中的全部绘图指令。 单行指令。 〖说明〗 图 1.5-1 再运行历史指令的演示 1.6 Current Directory、路径设置器和文件管理 当在指令窗中运行一条指令时,MATLAB 是怎样从庞大的函数和数据库中,找到所需 的函数和数据的呢?用户怎样才能保证自己所创建的文件能得到 MATLAB 的良好管理,又 怎样能与 MATLAB 原有环境融为一体呢?这就是本节要介绍的内容。 1.6.1 Current Directory 当前目录浏览器简介 11 应用功能 运行 M 文件 编辑 M 文件 把 MAT 文件全 部数据输入内存 把 MAT 文件部 分数据输入内存 〖说明〗 图 1.6-1 当前目录浏览器和适配的弹出菜单 表 1.6-1 当前目录适配菜单的应用 操作方法 1.6.2 (1) (2) (3) 用户目录和当前目录设置 12 简捷操作方法 鼠标左键双击 M 文件。 鼠标左键双击 MAT 文件。 1.6.3 MATLAB 的搜索路径 1.6.4 MATLAB 搜索路径的扩展 1 何时需要修改搜索路径 2 利用设置路径对话框修改搜索路径 〖说明〗 图 1.6-2 路径设置对话框 3 利用指令 path 设置路径 path(path,'c:\my_dir') path('c:\my_dir',path) 〖说明〗 1.7 工作空间浏览器和变量编辑器 1.7.1 工作空间浏览器和变量可视化 13 功能 图 1.7-1 工作空间浏览器及“绘图工具”图标的展开 表 1.7-1 工作空间浏览器主要功能及其操作方法 操作方法 新变量创建 变量内容显示 向内存 装载文件数据 把变量 保存进文件 图形绘制启动键 绘图类型 菜单引出键 【例 1.7-1】通过“工作空间浏览器”的运作,采用图形显示内存变量 t 和 y 之间的关系图 14 形 。(注意:本例是在例 1.3-10 运行后进行的,因此内存中保存着由例 1.3-10 产生的全部 变量。) 〖说明〗 图 1.7-2 数组(t, y) 表示的曲线 1.7.2 工作空间的管理指令 1 查询指令 who 及 whos 【例 1.7-2】在指令窗中运用 who, whos 查阅 MATLAB 内存变量。 who Your variables are: ans t y whos Name Size Bytes Class Attributes ans 1x1 t 1x201 y 1x201 8 double 1608 double 1608 double 〖说明〗 2 从工作空间中删除变量和函数的指令 clear clear var1 var2 clear all clear fun1 fun2 3 整理工作空间内存碎片的指令 pack 1.7.3 Variable Editor 变量编辑器 15 图 1.7-3 变量编辑器 1.7.4 数据文件和变量的存取 1 借助工作空间浏览器产生保存变量的 MAT 文件 2 借助输入向导 Import Wizard 向工作空间装载变量 图 1.7-4 向工作空间装载变量的输入向导 3 存取数据的操作指令 save 和 load save FileName save FileName v1 v2 save FileName v1 v2 -append save FileName v1 v2 -ascii save FileName v1 v2 -ascii -double load FileName load FileName v1 v2 load FileName v1 v2 -ascii 〖说明〗 【例 1.7-3】数据的存取。(假定内存中已经存在变量 X,Y,Z) 16 (1) mkdir('c:\','my_dir'); % cd c:\my_dir % save saf X Y Z % dir % . .. saf.mat (2) clear % load saf Z % who % Your variables are: Z 〖说明〗 1.8 Editor/Debugger 和脚本编写初步 对于比较简单的问题,对于那些一次性问题,通过指令窗中直接输入一组指令去求解, 也许是比较简便、快捷的。但当待解决问题所需的指令较多和所用指令结构较复杂时,或 当一组指令通过改变少量参数就可以被反复使用去解决不同问题时,直接在指令窗中输入 指令的方法就显得烦琐和笨拙。M 脚本文件就是设计来解决这个矛盾的。 1.8.1 Editor/Debugger M 文件编辑器简介 图 1.8-1 M 文件编辑器示图 1.8.2 M 脚本文件编写初步 【例 1.8-1】编写解算例 1.3-10 题目的 M 脚本文件,并运行之。 17 〖说明〗 图 1.8-2 利用历史指令创建 M 文件 1.9 帮助系统及其使用 1.9.1 帮助体系的三大系统 表 1.9-1 MATLAB 的帮助体系 帮助形式 特点 资源 指令窗帮 文本形式;最可信、最原始; 助子系统 不适于系统阅读。 HTML 形 式 ; 系 统 叙 述 帮助 MATLAB 规则和用法;适 导航系统 于系统阅读和交叉查阅;最 重要的帮助形式。 Web 网 包括各种 PDF 文件、视频演 帮助系统 示文件、各种讨论组等 1.9.2 常用帮助指令 1 函数搜索指令 help help TopicName help FunName helpwin helpwin TopicName helpwin FunName doc ToolboxName doc FunName 18 〖说明〗 2 词条搜索指令 lookfor KeyWord docsearch 〖说明〗 1.9.3 Help 帮助浏览器 1 帮助浏览器的导出 (1) (2) 图 1.9-1 默认的帮助浏览器界面 19 2 帮助浏览器界面简介 (1)总体外观 (2)        (3) (4) 20 图 1.9-2 按相关性罗列的搜索结果 3 帮助浏览器默认显示的利用 (1)    (2) 图 1.9-3 函数及图柄帮助通道区 (3) 图 1.9-4 版本信息帮助通道区 图 1.9-5 详细使用说明通道区 21 (4) (5) (6) 图 1.9-6 功能演示通道区 图 1.9-7 PDF 文档通道区 图 1.9-8 MathWorks 网站资源通道区 22 第 2 章 数值数组及向量化运算 本章集中讲述两个数据类型(数值数组和逻辑数组)、两个特有概念变量(非数和空)、 以及 MATLAB 的数组运算和向量化编程。值得指出:本章内容是读者今后编写各种科学计 算 M 码的基本构件。 数值数组(Numeric Array)是 MATLAB 最重要的数据类型数组。在各种维度的数值数 组中,二维数组为最基本、最常用。本章对二维数组创建、标识、寻访、扩充、收缩等方 法进行了详尽细腻的描述,并进而将这些方法推广到高维数组。 本章讲述的逻辑数组主要产生于逻辑运算和关系运算。它是 MATLAB 援引寻访数据、 构成数据流控制条件、、编写复杂程序所不可或缺的重要构件。 数组运算是 MATLAB 区别于其它程序语言的重要特征,是 MATLAB 绝大多数函数指 令、Simulink 许多库模块的本性,是向量化编程的基础。为此,本章专辟第 2.2 节用于阐述 MATLAB 的这一重要特征。 在此提醒读者注意:随书光盘 mbook 目录上保存着本章相应的电子文档“ch02_数值数 组及向量化运算.doc”。该文档中有本章全部算例的可执行指令,以及相应的运算结果。 2.1 数值数组的创建和寻访 2.1.1 一维数组的创建 1 递增/减型一维数组的创建 (1)“冒号”生成法 (2)线性(或对数)定点法 2 其他类型一维数组的创建 (1)逐个元素输入法 (2)运用 MATLAB 函数生成法 【例 2.1-1】一维数组的常用创建方法举例。 a1=1:6 a2=0:pi/4:pi a3=1:-0.1:0 a1 = 1 2 3 4 5 6 a2 = 0 0.7854 1.5708 2.3562 a3 = Columns 1 through 8 1.0000 0.9000 0.8000 0.7000 0.3000 Columns 9 through 11 0.2000 0.1000 0 b1=linspace(0,pi,4) b2=logspace(0,3,4) b1 = 0 1.0472 b2 = 2.0944 3.1416 3.1416 0.6000 0.5000 0.4000 1 1 10 c1=[2 pi/2 sqrt(3) 3+5i] c1 = 2.0000 1.5708 rng default c2=rand(1,5) c2 = 0.8147 0.9058 0.1270 〖说明〗  x1=(1:6)' , x2=linspace(0,pi,4)' y1=rand(5,1) z1=[2; pi/2; sqrt(3); 3+5i] 100 1000 1.7321 0.9134 0.6324 3.0000 + 5.0000i 2.1.2 二维数组的创建 1 小规模数组的直接输入法 【例 2.1-2】在 MATLAB 环境下,用下面三条指令创建二维数组 C。 a=2.7358; b=33/79; C=[1,2*a+i*b,b*sqrt(a);sin(pi/4),a+5*b,3.5+i] C= 1.0000 0.7071 5.4716 + 0.4177i 0.6909 4.8244 3.5000 + 1.0000i 2 中规模数组的数组编辑器创建法 【例 2.1-3】试用变量编辑器,把如下 (3 6) 的数组输入 MATLAB 内存,并命名为 A18。 0.8147 0.9134 0.2785 0.9649 0.9572 0.1419 0.9058 0.6324 0.5469 0.1576 0.4854 0.4218 0.1270 0.0975 0.9575 0.9706 0.8003 0.9157 图 2.1-1 利用数组编辑器创建中规模数组 2 3 中规模数组的 M 文件创建法 【例 2.1-4】为数组 AM,创建一个 exm020104_Matrix.m 文件。以后每当需要 AM 数组时, 只要运行 exm020104_Matrix 文件,就可在内存生成 AM。 图 2.1-2 利用 M 文件创建数组 4 利用 MATLAB 函数创建数组 【例 2.1-5】利用 MATLAB 指令产生数组。 (1) ao=ones(2,4) az=zeros(2,5) ae=eye(3) am=magic(4) ad=diag(am) add=diag(diag(am)) ao = 1 1 1 1 1 1 1 1 az = 0 0 0 0 0 0 0 0 0 0 ae = 1 0 0 0 1 0 0 0 1 am = 16 2 3 13 5 11 10 8 9 7 6 12 4 14 15 1 ad = 16 11 6 1 add = 16 0 0 0 0 11 0 0 0 0 6 0 0 0 0 1 (2) % rng default Au=rand(1,5) 3 Ai=randi([-3,4],2,8) As=randsrc(3,12,[-3,-1,1,3],1) Ap=randperm(8) Au = 0.8147 0.9058 0.1270 0.9134 0.6324 Ai = -3 1 4 4 0 -2 4 4 -1 4 -2 4 3 0 3 2 As = -1 -1 -3 1 -3 1 -3 3 3 -3 -3 1 1 -3 -1 -1 3 -1 -3 -1 3 -3 -1 1 -3 -3 -1 1 -3 1 3 1 -3 3 3 -1 Ap = 1 7 8 4 6 5 2 3 % rng(0,'v5normal') randn(2,6) ans = -0.4326 0.1253 -1.6656 0.2877 -1.1465 1.1909 1.1892 -0.0376 0.3273 -0.1867 0.1746 0.7258 (3) n=5;lambda=2; A = gallery('jordbloc',n,lambda) A= 2 1 0 0 0 0 2 1 0 0 0 0 2 1 0 0 0 0 2 1 0 0 0 0 2 rng(11,'v5normal') n=6; kappa=1e8; mode=2; B= gallery('randsvd',n,kappa,mode) Bsv=svd(B)' Bc=cond(B) B= -0.2402 -0.6286 -0.6241 -0.1413 -0.5761 0.2703 0.2092 -0.1420 0.5168 -0.1311 0.0244 -0.6882 0.5613 0.2022 -0.1260 0.2781 -0.0744 0.0489 0.3518 -0.5518 -0.1044 -0.2899 0.1391 -0.0840 Bsv = 1.0000 1.0000 1.0000 1.0000 Bc = 1.0000e+008 0.2258 -0.2454 -0.4403 0.3097 0.7473 -0.2010 1.0000 -0.2410 -0.4657 -0.2138 -0.1772 0.0709 0.7394 0.0000 2.1.3 二维数组元素的标识和寻访 1 数组的维数和大小 (1)数组的维数(Dimension) (2)数组的大小(Size) 【例 2.1-6】数组的维数、大小和长度 4 clear A=reshape(1:24,2,3,4); dim_A=ndims(A) size_A=size(A) L_A=length(A) dim_A = 3 size_A = 2 3 4 L_A = 4 2 数组的标识和寻访 【例 2.1-7】本例演示:数组元素及子数组的各种标识和寻访格式;冒号的使用;end 的作 用。 (1) A=zeros(2,6) A(:)=1:12 a8=A(8) a311=A([3,11]) A= 0 0 0 0 0 0 0 0 0 0 0 0 A= 1 3 5 7 9 11 2 4 6 8 10 12 a8 = 8 a311 = 3 11 (2) A(3,7)=37 a13=A(:,[1,3]) aend=A([2,3],4:end) A= 1 3 5 7 9 11 0 2 4 6 8 10 12 0 0 0 0 0 0 0 37 a13 = 1 5 2 6 0 0 aend = 8 10 12 0 0 0 0 37 (3) L=A<3 A(L)=NaN L= 1 0 0 0 0 0 1 1 0 0 0 0 0 1 1 1 1 1 1 1 0 A= NaN 3 5 7 9 11 NaN NaN 4 6 8 10 12 NaN NaN NaN NaN NaN NaN NaN 37 5 2.1.4 数组的扩缩和特殊操作 1 数组的扩充和收缩 【例 2.1-8】二维数组的扩充和收缩。 (1) a=1:5;b=6:10;c=11:15; a_b=[a,b] ab=[a;b;c] a_b = 1 2 3 4 5 6 7 8 9 10 ab = 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 (2) AB1=repmat(ab,[1,2]) AB2=repmat(ab,[2,1]) AB1 = 1 2 3 4 5 1 2 3 4 5 6 7 8 9 10 6 7 8 9 10 11 12 13 14 15 11 12 13 14 15 AB2 = 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 (3) AB2([2,3,5,6],:)=[] AB2(:,1:3)=[] AB2 = 1 2 3 4 5 1 2 3 4 5 AB2 = 4 5 4 5 2 数组的特殊操作 【例 2.1-9】本例演示:reshape 的数组变形功能;数组的翻转指令 flipud, fliplr, flipdim,以 及它们体现的矩阵变换;数组绕“左上元素”反时针旋转指令 rot90;数组上下左右平移回 绕指令 circshift。 (1) clear a=1:24; A=reshape(a,3,8) B=reshape(A,2,4,3) A= 1 4 7 10 13 16 19 22 2 5 8 11 14 17 20 23 3 6 9 12 15 18 21 24 B(:,:,1) = 1 3 5 7 6 2 4 6 8 B(:,:,2) = 9 11 13 15 10 12 14 16 B(:,:,3) = 17 19 21 23 18 20 22 24 (2) Aud=flipud(A) Alr=fliplr(A) B1=flipdim(A,1) B2=flipdim(A,2) At=A' Aud = 3 6 9 12 15 18 21 24 2 5 8 11 14 17 20 23 1 4 7 10 13 16 19 22 Alr = 22 19 16 13 10 7 4 1 23 20 17 14 11 8 5 2 24 21 18 15 12 9 6 3 B1 = 3 6 9 12 15 18 21 24 2 5 8 11 14 17 20 23 1 4 7 10 13 16 19 22 B2 = 22 19 16 13 10 7 4 1 23 20 17 14 11 8 5 2 24 21 18 15 12 9 6 3 At = 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 (3) A90=rot90(A) A180=rot90(A,2) A90 = 22 23 24 19 20 21 16 17 18 13 14 15 10 11 12 7 8 9 4 5 6 1 2 3 A180 = 24 21 18 15 12 9 6 3 23 20 17 14 11 8 5 2 22 19 16 13 10 7 4 1 (4) A CR=circshift(A,1) CL=circshift(A,[0,-1]) A= 1 4 7 10 13 16 19 22 2 5 8 11 14 17 20 23 7 3 CR = 3 1 2 CL = 4 5 6 6 9 12 15 18 21 24 6 9 12 15 18 21 24 4 7 10 13 16 19 22 5 8 11 14 17 20 23 7 10 13 16 19 22 1 8 11 14 17 20 23 2 9 12 15 18 21 24 3 3 数组操作函数汇总 2.2 数组运算 2.2.1 数组运算的由来和规则 1 函数关系数值计算模型的分类 2 提高程序执行性能的三大措施 3 数组运算规则 4 数组运算符及数组运算函数 2.2.2 数组运算和向量化编程 【例 2.2-1】欧姆定律: r  u ,其中 r, u, i 分别是电阻(欧姆)、电压(伏特)、电流(安 i 培)。验证实验:据电阻两端施加的电压,测量电阻中流过的电流,然后据测得的电压、 电流计算平均电阻值。(测得的电压电流具体数据见下列程序)。 (1) clear vr=[0.89, 1.20, 3.09, 4.27, 3.62, 7.71, 8.99, 7.92, 9.70, 10.41]; ir=[0.028, 0.040, 0.100, 0.145, 0.118, 0.258, 0.299, 0.257, 0.308, 0.345]; L=length(vr); for k=1:L r(k)=vr(k)/ir(k); end % <7> sr=0; % <8> for k=1:L sr=sr+r(k); end rm=sr/L % <12> rm = 30.5247 (2) clear vr=[0.89, 1.20, 3.09, 4.27, 3.62, 7.71, 8.99, 7.92, 9.70, 10.41]; ir=[0.028, 0.040, 0.100, 0.145, 0.118, 0.258, 0.299, 0.257, 0.308, 0.345]; r=vr./ir % <16> rm=mean(r) % <17> 8 r= Columns 1 through 8 31.7857 30.0000 30.9000 30.8171 Columns 9 through 10 31.4935 30.1739 rm = 30.5247 29.4483 30.6780 29.8837 30.0669 【例 2.2-2】用间距为 0.1 的水平线和垂直线均匀分割 x [5,5], y [2.5,2.5] 的矩形域, 在所有水平线和垂直线交点上计算函数 z  sin | xy | 的值,并图示。 (1) clear x=-5:0.1:5; y=(-2.5:0.1:2.5)'; N=length(x); M=length(y); for ii=1:M for jj=1:N X0(ii,jj)=x(jj); Y0(ii,jj)=y(ii); Z0(ii,jj)=sin(abs(x(jj)*y(ii))); end end (2) [X,Y]=meshgrid(x,y); Z=sin(abs(X.*Y)); (3) norm(Z-Z0) ans = 0 (4) surf(X,Y,Z) xlabel('x') ylabel('y') shading interp view([190,70]) 9 图 2.2-1 指定域上的二元函数图形 2.2.3 数组特殊运算指令汇总 【例 2.2-3】数组元素的“和”、“积”、“累和”、“累积”运算。 clear rng default a=[(1:5)',randi(5,[5,3]),randn(5,2)] cs=cumsum(a) s=sum(a) cp=cumprod(a) p=prod(a) a= 1.0000 5.0000 1.0000 1.0000 -0.2050 0.6715 2.0000 5.0000 2.0000 5.0000 -0.1241 -1.2075 3.0000 1.0000 3.0000 5.0000 1.4897 0.7172 4.0000 5.0000 5.0000 3.0000 1.4090 1.6302 5.0000 4.0000 5.0000 5.0000 1.4172 0.4889 cs = 1.0000 5.0000 1.0000 1.0000 -0.2050 0.6715 3.0000 10.0000 3.0000 6.0000 -0.3291 -0.5360 6.0000 11.0000 6.0000 11.0000 1.1606 0.1812 10.0000 16.0000 11.0000 14.0000 2.5696 1.8115 15.0000 20.0000 16.0000 19.0000 3.9868 2.3004 s= 15.0000 20.0000 16.0000 19.0000 3.9868 2.3004 cp = 1.0000 5.0000 1.0000 1.0000 -0.2050 0.6715 2.0000 25.0000 2.0000 5.0000 0.0254 -0.8108 6.0000 25.0000 6.0000 25.0000 0.0379 -0.5816 24.0000 125.0000 30.0000 75.0000 0.0534 -0.9481 120.0000 500.0000 150.0000 375.0000 0.0757 -0.4635 p= 120.0000 500.0000 150.0000 375.0000 0.0757 -0.4635 【例 2.2-4】向量的点击和叉积 10 (1) rng(50,'v5normal') a=randn(1,3),b=randn(1,3), c=dot(a,b) d=cross(a,b) a= 2.3846 -0.2998 0.7914 b= -1.7490 -1.7062 0.2231 c= -3.4826 d= 1.2835 -1.9162 -4.5930 (2) ab=[a;b]; dd(1)=det(ab(:,[2,3])); dd(2)=-det(ab(:,[1,3])); dd(3)=det(ab(:,[1,2])); dd dd = 1.2835 -1.9162 -4.5930 (3) plot3([0;a(1)],[0;a(2)],[0;a(3)],'b--','LineWidth',3) hold on plot3([0;b(1)],[0;b(1)],[0;b(3)],'g-.','LineWidth',3) plot3([0;d(1)],[0;d(2)],[0;d(3)],'r','LineWidth',3) hold off grid on box on view([131,-4]) legend('\bfa','\bfb','\bfd = {\bfa} {\times} {\bfb}') 1 a b d=ab 0 -1 -2 -3 -4 -5 4 2 0 -2 -1 0 图 2.2-2 三维空间中两根向量的叉积图示 11 2.3 高维数组 2.3.1 高维数组的创建 【例 2.3-1】“全下标”元素赋值方式创建高维数组演示。 (1) A(2,4,2)=1 A(:,:,1) = 0 0 0 0 0 0 0 0 A(:,:,2) = 0 0 0 0 0 0 0 1 (2) C=ones(2,3);C(:,:,2)=ones(2,3)*2;C(:,:,3)=ones(2,3)*3 C(:,:,1) = 1 1 1 1 1 1 C(:,:,2) = 2 2 2 2 2 2 C(:,:,3) = 3 3 3 3 3 3 (3) rng(1111) D=rand(2,4,3) DS=reshape(D,[2,6,2]) D(:,:,1) = 0.0955 0.3436 0.9250 0.3105 D(:,:,2) = 0.4955 0.1265 0.7844 0.6066 D(:,:,3) = 0.3838 0.6552 0.8384 0.1484 DS(:,:,1) = 0.0955 0.3436 0.9250 0.3105 DS(:,:,2) = 0.4661 0.4352 0.2371 0.2437 0.0020 0.2356 0.4661 0.2371 0.6391 0.6374 0.0020 0.2356 0.3838 0.8384 0.2378 0.7359 0.4352 0.2437 0.6109 0.9300 0.2378 0.7359 0.6552 0.1484 0.4955 0.7844 0.6391 0.6374 0.1265 0.6066 0.6109 0.9300 (4) E=eye(2,3); E3=repmat(E,[1,2,2]) E3(:,:,1) = 1 0 0 1 0 0 0 1 0 0 1 0 E3(:,:,2) = 1 0 0 1 0 0 0 1 0 0 1 0 2.3.2 高维数组的孤维删除 12 【例 2.3-2】本例演示:squeeze 指令对孤维的删除;shiftdim 指令的平移,及该指令对平移 数组中孤维的删除作用;“空阵”使维度的长度收缩,但维度数目不变。 (1) A=reshape(1:24,[1,3,4,1,2]); SA=size(A) B=squeeze(A) SA = 1 3 4 1 2 B(:,:,1) = 1 4 7 10 2 5 8 11 3 6 9 12 B(:,:,2) = 13 16 19 22 14 17 20 23 15 18 21 24 (2) [Am,m]=shiftdim(A) Am(:,:,1,1) = 1 4 7 10 2 5 8 11 3 6 9 12 Am(:,:,1,2) = 13 16 19 22 14 17 20 23 15 18 21 24 m= 1 (3) A3=shiftdim(Am,3) A3(:,:,1) = 1 2 3 13 14 15 A3(:,:,2) = 4 5 6 16 17 18 A3(:,:,3) = 7 8 9 19 20 21 A3(:,:,4) = 10 11 12 22 23 24 (4) Am(:,:,:,1)=[] Am = 13 16 19 22 14 17 20 23 15 18 21 24 2.3.3 高维数组的维度重排 【例 2.3-3】高维数组的维度重排。 (1) A=reshape(1:24,[2,4,3]) A(:,:,1) = 1 3 5 7 2 4 6 8 13 A(:,:,2) = 9 11 13 15 10 12 14 16 A(:,:,3) = 17 19 21 23 18 20 22 24 DimOrder=[3,2,1]; B=permute(A,DimOrder) AA=ipermute(B,DimOrder) B(:,:,1) = 1 3 5 7 9 11 13 15 17 19 21 23 B(:,:,2) = 2 4 6 8 10 12 14 16 18 20 22 24 AA(:,:,1) = 1 3 5 7 2 4 6 8 AA(:,:,2) = 9 11 13 15 10 12 14 16 AA(:,:,3) = 17 19 21 23 18 20 22 24 (4)多维数组的变形 C=reshape(A,[3,4,2]) C(:,:,1) = 1 4 7 10 2 5 8 11 3 6 9 12 C(:,:,2) = 13 16 19 22 14 17 20 23 15 18 21 24 2.4 “非数”和“空”数组 2.4.1 非数 NaN (1)非数的产生和性质 (2)非数的功用 【例 2.4-1】非数的产生和性质演示。 (1) a=0/0,b=0*log(0),c=inf-inf a= NaN b= NaN c= NaN (2) 0*a,sin(a) ans = 14 NaN ans = NaN (3) class(a) isnan(a) ans = double ans = 1 【例 2.4-2】非数元素的寻访。 (1) rng default R=rand(2,5);R(2,3)=NaN;R(1,5)=NaN R= 0.8147 0.1270 0.6324 0.2785 0.9058 0.9134 NaN 0.5469 NaN 0.9649 (2) LR=isnan(R) LR = 0 0 0 0 % <3> 0 0 1 1 0 0 (3) si=find(LR); % <4> [ri,ci]=ind2sub(size(R),si); % <5> disp('非数位置的单下标标识') disp(['第',int2str(si(1)),'和第',int2str(si(2)),'个元素']) disp(' ') disp('非数位置的双下标标识') disp(['第 ',mat2str([ri(1),ci(1)],2),' 元素']) disp(['第 ',mat2str([ri(2),ci(2)],2),' 元素']) 非数位置的单下标标识 第 6 和第 9 个元素 非数位置的双下标标识 第 [2 3] 元素 第 [1 5] 元素 (4)find 指令直接找“全下标” [rj,cj]=find(LR); disp('非数位置的双下标标识') disp(['第 ',mat2str([rj(1),cj(1)],2),' 元素']) disp(['第 ',mat2str([rj(2),cj(2)],2),' 元素']) 非数位置的双下标标识 第 [2 3] 元素 第 [1 5] 元素 2.4.2 “空”数组 【例 2.4-3】关于“空”数组的算例。 (1) a=[] b=ones(2,0),c=zeros(2,0),d=eye(2,0) f=rand(2,3,0,4) 15 a= [] b= Empty matrix: 2-by-0 c= Empty matrix: 2-by-0 d= Empty matrix: 2-by-0 f= Empty array: 2-by-3-by-0-by-4 (2) class(a) isnumeric(a) isempty(a) ans = double ans = 1 ans = 1 which a ndims(a) size(a) a is a variable. ans = 2 ans = 0 0 (3) A=reshape(-4:5,2,5) A= -4 -2 0 2 4 -3 -1 1 3 5 A(:,[2,4])=[] A= -4 0 4 -3 1 5 2.5 关系操作和逻辑操作 2.5.1 关系操作 【例 2.5-1】关系运算示例。 A=1:9,B=10-A r0=(A<4) r1=(A==B) A= 1 2 3 4 5 6 7 8 9 B= 9 8 7 6 5 4 3 2 1 r0 = 1 1 1 0 0 0 0 0 0 r1 = 0 0 0 0 1 0 0 0 0 【例 2.5-2】关系运算应用。 t=-3*pi:pi/10:3*pi; y=sin(t)./t; 16 tt=t+(t==0)*eps; yy=sin(tt)./tt; subplot(1,2,1),plot(t,y),axis([-9,9,-0.5,1.2]), xlabel('t'),ylabel('y'),title('残缺图形') subplot(1,2,2),plot(tt,yy),axis([-9,9,-0.5,1.2]) xlabel('tt'),ylabel('yy'),title('正确图形') 残缺图形 正确图形 y yy 1 1 0.8 0.8 0.6 0.6 0.4 0.4 0.2 0.2 0 0 -0.2 -0.2 -0.4 -0.4 -5 0 5 t -5 0 5 tt 图 2.5-1 采用近似极限处理前后的图形对照 2.5.2 逻辑操作 【例 2.5-3】逻辑操作和关系操作。 (1) A=[-2,-1,0,0,1,2,3] L1=~(A>1) L2=(A>0)&(A<2) A= -2 -1 0 0 1 2 3 L1 = 1 1 1 1 1 0 0 L2 = 0 0 0 0 1 0 0 (2) A,B=[0,-1,1,0,1,-2,-3] C=xor(A,B) A= -2 -1 0 0 B= 0 -1 1 0 C= 1 0 1 0 1 2 3 1 -2 -3 0 0 0 【例 2.5-4】试绘制如图 2.5-2 最下那幅子图所示的“正弦波 sin t 的削顶半波整流波形”, 削顶发生在每个周期的 [60 ,120 ] 之间。 17 clear,t=linspace(0,3*pi,500);y=sin(t); z1=((t2*pi)).*y; % <3> w=(t>pi/3&t<2*pi/3)+(t>7*pi/3&t<8*pi/3);% <4> wn=~w; % <5> z2=w*sin(pi/3)+wn.*z1; % <6> subplot(4,1,1),plot(t,y,':r'),axis([0,10,-1.5,1.5]) ylabel('y'),grid on subplot(4,1,2),plot(t,z1,':r'),axis([0,10,-0.2,1.5]),ylabel('z1') subplot(4,1,3),plot(t,wn,':r'),axis([0,10,-0.2,1.5]),ylabel('wn') subplot(4,1,4),plot(t,z2,'-b'),axis([0,10,-0.2,1.5]),ylabel('z2') xlabel('t') y z1 1 0 -1 0 1 2 3 4 5 6 7 8 9 10 1.5 1 0.5 0 0 1 2 3 4 5 6 7 8 9 10 1.5 1 0.5 0 0 1 2 3 4 5 6 7 8 9 10 1.5 1 0.5 0 0 1 2 3 4 5 6 7 8 9 10 t wn z2 2.5.3 图 2.5-2 逐段解析函数的产生 常用逻辑函数 18 第 3 章 字符串、胞元和构架数组 3.1 MATLAB 的数据类型 图 3.1-1 MATLAB 的数据类型 3.2 字符串数组 本节内容集中于字符串数组(以下简称串数组)。与数值数组相比,串数组在 MATLAB 中的重要性较小,但它不可缺少。假如没有串数组及相应的操作,那么数据可视化将会遇 到困难,构作 MATLAB 的宏指令也将会遇到困难。 既然字符串与数值是两种不同的数据类(Class),那么它们的创建方式也就不同。数 值变量是通过在指令窗中数字赋值创建的。而字符变量的创建方式是:在指令窗中,先把 待建的字符放在“单引号对”中,再按[Enter]键。注意,这“单引号对”必须在英文状态下 输入。这“单引号对”是 MATLAB 识别送来内容“身份”(是变量名、数字,还是字符串) 所必需的。 MATLAB 为数值数组设计了许多运算、函数和操作,但既没对串数组设计那么多运算, 也没设计那么多操作。然而正是这些串函数和串操作,为 MATLAB 的文字表达、复杂字符 的组织、宏功能的发挥提供了有力的支持。 3.2.1 串数组的属性和标识 【例 3.2-1】本例演示:串的基本属性、标识和简单操作。 (1) 1 a='This is an example.' a= This is an example. (2) size(a) ans = 1 19 (3) a14=a(1:4) ra=a(end:-1:1) a14 = This ra = .elpmaxe na si sihT (4) Ua=double(a) Ua = Columns 1 through 13 84 104 105 115 32 105 115 32 120 Columns 14 through 19 97 109 112 108 101 46 char(Ua) ans = This is an example. (5) w=find(a>='a'&a<='z'); Ua(w)=Ua(w)-32; char(Ua) ans = THIS IS AN EXAMPLE. (6) A='这是一个算例。'; A_s=size(A) A56=A([5 6]) UCA=double(A) A_s = 1 7 A56 = 算例 UCA = Columns 1 through 6 36825 26159 Column 7 12290 char(UCA) ans = 这是一个算例。 19968 20010 (7) b='Example ''3.2-1''' b= Example '3.2-1' (8) ab=[a(1:7),' ',b,' .']%这里第 2 个输入为空格串 97 110 31639 32 101 20363 2 ab = This is Example '3.2-1' . 3.2.2 复杂串数组的创建 1 多行字符串数组的创建 【例 3.2-2】演示:多行串数组的“补空等长”直接输入法;非等长串数组借助 char , str2mat , strvcat 等指令声称多行串数组。 (1) clear S=['This string array ' 'has multiple rows.'] size(S) S= This string array has multiple rows. ans = 2 18 (2) S1=char('This string array','has two rows.') size(S1) S1 = This string array has two rows. ans = 2 17 S2=str2mat('这','字符','串数组','','由 4 行组成') size(S2) S2 = 这 字符 串数组 由 4 行组成 ans = 5 5 S3=strvcat('这','字符','串数组','','由 4 行组成') size(S3) S3 = 这 字符 串数组 由 4 行组成 ans = 4 5 2 利用胞元数组创建复杂字符串 【例 3.2-3】胞元数组在存放和操作字符串上的应用。 (1) C1={'MATLAB201xa includes data types:'; '◆Double array'; '◆Character array'; 'and so on'} % <4> C1_c=class(C1) 3 size(C1) % <6> C1 = 'MATLAB201xa includes data types:' '◆Double array' '◆Character array' 'and so on' C1_c = cell ans = 4 1 (2)借助 cellstr 指令生成存放复杂字符串的胞元数组 C2=char('MATLAB201xa includes data types:',... '◆Double array',... '◆Character array',... 'and so on') % <10> C2_c=class(C2) size(C2) C2 = MATLAB201xa includes data types: ◆Double array ◆Character array and so on C2_c = char ans = 4 32 C3=cellstr(C2) size(C3) C3 = 'MATLAB201xa includes new data types:' '◆Double array' '◆Character array' 'and so on' ans = 4 1 3.2.3 串转换函数 【例 3.2-4】最常用的数组/字符串转换函数 int2str , num2str , mat2str 示例。 (1) A=eye(2,4); A_str1=int2str(A) A_str1 = 1000 0100 (2) rng(0,'v5uniform') B=rand(2,4); B3=num2str(B,3) B3 = 0.95 0.607 0.231 0.486 0.891 0.762 0.456 0.0185 (3) B_str=mat2str(B,4) B_str = 4 [0.9501 0.6068 0.8913 0.4565;0.2311 0.486 0.7621 0.0185] Expression=['exp(-',B_str,')']; eval(Expression) ans = 0.3867 0.5451 0.4101 0.6335 0.7937 0.6151 0.4667 0.9817 【例 3.2-5】fprintf, sprintf, sscanf 的用法示例。 rng(0,'v5uniform');a=rand(2,2); s1=num2str(a) s_s=sprintf('%.10e\n',a) s1 = 0.95013 0.60684 0.23114 0.48598 s_s = 9.5012928515e-001 2.3113851357e-001 6.0684258354e-001 4.8598246871e-001 fprintf('%.5g\\',a) 0.95013\0.23114\0.60684\0.48598\ s_str2=str2num(s_s) s_sscan=sscanf(s_s,'%f',[3,2]) s_str2 = 0.9501 0.2311 0.6068 0.4860 s_sscan = 0.9501 0.4860 0.2311 0 0.6068 0 【例 3.2-6】double, str2double, str2num 的异同。 (1) a='1e-3'; da=double(a) sda=str2double(a) sna=str2num(a) da = 49 101 45 51 sda = 1.0000e-003 sna = 1.0000e-003 (2) b='1,2;3,4'; db=double(b) sdb=str2double(b) snb=str2num(b) db = 49 44 50 59 51 44 52 sdb = NaN snb = 1 2 3 4 (3) 5 c='ab+cde'; dc=double(c) sdc=str2double(c) snc=str2num(c) dc = 97 98 43 sdc = NaN snc = [] 99 100 101 (4) d=sym('1/3'); dd=double(d) sdd=str2double(d) snd=str2num(d) dd = 0.3333 sdd = NaN ??? Error using ==> str2num at 33 Requires string or character array input. 【例 3.2-7】综合例题:在 MATLAB 计算生成的图形上标出图名和最大值点坐标。 clear a=2; w=3; t=0:0.01:10; y=exp(-a*t).*sin(w*t); [y_max,i_max]=max(y); t_text=['t=',num2str(t(i_max))]; % <7> y_text=['y=',num2str(y_max)]; % <8> max_text=char('maximum',t_text,y_text);% <9> % tit=['y=exp(-',num2str(a),'t)*sin(',num2str(w),'t)']; % <11> plot(t,zeros(size(t)),'k') hold on plot(t,y,'b') plot(t(i_max),y_max,'r.','MarkerSize',20) text(t(i_max)+0.3,y_max+0.05,max_text) % <16> title(tit),xlabel('t'),ylabel('y'),hold off y=exp(-2t)*sin(3t) 0.6 0.5 maximum t=0.33 y=0.4321 0.4 0.3 y 0.2 0.1 0 -0.1 0 1 2 3 4 5 6 7 8 9 10 t 图 3.1-1 字符串运用示意图 6 3.2.4 串操作函数 3.3 胞元数组 3.3.1 胞元数组的创建和显示 1 胞元标识寻访和内容编址寻访的不同 2 胞元数组的创建和显示 【例 3.3-1】本例演示: (2  2) 胞元数组的创建。 C_str=char('这是','胞元数组创建算例 1'); R=reshape(1:9,3,3); Cn=[1+2i]; S_sym=sym('sin(-3*t)*exp(-t)'); (1) A(1,1)={C_str};A(1,2)={R};A(2,1)={Cn};A(2,2)={S_sym}; A % <5> A= [2x10 char] [3x3 double] [1.0000 + 2.0000i] [1x1 sym ] (2) B{1,1}=C_str;B{1,2}=R;B{2,1}=Cn;B{2,2}=S_sym; celldisp(B) % <7> B{1,1} = 这是 胞元数组创建算例 1 B{2,1} = 1.0000 + 2.0000i B{1,2} = 1 4 7 2 5 8 3 6 9 B{2,2} = -sin(3*t)/exp(t) 3.3.2 胞元数组的扩充、收缩和重组 【例 3.3-2】胞元数组的扩充,及形象化图示胞元内容指令 cellplot。 (1) C=cell(2); C(:,1)={char('Another','text string');10:-1:1} C= [2x11 char ] [] [1x10 double] [] (2)胞元数组的“列”扩充和“行”扩充 AC=[A C] A_C=[A;C] AC = [2x10 char] [3x3 double] [2x11 char ] [] [1.0000 + 2.0000i] [1x1 sym ] [1x10 double] [] A_C = [2x10 char ] [3x3 double] 7 [1.0000 + 2.0000i] [2x11 char ] [1x10 double] cellplot(A_C,'legend') [1x1 sym ] [] [] 1+2i other structure sparse char double 图 3.3-1 胞元数组 A_C 的形象化结构图 【例 3.3-3】采用“空”对胞元数组进行收缩操作,采用 reshape 对胞元数组进行重组。 (1) A_C(3,:)=[] A_C = [2x10 char ] [3x3 double] [1.0000 + 2.0000i] [1x1 sym ] [1x10 double] [] (2) R_A_C=reshape(A_C,2,3) R_A_C = [2x10 char] [1.0000 + 2.0000i] [1x10 double] [3x3 double] [1x1 sym] [] 3.3.3 胞元数组内容的获取和配置 【例 3.3-4】本例演示:胞元和胞元内容获取的区别;花括号、圆括号的功用;多胞元内容 配置的 deal 指令法和直接配置法。 (1) f1=R_A_C(1,3) class(f1) f1 = [1x1 sym] ans = cell (2) f2=R_A_C{1,3} class(f2) f2 = sin(-3*t)*exp(-t) ans = sym 8 (3) f3=R_A_C{1,1}(:,[1 2 5 6]) f3 = 这是 胞元创建 (4) [f4,f5,f6]=deal(R_A_C{[1,3,4]}) f4 = 这是 胞元数组创建算例 1 f5 = 10 9 8 7 6 5 4 3 2 1 f6 = 1 4 7 2 5 8 3 6 9 (5) [ff4,ff5,ff6]=R_A_C{[1,3,4]} ff4 = 这是 胞元数组创建算例 1 ff5 = 10 9 8 7 6 5 4 3 2 1 ff6 = 1 4 7 2 5 8 3 6 9 3.3.4 胞元与数值数组之间的转换 【例 3.3-5】常用胞元数组转换函示例。 (1) rng(0,'v5uniform') A=rand(2,3) C1=num2cell(A) SC1=size(C1) A= 0.9501 0.6068 0.8913 0.2311 0.4860 0.7621 C1 = [0.9501] [0.6068] [0.8913] [0.2311] [0.4860] [0.7621] SC1 = 2 3 C2=num2cell(A,2) disp(['C2{1,:}=',mat2str(C2{1,:},4)]) SC2=size(C2) C2 = [1x3 double] [1x3 double] C2{1,:}=[0.9501 0.6068 0.8913] SC2 = 2 1 C3=num2cell(A,1) 9 SC3=size(C3) C3 = [2x1 double] SC3 = 1 3 [2x1 double] (2) x=zeros(4,5);x(:)=1:20 C4=mat2cell(x, [2 2], [3 2]) celldisp(C4) x= 1 5 9 13 17 2 6 10 14 18 3 7 11 15 19 4 8 12 16 20 C4 = [2x3 double] [2x2 double] [2x3 double] [2x2 double] C4{1,1} = 1 5 9 2 6 10 C4{2,1} = 3 7 11 4 8 12 C4{1,2} = 13 17 14 18 C4{2,2} = 15 19 16 20 [2x1 double] (3) D1=cell2mat(C4(1,:)) D2=[C4{1,1},C4{1,2}] D1 = 1 5 9 13 17 2 6 10 14 18 D2 = 1 5 9 13 17 2 6 10 14 18 3.3.5 对胞元数组运算的 cellfun 指令 【例 3.3-6】演示 cellfun 的两种调用格式。一致性输出调用格式的限制很严格,而非一致性 输出的调用格式适应性很强。 (1) rng(1) x(1)={1:10};x(2)={rand(100,1)}; xm=cellfun(@mean,x) class(xm) xm = 5.5000 0.4859 ans = double (2) y(1,1)={sym('[0,pi/6,pi/3,pi/2]')}; y(1,2)={0:pi/4:pi}; y(2,1)={rand(10000,3)}; 10 y(2,2)={[]}; B=cellfun(@(x)sin(x-pi/6).^2,y,'UniformOutput',false) B= [ 1x4 sym ] [1x5 double] [10000x3 double] [] B=cellfun(@mean,[y(1,1),y(1,2),y(2,1)],'UniformOutput',false); celldisp(B) B{1} = pi/4 B{2} = 1.5708 B{3} = 0.4986 0.5042 0.4977 C=cellfun(@mean,[y(1,2),y(2,1)]) ??? Error using ==> cellfun Non-scalar in Uniform output, at index 2, output 1. Set 'UniformOutput' to false. 3.3.6 胞元数组的操作函数汇总 3.4 构架数组 3.4.1 构架数组的创建和显示 1 直接创建法及显示 【例 3.4-1】本例通过温室数据(包括温室名、容积、温度、湿度等)演示:单构架的创建 和显示。 (1) GreenHouse.name='一号房'; % <1> GreenHouse.volume='2000 立方米'; %<2> GreenHouse.parameter.temperature=[31.2 30.4 31.6 28.7 29.7 31.1 30.9 29.6]; %<3> GreenHouse.parameter.humidity=[62.1 59.5 57.7 61.5 62.0 61.9 59.2 57.5]; %<4> (2) GreenHouse % <5> GreenHouse = name: '一号房' volume: '2000 立方米' parameter: [1x1 struct] GreenHouse.parameter % <6> ans = temperature: [2x4 double] humidity: [2x4 double] GreenHouse.parameter.temperature % <7> ans = 31.2000 30.4000 31.6000 28.7000 29.7000 31.1000 30.9000 29.6000 【例 3.4-2】本例演示:构架数组的创建和显示,并利用构架数组保存一个温室群的数据。 本例的运行以例 3.4-1 为先导。 11 (1) GreenHouse(2,3).name='六号房' GreenHouse = 2x3 struct array with fields: name volume parameter (2) GreenHouse(1,1) ans = name: '一号房' volume: '2000 立方米' parameter: [1x1 struct] % <1> % <3> 2 利用构造函数创建构架数组 【例 3.4-3】利用构造函数 struct,建立温室群的数据库。 (1) a=cell(2,3); gh1=struct('name',a,'volume',a,'parameter',a(1,2)) gh1 = 2x3 struct array with fields: name volume parameter % <2> (2) gh2=struct('name',a,'volume',[],'parameter',[]) gh2 = 2x3 struct array with fields: name volume parameter % <3> (3) gh3(2,3)=struct('name',[],'volume',[],'parameter',[]) gh3 = 2x3 struct array with fields: name volume parameter % <4> (4) a1={'六号房'};a2={'3200 立方米'}; gh4(2,3)=struct('name',a1,'volume',a2,'parameter',[]); % <6> T6=[31.2,30.4,31.6,28.7;29.7,31.1,30.9,29.6]; % <7> gh4(2,3).parameter.temperature=T6; % <8> green_house_4 green_house_4 = 2x3 struct array with fields: name volume parameter 3.4.2 构架数组域中内容的调取和设置 12 【例 3.4-4】本例演示:域名获知的 fieldnames 指令法和直接法;构架内容的 getfield 指令法 和直接法;构架内容重置的 setfield 指令法和直接法;构架内容的 deal 指令配置法和直接法, (1) clear A(1,1).name='Wang Pin-pin'; A(1,1).phonenumber=85436789; A(1,2).name={'Lin Beng-ming'};A(1,2).phonenumber=61125568; A(2,1).name='Zhang Qing';A(2,1).phonenumber=83492567; A(2,2).name(2)={'Yu Dong-jin'};A(2,2).phonenumber(2)=61125569; A(1,3).name={'Zhao Zhong-xin'};A(1,3).phonenumber=54681123; A(1,3).name(2)={'Mao Li-xiu'};A(1,3).phonenumber(2)=54681124; (2) disp('域名'),disp(fieldnames(A)) 域名 'name' 'phonenumber' disp('大小'),disp(size(A)) 大小 2 3 A A= 2x3 struct array with fields: name phonenumber (3) B1=getfield(A,{1,3},'name',{1:2}); disp(class(B1)),disp(B1) cell 'Zhao Zhong-xin' 'Mao Li-xiu' B2=A(1,3).name(1:2) disp(class(B2)) B2 = 'Zhao Zhong-xin' cell 'Mao Li-xiu' (4) [Bc1,Bc2]=deal(A(1,3).name(1:2)) disp(class(Bc1)) Bc1 = 'Zhao Zhong-xin' 'Mao Li-xiu' Bc2 = 'Zhao Zhong-xin' 'Mao Li-xiu' cell [Bn1,Bn2]=deal(A(1,3).name{1:2}) disp(class(Bn1)) Bn1 = Zhao Zhong-xin Bn2 = Mao Li-xiu char [Bm1,Bm2]=A(1,3).name{1:2} disp(class(Bm1)) Bm1 = Zhao Zhong-xin Bm2 = 13 Mao Li-xiu char (5) A=setfield(A,{1,3},'name',{1:2},{'兆中欣','茂利修'}); disp(A(1,3).name) '兆中欣' '茂利修' A(1,3).name(1:2)={'张三','李四'}; A(1,3).name ans = '张三' '李四' 3.4.3 构架数组的扩缩、域的增删和域名重排 【例 3.4-5】本例演示:构架数组 Stf 的扩充和收缩;域的增添;借助 orderfields 对构架域名 的先后次序进行重排;借助 rmfield 删除构架域名。 (1) gh.name='一号房' gh = name: '一号房' (2) gh(2,4).volume='1000 立方米'; gh(2,4).temperature=[33,32,29,31] gh = 2x4 struct array with fields: name volume temperature (3) ghr=orderfields(gh) ghr = 2x4 struct array with fields: name temperature volume (4) ghr(:,[2,3])=[ ] ghr = 2x2 struct array with fields: name temperature volume (5) ghr=rmfield(ghr,'name') ghr = 2x2 struct array with fields: temperature volume 3.4.4 构架数组和胞元数组之间的转换 【例 3.4-6】指令 struct2cell 和 cell2struct 的使用。 14 (1) for k=1:5 ex(k).s=['No.' int2str(k)]; ex(k).f=(k-1)*5+[1:5]; end (2) fprintf('%s\n','ex.s 域的内容 '); fprintf('%s',blanks(4)) for k=1:5 fprintf('%s\\',[ex(k).s blanks(1)]); end fprintf('%s\n',blanks(1)) fprintf('%s\n','ex.f 域的内容 ') for k=1:5 disp(ex(k).f); end ex.s 域的内容 No.1 \No.2 \No.3 \No.4 \No.5 \ ex.f 域的内容 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 (3) Cex=struct2cell(ex); size(Cex) fprintf('%s\n',[blanks(4),Cex{1,1,1}]) fprintf('%5g',Cex{2,1,1}) ans = 2 1 5 No.1 12345 (4) FS={'Schar';'Fnum'}; EX1=cell2struct(Cex,FS,1) EX1 = 1x5 struct array with fields: Schar Fnum EX1(1,3) ans = Schar: 'No.3' Fnum: [11 12 13 14 15] (5) EX2=cell2struct(Cex,'xx',2) EX2(1,1),EX2(2,1) EX2 = 2x5 struct array with fields: xx ans = xx: 'No.1' ans = xx: [1 2 3 4 5] (6) YY=strvcat('y1','y2','y3','y4','y5'); 15 EX3=cell2struct(Cex,YY,3) EX3 = 2x1 struct array with fields: y1 y2 y3 y4 y5 EX3(1,1) ans = y1: 'No.1' y2: 'No.2' y3: 'No.3' y4: 'No.4' y5: 'No.5' EX3(2,1) ans = y1: [1 2 3 4 5] y2: [6 7 8 9 10] y3: [11 12 13 14 15] y4: [16 17 18 19 20] y5: [21 22 23 24 25] 【例 3.4-7】带子域的构架数组转换为胞元数组。演示:子域的创建;不同元构架的相同域 名下,可以有不同的子域;在 struct2cell 作用下,子域将仍被当作单构架存放到新的胞元中。 (1) ex(1,1).s.sub='SUB 1'; ex(3,1).s.sub='SUB 3'; ex(3,1).s.num=1/3; ex fprintf('%s',['ex(1,1).s 的子域',blanks(4)]),disp(ex(1,1).s) fprintf('%s\n',['ex(3,1).s 的子域',blanks(4)]), disp(ex(3,1).s) ex = 3x5 struct array with fields: s f ex(1,1).s 的子域 sub: 'SUB 1' ex(3,1).s 的子域 sub: 'SUB 3' num: 0.3333 (2) Cexsub=struct2cell(ex); size(Cexsub) C111=Cexsub{1,1,1} class(C111) C131=Cexsub{1,3,1} ans = 2 3 5 C111 = sub: 'SUB 1' ans = struct C131 = sub: 'SUB 3' num: 0.3333 3.4.5 对构架域运算的 structfun 和 arrayfun 指令 【例 3.4-8】本例演示: structfun 和 arrayfun 的调用格式;structfun 和 arrayfun 应用方式的差 16 异。 (1) clear,rng(0,'v5uniform') T.M1(1,:)=3*rand(1,31)+3;T.M2(1,:)=rand(1,28)-0.5; T.M3(1,:)=4*rand(1,31)+4; T.M1(2,:)=3*rand(1,31)+6;T.M2(2,:)=3*rand(1,28)-0.5; T.M3(2,:)=9*rand(1,31)+5; S.M1='January';S.M2='February';S.M3='March'; T,S T= M1: [2x31 double] M2: [2x28 double] M3: [2x31 double] S= M1: 'January' M2: 'February' M3: 'March' (2) At=structfun(@(x)mean(mean(x)),T) class(At) At = 5.9214 0.6013 7.4110 ans = double (3) As=structfun(@(x)x(1:3),S,'UniformOutput',0); class(As) ans = struct disp(['每月平均温度',blanks(3),As.M1,blanks(3),As.M2,blanks(3),As.M3]) disp([blanks(12),mat2str(At',3)]) 每月平均温度 Jan Feb Mar [5.92 0.601 7.41] (4) T(2).M2=5*rand(3,28)+60 B28=arrayfun(@(x)mean(x.M2),T,'UniformOutput',false) class(B28) B2=arrayfun(@(x)mean(mean(x.M2)),T,'UniformOutput',false) T= 1x2 struct array with fields: M1 M2 M3 B28 = [1x28 double] [1x28 double] ans = cell B2 = [0.6013] [62.6611] 3.4.6 构架数组的操作函数汇总 17 第 4 章 数值计算 科研和工程计算可分为数值计算和符号计算两类。数值计算具有适应性强、应用广泛 的优点。MATLAB 凭借其卓越的数值计算能力而称雄世界。随着科研领域、工程实践的数 字化进程的深入,具有数字化本质的数值计算显得愈益重要。 今天计算机几乎已经普及到每个从事工程和科研的从业人员,普及到每个正在接受理 工科培养的学生。计算机软硬件的普及使人们拥有了前所未有的计算潜能,激发了人们质 疑旧方法尝试新算法的欲望,鼓舞了人们用新计算能力试探解决实际问题的雄心。 本章内容显著不同于常见的数值计算教科书。本章的讨论围绕 MATLAB 数值计算资源 的正确使用展开。在“最低限度自封闭”的原则下,本章以最简明的方式阐述理论数学、 数值数学和 MATLAB 计算指令之间的内在联系及区别,并尽可能勾画清问题的来龙去脉, 以帮助读者克服由于知识跳跃和交叉引起的困惑。 本章的阐述从数值计算的离散数体系开始,此后各节分别涉及:微积分、矩阵和代数 方程、随机数发生和统计、多项式运算和卷积、拟合和最小二乘、插值和样条、Fourier 分 析、微分方程、和优化计算等。 与本书的旧版本相比,本章在拓宽内容覆盖面和加强内容纵深性两方面都做出了较大 努力,如本章新增了随机数的重现及非重现控制、高阶统计、全域寻优等节次。 顺便提醒:随书光盘 mbook 目录下的“ch04_数值计算.doc”文件,保存有该章算例的 所有彩色图形;mfile 目录上则保存着所有算例中带 exm 前缀文件名的 M 文件、MAT 数据 文件、MDL 块图模型文件的电子文档。 4.1 MATLAB 的浮点数体系 4.2 数值微积分 4.2.1 数值极限 【例 4.2-1】设 f1 ( x)  1 cos 2x 2x sin x , f2 ( x)  sin x x ,由分析知 lim x0 f1 ( x)  lim x0 f2 (x) 1。 试用数值法求这两个函数的极限 lim x0 f1 ( x) , lim x0 f2(x) 。 (1) k=logspace(0,14,15); x=k*eps; f1=(1-cos(2.*x))./x./sin(x)/2; f2=sin(x)./x; format short e disp([blanks(7),'x',blanks(11),'f1',blanks(11),'f2']) disp([x',f1',f2']) clf n1=sum(f1<10^-10); subplot(2,1,1) semilogx(x(1:n1),f1(1:n1),'ro','LineWidth',3) hold on semilogx(x(n1+1:end),f1(n1+1:end),'b.-','LineWidth',3) hold off text(10^-14,0.2,'错误区段'),text(10^-6,0.8,'正确区段') axis([10^-20,1,0,1.1]) 1 grid on title('f2') subplot(2,1,2) semilogx(x,f2,'b.-','LineWidth',3) axis([10^-20,1,0,1.1]) title('f1') xlabel('x') grid on shg x f1 f2 2.2204e-016 0 1.0000e+000 2.2204e-015 0 1.0000e+000 2.2204e-014 0 1.0000e+000 2.2204e-013 0 1.0000e+000 2.2204e-012 0 1.0000e+000 2.2204e-011 0 1.0000e+000 2.2204e-010 0 1.0000e+000 2.2204e-009 0 1.0000e+000 2.2204e-008 1.0133e+000 1.0000e+000 2.2204e-007 9.9980e-001 1.0000e+000 2.2204e-006 1.0000e+000 1.0000e+000 2.2204e-005 1.0000e+000 1.0000e+000 2.2204e-004 1.0000e+000 1.0000e+000 2.2204e-003 1.0000e+000 1.0000e+000 2.2204e-002 9.9992e-001 9.9992e-001 f2 1 0.8 正确区段 0.6 0.4 0.2 错误区段 0 -20 -15 -10 -5 0 10 10 10 10 10 f1 1 0.8 0.6 0.4 0.2 0 -20 -15 -10 -5 0 10 10 10 10 10 x 图 4.2-1 自变量大小对数值近似极限正确性的影响 (2) syms t fs1=(1-cos(2*t))/(t*sin(t))/2; fs2=sin(t)/t; Ls1=limit(fs1,t,0) Ls2=limit(fs2,t,0) Ls1 = 1 Ls2 = 1 2 4.2.2 数值差分 【例 4.2-2】在区间 [0,3]内,计算函数 f  4  (x  2)2 的两点前向差分和内点中心差分,并 绘制相应的图形(图 4.2-2)。 clf h=0.5; x=0:h:3; f=4-(x-2).^2; df=diff(f); gf=gradient(f); subplot(2,1,1) hold on plot(x,f,'r.-') x1=x(1:end-1); plot(x1,df,'bo-') legend('f','df') text(1,3.4,'f3'),text(1.5,4.2,'f4') text(1.05,1.1,'df3=f4 - f3') axis([-1,4,-2,5]) xlabel('x') box on hold off subplot(2,1,2) hold on plot(x,f,'r.-') plot(x1,df,'bo-') plot(x,gf,'k*-') legend('f','df','gf') text(0,-0.5,'f1'),text(2.9,2.4,'f7') text(-0.45,2.2,'gf1=f2 - f1'),text(3,-0.3,'gf7=f7 - f6') text(0.5,2.3,'f2'),text(1.5,4.2,'f4') text(1.05,1.3,'gf3=(f4 - f2) /2') axis([-1,4,-2,5]) xlabel('x') box on hold off shg 3 图 4.2-2 前向差分(绿线)和中心差分(红线)比较图 4.2.3 数值积分(Numerical Integration) 1. 一元函数积分(Quadrature) 【例 4.2-3】以 y(t)  cos 1 为被积函数,在 0.2  t  0.3 区间,使用 quad 指令计算积分 at 2 0.3  G  y(t)dt 。被积函数中的 a 是可调参数。 0.2 (1) clear format long a=1.5; y1=@(t)cos(1./(a*t.^2)); % <4> S1=quad(y1,0.2,0.3) S1 = -0.020233343050626 (2) y2=@(t)exm040203_chirp(t,a); S2=quad(y2,0.2,0.3) S2 = -0.020233343050626 (3) y3=inline('cos(1./(a*t.^2))','t','a'); % <8> S3=quad(y3,0.2,0.3,[],[],a) S3 = -0.020233343050626 4 (4) y4=@exm040203_chirp; S4=quad(y4,0.2,0.3,[ ],[ ],a) S4 = -0.020233343050626 (5) S5=quad('exm040203_chirp',0.2,0.3,[ ],[ ],a) S5 = -0.020233343050626 (6) y6='cos(1./(a*t.^2))'; S6=quad(y6,0.2,0.3,[ ],[ ],a) S6 = -0.022369509291986 【例 4.2-4】求曲线 f1(x)  (1) format long f1=@(x)sqrt(x); f2=@(x)x.^3; s1=quad(f1,0,1); s2=quad(f2,0,1); S=s1-s2 S= 0.41665956927202 x 与 f2 (x)  x3 所夹区域的面积。 % <3> (2)利用 quadv 指令计算 f=@(x)[sqrt(x),x.^3]; s=quadv(f,0,1); Sv=s(1)-s(2) Sv = 0.41665956927202  【例 4.2-5】求积分 s   y(x)dx ,其中 y  sin(x) 。 0 x (1) format long x1=linspace(0,pi,100); x1(1)=realmin; % <3> y1=sin(x1)./x1; S_t1=trapz(x1,y1), S_t1 = 1.85191034030911 (2) x2=linspace(0,pi,200); x2(1)=realmin; y2=sin(x2)./x2; S_t2=trapz(x2,y2) E_t1=abs(S_t2-S_t1) % <9> S_t2 = 1.85193044104299 E_t1 = 2.010073387803679e-005 5 % <6> % <7> (3) ys=@(x)(sin(x)./x); % <10> S_simposon=quad(ys,0,pi,1e-7) Warning: Divide by zero. > In @(x)(sin(x)./x) In quad at 63 S_simposon = 1.85193705268094 (4) syms x S_sym=vpa(int(sin(x)/x,0,pi)) S_sym = 1.8519370519824661703610533701580 2. 样条法求一元数值积分  【例 4.2-6】运用样条函数求积分 s   y(x)dx ,其中 y  sin(x) 。 0 x xx=0:0.01:pi; xx(1)=realmin; ff=sin(xx)./xx; pp=spline(xx,ff); int_pp=fnint(pp); format long Sw=ppval(int_pp,[0,pi]) S_sp=Sw(2)-Sw(1) E_S_sp=abs(S_sym-S_sp) Sw = -0.00000000000000 1.85193705198084 S_sp = 1.85193705198084 E_S_sp = .16310342830681444470e-11 3. 用 SIMULINK 求一元数值积分  【例 4.2-7】运用 SIMULINK 求积分 s   y(x)dx ,其中 y  sin(x) 。 0 x (1) (2) 图 4.2-3 解题模型 exm040207.mdl 和解算结果 (3) format long S_simulink=simout(end) E_simulink=abs(S_sym-S_simulink) S_simulink = 1.851937051983002 E_simulink = 6 .5356769717903110573e-12 4.2.4 多重数值积分 1. 常限重积分     【例 4.2-8】计算 Sx01  2 1  1 0 x y dxdy 和 S x1 2  1 0 2 1 x y dxdy 。 (1) syms x y ssx01=vpa(int(int(x^y,x,0,1),y,1,2)) ssx12=vpa(int(int(x^y,x,1,2),y,0,1)) ssx01 = .40546510810816438197801311546432 ssx12 = 1.2292741343616127837489278679215+0.*i (2) zz=inline('x.^y','x','y'); nsx01=dblquad(zz,0,1,1,2) nsx12=dblquad(zz,1,2,0,1) nsx01 = 0.4055 nsx12 = 1.2293 〖说明〗  nsx01=dblquad(@(x,y)x.^y,0,1,1,2) nsx01=dblquad('x.^y',0,1,1,2) nsx01=dblquad(inline('x.^y'),0,1,1,2) 2. 变限重积分   【例 4.2-9】计算抛物截柱(见图 4.2-4)的体积 I  4 1  2 y (x2  y 2 )dxdy 。 (1) clf,clear %---------- xa=1;xb=2;ya=1;yb=4; x=(xa-0.5):0.01:(xb+0.5); y=(ya-0.5):0.01:(yb+0.5); [X,Y]=meshgrid(x,y); Z=X.^2+Y.^2; M=(Yyb)|(Xxb); Z(M)=0; surf(X,Y,Z), hold on %------------ x0=x(1):0.5:x(end); yi=2; y0=yi*ones(size(x0)); [X0,Y0]=meshgrid(x0,y0); [n0,m0]=size(X0); 7 zup=xb^2+yi^2; z0=linspace(0,zup,n0)'; Z0=repmat(z0,1,m0); surf(X0,Y0,Z0) %------------shading interp xlabel('x'),ylabel('y') light('position',[0,0,5]) light('position',[0,5,26]) material metal lighting gouraud colormap(jet) title('待求体积的抛物截柱') text(2.5,1.9,9,'\fontsize{14}y=yi=2') axis([0.5,2.5,0.5,4.5,0,20]) box on view([-55,40]) shg 图 4.2-4 待求体积的抛物截柱及其 yi=2 截面 (2) Ssym=vpa(int(int('x^2+y^2','x','sqrt(y)',2),'y',1,4)) Ssym = 9.5809523809523809523809523809524 (3) format long gxy=@(x,y)(x.^2+y.^2); ingy=@(y)sqrt(y); [Sq,Eb]=quad2d(gxy,1,4,ingy,2) Sq = 9.580952380956605 Eb = 7.393502957048358e-010 4.3 矩阵分析 4.3.1 矩阵运算和特征参数 8 1. 矩阵运算 【例 4.3-1】观察矩阵的转置操作和数组转置操作的差别。 format rat A=magic(2)+j*pascal(2) A= 1 + 1i 3 + 1i 4 + 1i 2 + 2i A1=A' A2=A.' A1 = 1 3 A2 = 1 3 - 1i - 1i + 1i + 1i 4 - 1i 2 - 2i 4 + 1i 2 + 2i B1=A*A' B2=A.*A' C1=A*A.' C2=A.*A.' B1 = 12 13 13 + 1i 25 B2 = 2 13 13 - 1i 8 C1 = 8 + 8i 7 7 + 13i 15 C2 = 0 + 2i 11 11 + 7i 0 2. 矩阵的标量特征参数 - 1i + 1i + 13i + 16i + 7i + 8i 【例 4.3-2】矩阵标量特征参数计算示例。 A=reshape(1:9,3,3) r=rank(A) d3=det(A) d2=det(A(1:2,1:2)) t=trace(A) A= 1 4 7 2 5 8 3 6 9 r= 2 d3 = 0 d2 = -3 t= 15 4.3.2 奇异值分解和矩阵结构 9 1. 奇异值分解 【例 4.3-3】对光盘数据文件 exm040303_data.mat 中的矩阵 A65 进行奇异值分解,研究在不 同意义上的数值秩。 (1) load exm040303_data (2) format short g [U,S,V]=svd(A) U= -0.4137 -0.61551 0.18582 0.48785 -0.12281 -0.40299 S= 3 0 0 0 0 0 V= -0.34727 -0.45724 -0.74906 0.3276 -0.043812 0.61781 -0.030071 0.028984 -0.17762 -0.3335 -0.68832 0.34716 -0.046012 -0.70798 0.60197 0.068392 0.095326 0.097102 -0.54145 -0.16596 -0.29915 -0.5987 0.47109 0.37765 0.16137 0.6295 0.50782 -0.24182 0.34455 0.41785 -0.54673 0.19896 -0.14396 0.67238 0.11867 0 0 0 0 0.5 0 0 0 0 0.14 0 0 0 0 0.002 0 0 0 0 1e-005 0 0 0 0 0.44684 -0.32954 -0.33534 -0.75955 -0.048657 -0.52599 -0.42741 0.33582 -0.30919 0.57644 -0.63379 0.33658 -0.07806 -0.45079 -0.52509 0.037052 -0.62158 0.45562 0.13021 -0.62267 (3) s=diag(S); n=length(s); plot(1:n,s,'-k',1:n,s,'.k','MarkerSize',20) xlabel('1---->n') ylabel('Sigular values') title('Sigular values of matrix A') Sigular values of matrix A 3 2.5 Sigular values 2 1.5 1 0.5 0 1 1.5 2 2.5 3 3.5 4 4.5 5 1---->n 图 4.3-1 矩阵 A 的奇异值分布图 (4) A_rank0=rank(A) A_null0=null(A) A_rank0 = 10 5 A_null0 = Empty matrix: 5-by-0 (5) dw=0.001; A_rank_noise=rank(A,3*dw*S(1,1)*length(A)) A_rank_noise = 3 (6) Ar=U(:,1:A_rank_noise)*diag(s(1:A_rank_noise))*V(:,1:A_rank_noise)' df=S(4,4)^2+S(5,5)^2 ds=sqrt(df) da=max(max(abs(A-Ar))) Ar = 0.54347 0.44492 0.84239 -0.65624 0.06736 0.63792 0.85202 1.386 -0.59151 0.077918 -0.13498 -0.21731 -0.45571 0.20226 -0.082263 -0.59226 -0.67595 -1.0382 0.52085 -0.011219 0.048393 0.21932 0.3351 0.0030023 0.029774 0.25903 0.6605 1.0255 -0.13877 0.077405 df = 4.0001e-006 ds = 0.002 da = 0.00075881 2. 与奇异值相关的矩阵结构 4.4 特征值分解和矩阵函数 4.4.1 特征值分解问题 【例 4.4-1】简单实阵的特征值分解及特征值阵的“复/实转换”。 A=[1,-3;2,2/3]; [V,D]=eig(A) [VR,DR]=cdf2rdf(V,D) V= 0.7746 0.7746 0.043033 - 0.63099i 0.043033 + 0.63099i D= 0.83333 + 2.4438i 0 0 0.83333 - 2.4438i VR = 0.7746 0 0.043033 -0.63099 DR = 0.83333 2.4438 -2.4438 0.83333 【例 4.4-2】矩阵的 Jordan 分解。 format short g A=gallery(5) [V,D,c_eig]=condeig(A); [VJ,DJ]=jordan(A); 11 D,c_eig,DJ A= -9 11 -21 63 -252 70 -69 141 -421 1684 -575 575 -1149 3451 -13801 3891 -3891 7782 -23345 93365 1024 -1024 2048 -6144 24572 D= -0.0408 0 0 0 0 0 -0.0119+0.0386i 0 0 0 0 0 -0.0119-0.0386i 0 0 0 0 0 0.0323+0.0230i 0 0 0 0 0 0.0323-0.0230i c_eig = 2.1969e+010 2.1468e+010 2.1468e+010 2.0688e+010 2.0688e+010 DJ = 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 4.4.2 矩阵的谱分解和矩阵函数 【例 4.4-3】数组乘方与矩阵乘方的比较。 clear,A=[1 2 3;4 5 6;7 8 9]; A_Ap=A.^0.3 A_Mp=A^0.3 A_Ap = 1 1.2311 1.3904 1.5157 1.6207 1.7118 1.7928 1.8661 1.9332 A_Mp = 0.69621 + 0.60322i 0.43582 + 0.16364i 0.63251 + 0.066583i 0.73087 + 0.018084i 0.56883 - 0.47003i 1.0259 - 0.12752i 0.17546 - 0.27592i 0.8292 - 0.03047i 1.483 + 0.21501i 【例 4.4-4】标量的数组乘方和矩阵乘方的比较。(A 取自例 4.2-4) pA_A=(0.3).^A pA_M=(0.3)^A pA_A = 0.3 0.09 0.027 0.0081 0.00243 0.000729 0.0002187 6.561e-005 1.9683e-005 pA_M = 2.9342 0.41746 -1.0993 -0.027814 0.74955 -0.47309 -1.9898 -0.91836 1.1531 【例 4.4-5】sin 的数组运算和矩阵运算比较。(A 取自例 4.2-4) A_sinA=sin(A) A_sinM=funm(A,'sin') A_sinA = 0.84147 0.9093 0.14112 -0.7568 -0.95892 -0.27942 12 0.65699 A_sinM = -0.69279 -0.17243 0.34793 0.98936 -0.23059 -0.14335 -0.056116 4.5 解线性方程 0.41212 0.23161 -0.11427 -0.46016 4.5.1 求解线性方程的相关指令 4.5.2 线性方程矩阵除解法 【例 4.5-1】“求逆”法和“左除”法解恰定方程的性能对比 (1) rng(0,'v5normal') A=gallery('randsvd',100,2e13,2); x=ones(100,1); b=A*x; cond(A) ans = 1.9990e+013 (2) tic xi=inv(A)*b; ti=toc eri=norm(x-xi,inf) rei=norm(A*xi-b,inf) ti = 0.0018 eri = 0.0143 rei = 0.0092 (3) tic;xd=A\b;td=toc erd=norm(x-xd,inf) red=norm(A*xd-b,inf) td = 9.0682e-004 erd = 0.0125 red = 9.1038e-015 4.5.3 线性二乘问题的解 【例 4.5-2】对于超定方程 y  Ax ,进行三种解法比较。其中 A 取 MATLAB 库中的特殊函 数生成。 (1) A=gallery(5);A(:,1)=[]; y=[1.7 7.5 6.3 0.83 -0.082]'; 13 x=inv(A'*A)*A'*y xx=pinv(A)*y xxx=A\y Warning: Matrix is close to singular or badly scaled. Results may be inaccurate. RCOND = 1.710726e-018. x= 3.3897 5.7774 -3.2803 -1.1605 xx = 3.4759 5.1948 0.7121 -0.1101 Warning: Rank deficient, rank = 3, tol = 1.0829e-010. xxx = 3.4605 5.2987 0 -0.2974 (2) nx=norm(x) nxx=norm(xx) nxxx=norm(xxx) nx = 7.5482 nxx = 6.2918 nxxx = 6.3356 (3) e=norm(y-A*x) ee=norm(y-A*xx) eee=norm(y-A*xxx) e= 1.2678 ee = 0.0474 eee = 0.0474 4.5.4 一般代数方程的解 【例 4.5-3】求 f (t)  (sin2 t)  e0.1t  0.5 t 的零点。 (1) S=solve('sin(t)^2*exp(-0.1*t)-0.5*abs(t)','t') S= 0. (2) YC=@(t)(sin(t).^2.*exp(-0.1*t)-0.5*abs(t)); (3) t=-10:0.01:10; Y=YC(t); 14 clf, plot(t,Y,'r'); hold on plot(t,zeros(size(t)),'k'); xlabel('t');ylabel('y(t)') hold off 图 4.5-1 函数零点分布观察图 (4) zoom on [tt,yy]=ginput(5);zoom off 图 4.5-2 局部放大和利用鼠标取值图 tt tt = -2.0039 -0.5184 -0.0042 0.6052 1.6717 (5) [t4,y4]=fzero(YC,0.1) t4 = 0.5993 y4 = 1.1102e-016 4.6 随机变量的产生及其特征描述 15 4.6.1 随机数的产生及重现控制 1. 默认全局随机流的简明管理指令 2. 三种基本随机数发生指令 【例 4.6-1】本例演示:三条随机数基本发生指令 rand, randn, randi 的调用格式;三种随机数 的产生都依赖全局随机流;任何随机数发生指令的运行,都将影响其它随机数发生指令的 运行结果;如何利用 rng 指令恢复默认全局随机流初始态;如何获取当前随机发生器的属性 数据;如何利用构架属性数据重置随机数发生器。 (1) rng default r1=rand(1,3) r2=randn(1,4) r3=randi([-8,8],3,10) r1 = 0.8147 0.9058 0.1270 r2 = 0.8622 0.3188 -1.3077 -0.4336 r3 = 1 -6 0 -1 8 6 4 3 -8 -7 8 8 5 7 3 7 4 -6 -4 5 8 8 -6 5 -8 3 -2 4 -8 3 (2) s=rng %<5> r2=rand(1,4) %<6> rr2=rand(1,4) % s= Type: 'twister' Seed: 0 State: [625x1 uint32] r2 = 0.3171 0.9502 0.0344 rr2 = 0.3816 0.7655 0.7952 <7> 0.4387 0.1869 rng(s) %<8> ss=rng % all(ss.State==s.State) % r3=rand(1,4) % %<11> rn=randn(1,2) %<12> rr3=rand(1,4) % % %<13> ss = Type: 'twister' Seed: 0 State: [625x1 uint32] ans = 1 r3 = 0.3171 0.9502 0.0344 rn = -0.2414 0.3192 rr3 = 0.7952 0.1869 0.4898 0.4387 0.4456 16 〖说明〗 3. 用户随机流的创建和使用 【例 4.6-2】本例演示:rng 指令生成全局的用户随机流;RandStream 指令生成孤立(或全 局 ) 的 用 户 随 机 流 ; 不 同 发 生 器 所 产 生 随 机 数 的 独 立 性 ; rng(0,'combRecursive') 和 RS=RandStream('mrg32k3a','Seed',0)产生的随机流之间的对应关系;reset 如何使用户随机流 恢复初始状态;如何用 RandStream.setGlobalStream 把用户随机流设置为全局随机流。 (1) clear rng default;rng %<2> a1=rand(1,5) %<3> aa1=randn(10000,1); %<4> rng(0,'combRecursive') %<5> rng %<6> a2=rand(1,5) %<7> aa2=randn(10000,1); %<8> C12=corrcoef([aa1,aa2]) %<9> ans = Type: 'twister' Seed: 0 State: [625x1 uint32] a1 = 0.8147 0.9058 0.1270 ans = Type: 'combRecursive' Seed: 0 State: [12x1 uint32] a2 = 0.7270 0.4522 0.9387 C12 = 1.0000 0.0112 0.0112 1.0000 0.9134 0.2360 (2) rng default % c1=rand(1,5) %<11> RS=RandStream('mrg32k3a','Seed',0) %<12> c2=rand(RS,1,5) %<13> cc2=randn(RS,10000,1); %<14> cc1=randn(10000,1); %<15> F=all(aa1==cc1) % G=any(aa2~=cc2) %<17> c1 = 0.8147 0.9058 0.1270 0.9134 RS = mrg32k3a random stream Seed: 0 NormalTransform: Ziggurat c2 = 0.7270 0.4522 0.9387 0.2360 F= 1 G= 0 0.6324 0.0277 0.6324 0.0277 17 (3) reset(RS) %<18> RandStream.setGlobalStream(RS)%<19> RandStream.getGlobalStream d2=rand(1,5) %<21> dd2=randn(10000,1); %<22> H=all(dd2==cc2) % ans = mrg32k3a random stream (current global stream) Seed: 0 NormalTransform: Ziggurat d2 = 0.7270 0.4522 0.9387 0.2360 0.0277 H= 1 〖说明〗 4. 随机流的重现控制 【例 4.6-3】本例演示:重现控制的种子法和状态法;随机流句柄的操作。 (1) rng(0) %<1> a1=rand(1,5) % randn(327,286); % rng('default') %<4> aa1=rand(1,5) % a1 = 0.8147 0.9058 0.1270 0.9134 0.6324 aa1 = 0.8147 0.9058 0.1270 0.9134 0.6324 (2) sd=3; % rng(sd, 'v4') % b1=rand(1,5) % b2=randn(1,5) % rand(200,17); % rng(sd, 'v4') % bb1=rand(1,5) % bb2=randn(1,5) % b1 = 0.5387 0.3815 b2 = -0.8640 -0.2603 bb1 = 0.5387 0.3815 bb2 = -0.8640 -0.2603 0.0512 -0.8944 0.0512 -0.8944 0.2851 -1.9727 0.2851 -1.9727 0.3010 -1.2650 0.3010 -1.2650 (3) sd=3; RS=RandStream('mcg16807', 'Seed', sd); c1=rand(RS,1,5) % c2=randn(RS,1,5) % for kk=1:10 rand(RS,kk,kk); end reset(RS); cc1=rand(RS,1,5) cc2=randn(RS,1,5) 18 c1 = 0.5387 c2 = -0.8640 cc1 = 0.5387 cc2 = -0.8640 0.3815 -0.2603 0.3815 -0.2603 0.0512 -0.8944 0.0512 -0.8944 0.2851 -1.9727 0.2851 -1.9727 (4) rng default %<23> GS0=rng %<24> class(GS0) %<25> rand(17,19);randn(33,25); % GS1=rng; % all(GS0.State==GS1.State) % d1=randn(1,5) % rand(23,41); % rng(GS1); % dd1=randn(1,5) % GS0 = Type: 'twister' Seed: 0 State: [625x1 uint32] ans = struct ans = 0 d1 = -0.1348 -0.0183 0.4608 1.3623 dd1 = -0.1348 -0.0183 0.4608 1.3623 (5) RS=RandStream('shr3cong') %<33> class(RS) %<34> rand(RS,77,88); % OS=get(RS,'State'); %<36> e1=rand(RS,1,5) % rand(RS,13,14); % set(RS,'State',OS) %<39> ee1=rand(RS,1,5) % RS = shr3cong random stream Seed: 0 NormalTransform: Ziggurat ans = RandStream e1 = 0.4387 0.3689 0.9769 0.9371 ee1 = 0.4387 0.3689 0.9769 0.9371 〖说明〗 0.3010 -1.2650 0.3010 -1.2650 0.4519 0.4519 0.6036 0.6036 5. 独立随机数序列和随机流的产生 【例 4.6-4】本例演示:从不同层次上创建独立同分布随机数组、随机序列、随机流的六种 方法;借助 corrcoef 指令检验随机序列的独立性;借助频数直方图检查随机序列的分布性质。 (1) 19 rng(2) % N=10000; a=randn(N+2,1); A=[a(1:N),a(2:N+1),a(3:N+2)]; % A(1:4,:) CA=cov(A) % nh=7*log10(N); % % subplot(1,3,1),histfit(A(:,1),nh),title('A(:,1)') subplot(1,3,2),histfit(A(:,2),nh),title('A(:,2)') subplot(1,3,3),histfit(A(:,3),nh),title('A(:,3)') ans = -0.1242 -2.5415 0.2772 -2.5415 0.2772 -0.1960 0.2772 -0.1960 -0.1962 -0.1960 -0.1962 -0.3057 CA = 1.0254 -0.0095 -0.0024 -0.0095 1.0254 -0.0095 -0.0024 -0.0095 1.0250 1400 A(:,1) 1400 A(:,2) 1400 A(:,3) 1200 1200 1200 1000 1000 1000 800 800 800 600 600 600 400 400 400 200 200 200 0 0 0 -5 0 5 -5 0 5 -5 0 5 图 4.6-1 A 数组三列元素的频数直方图 (2) clear rng(5) N=10000; A=rand(N,3); B=randn(N,3); C=randi([-5,5],N,3); rA=corrcoef(A) rB=corrcoef(B) rC=corrcoef(C) RAB=corrcoef(A(:),B(:)) RAC=corrcoef(A,C) rA = 1.0000 -0.0037 -0.0038 -0.0037 1.0000 -0.0060 -0.0038 -0.0060 1.0000 rB = 1.0000 -0.0084 0.0233 -0.0084 1.0000 0.0060 0.0233 0.0060 1.0000 rC = 1.0000 -0.0108 0.0174 -0.0108 1.0000 0.0043 0.0174 0.0043 1.0000 RAB = 1.0000 0.0017 0.0017 1.0000 RAC = 1.0000 0.0075 20 0.0075 1.0000 (3) clear N=10000; rng(17) a=randn(1,5) A=rand(N,3); RS=RandStream.getGlobalStream; reset(RS) RS.NormalTransform='Polar'; b=randn(1,5) B=randn(N,3); CAB=corrcoef([A,B]) a= -0.3951 0.1406 -1.5172 b= -1.8546 0.2763 1.1453 CAB = 1.0000 -0.0109 0.0003 -0.0109 1.0000 -0.0023 0.0003 -0.0023 1.0000 -0.0032 -0.0068 0.0031 -0.0094 0.0086 -0.0007 -0.0111 0.0145 -0.0026 -1.8820 0.6239 -0.0032 -0.0068 0.0031 1.0000 -0.0009 -0.0006 0.7965 1.8866 -0.0094 0.0086 -0.0007 -0.0009 1.0000 -0.0014 (4) clear RS=RandStream('mlfg6331_64'); N=10000; A1=zeros(3,5);AA1=A1; B=zeros(N,3); for k=1:3 set(RS,'Substream',k) A1(k,:)=rand(RS,1,5); B(:,k)=rand(RS,N,1); end for k=1:3 set(RS,'Substream',k) AA1(k,:)=rand(RS,1,5); end A1,AA1 rA=corrcoef(B) nh=5*log10(N); subplot(1,3,1),hist(B(:,1),nh),title('B(:,1)') subplot(1,3,2),hist(B(:,2),nh),title('B(:,2)') subplot(1,3,3),hist(B(:,3),nh),title('B(:,3)') A1 = 0.6986 0.7413 0.4239 0.6914 0.7255 0.9230 0.2489 0.2405 0.0105 0.8775 0.0261 0.2530 0.0737 0.7119 0.0048 AA1 = 0.6986 0.7413 0.4239 0.6914 0.7255 0.9230 0.2489 0.2405 0.0105 0.8775 0.0261 0.2530 0.0737 0.7119 0.0048 rA = 1.0000 -0.0021 0.0162 -0.0021 1.0000 -0.0084 0.0162 -0.0084 1.0000 -0.0111 0.0145 -0.0026 -0.0006 -0.0014 1.0000 21 600 B(:,1) 600 B(:,2) 600 B(:,3) 500 500 500 400 400 400 300 300 300 200 200 200 100 100 100 0 0 0 0 0.5 1 0 0.5 1 0 0.5 1 图 4.6-2 B 数组三列元素的频数直方图 (5) clear N=1e4; rng(0) a=rand(N,1); rng(31) b=rand(N,1); Cab=corrcoef(a,b) Cab = 1.0000 0.0006 0.0006 1.0000 (6) clear N=1e4; rng default RS=RandStream('swb2712'); A=rand(N,3); B=rand(RS,N,3); C=[A,B]; CAB=corrcoef(C) CAB = 1.0000 -0.0137 -0.0183 -0.0137 1.0000 -0.0106 -0.0183 -0.0106 1.0000 -0.0055 0.0025 -0.0077 0.0045 -0.0028 -0.0136 0.0205 -0.0067 0.0123 -0.0055 0.0025 -0.0077 1.0000 -0.0348 0.0069 0.0045 -0.0028 -0.0136 -0.0348 1.0000 0.0037 0.0205 -0.0067 0.0123 0.0069 0.0037 1.0000 〖说明〗 6. 随机数重现控制旧版指令的使用建议 4.6.2 数据样本分布可视化描述 【例 4.6-5】直方条分段数对观察随机数据分布的影响。(参见图 4.6-3) Nxy=1000; rng(0,'v5normal') x=randn(Nxy,1); n1=5; n2=7*log10(Nxy); % <6> n3=floor(sqrt(Nxy)); % <5> 22 n4=170; subplot(2,2,1),histfit(x,n1),title('(a)') subplot(2,2,2),histfit(x,n2),title('(b)') subplot(2,2,3),histfit(x,n3),title('(c)') subplot(2,2,4),histfit(x,n4),title('(d)') (a) 600 (b) 150 400 100 200 50 0 -4 -2 0 2 4 0 -4 -2 0 2 4 (c) 100 (d) 20 15 50 10 5 0 -4 -2 0 2 4 0 -4 -2 0 2 4 图 4.6-3 正态分布实验数据在不同分段下的频数直方图 4.6.3 随机分布的数字特征及其统计量 1. 随机分布的中心位置统计量 2. 随机分布的聚散度统计量 3. 斜度和峭度高阶统计量 【例 4.6-6】观察正态、指数、瑞利、均匀等四种随机数的统计量特征。 (1) N=10000; X=zeros(N,4); rng(1) X(:,1)=randn(N,1); X(:,2)=exprnd(1,[N,1]); X(:,3)=raylrnd(1,[N,1]); X(:,4)=rand(N,1); 23 (2) [MU(1),S2(1)]=normstat(0,1); [MU(2),S2(2)]=expstat(1); [MU(3),S2(3)]=raylstat(1); [MU(4),S2(4)]=unifstat(0,1); (3) mu=mean(X); m50=median(X); disp([' 分 布 类 型 ',blanks(9),' 正 态 ',blanks(9),' 指 数 ',blanks(9),' 瑞 利 ',blanks(8),'均匀']) disp(['理论均值',blanks(13),num2str(MU)]) disp(['平均值',blanks(5),num2str(mu)]) disp(['中位数',blanks(7),num2str(m50)]) 分布类型 正态 指数 瑞利 均匀 理论均值 0 1 1.2533 0.5 平均值 -0.00065501 0.99322 1.2552 0.49921 中位数 -0.016961 0.68482 1.1812 0.49603 (3) s2_0=std(X,0); s2_1=std(X,1); disp([' 分 布 类 型 ',blanks(7),' 正 态 ',blanks(9),' 指 数 ',blanks(9),' 瑞 利 ',blanks(8),'均匀']) disp(['理论离差',blanks(11),num2str(sqrt(S2))]) disp(['无偏离差',blanks(5),num2str(s2_0)]) 分布类型 正态 指数 瑞利 均匀 理论离差 1 1 0.65514 0.28868 无偏离差 0.99618 0.99203 0.6489 0.285144 【例 4.6-7】本例演示:正态、指数、瑞利、均匀等四种随机数的前四阶统计量的不同计算 方法;Proakis 定义的矩(Moment)和累(Cumulant),以及相应的“归化斜度和峭度”; 打印指令 sprintf 的用法。 (1) function [c,m]=exm040607_cm(x) m(1,:)=mean(x); m(2,:)=mean(x.^2); m(3,:)=mean(x.^3); m(4,:)=mean(x.^4); c(1,:)=m(1,:); c(2,:)=m(2,:)-m(1,:).^2; c(3,:)=m(3,:)-3*m(2,:).*m(1,:)+2*m(1,:).^2; c(4,:)=m(4,:)-4*m(3,:).*m(1,:)-3*m(2,:).^2+12*m(2,:).*m(1,:).^2-6*m(1,:).^4; c(5,:)=c(3,:)./c(2,:).^1.5; c(6,:)=c(4,:)./c(2,:).^2; (2) clear rng default N=1e6; X=zeros(N,4); X(:,1)=randn(N,1); X(:,2)=exprnd(1,[N,1]); X(:,3)=raylrnd(1,[N,1]); X(:,4)=rand(N,1)-0.5; 24 (3) Smatlab(1,:)=mean(X); Smatlab(2,:)=var(X,0); Smatlab(3,:)=skewness(X,0); Smatlab(4,:)=kurtosis(X,0); (4) [CU,MO]=exm040607_cm(X); (5) B3=blanks(3);B4=blanks(4);B5=blanks(5); DSTR=['正态';'指数';'瑞利';'均匀']; MatSTR=['MATLAB 约定',B3,B3,'均值',B5,'方差',B5,'斜度',B5,'峭度']; CSTR=['Proakis 约定',B4,'一阶累',B4,'二阶累',B4,'三阶累',B4,'四阶累',B4,' 归化斜',B4,'归化峭']; MSTR=['Proakis 约定',B4,'一阶矩',B4,'二阶矩',B4,'三阶矩',B4,'四阶矩']; disp(MatSTR) for kk=1:4 disp([DSTR(kk,:),B3,B5,sprintf('%+9.4f',Smatlab(:,kk)')]) end disp(' ') disp(CSTR) for kk=1:4 disp([DSTR(kk,:),B3,B5,sprintf('%+9.4f',CU(:,kk)')]) end disp(' ') disp(MSTR) for kk=1:4 disp([DSTR(kk,:),B3,B5,sprintf('%+9.4f',MO(:,kk)')]) end MATLAB 约定 均值 方差 斜度 峭度 正态 +0.0009 +0.9994 +0.0003 +3.0042 指数 +1.0000 +1.0004 +1.9947 +8.9419 瑞利 +1.2526 +0.4296 +0.6338 +3.2456 均匀 +0.0001 +0.0833 +0.0004 +1.7997 Proakis 约定 正态 指数 瑞利 均匀 一阶累 +0.0009 +1.0000 +1.2526 +0.0001 二阶累 +0.9994 +1.0004 +0.4296 +0.0833 三阶累 +0.0003 +1.9957 -0.6141 +0.0000 四阶累 +0.0042 +5.9462 +0.0453 -0.0083 归化斜 +0.0003 +1.9946 -2.1806 +0.0004 归化峭 +0.0042 +5.9419 +0.2456 -1.2003 Proakis 约定 正态 指数 瑞利 均匀 一阶矩 +0.0009 +1.0000 +1.2526 +0.0001 二阶矩 +0.9994 +2.0004 +1.9986 +0.0833 三阶矩 四阶矩 +0.0031 +3.0004 +5.9969 +23.9338 +3.7581 +7.9993 +0.0000 +0.0125 4.7 多项式运算和卷积 4.7.1 多项式的运算函数 25 1. 多项式表达方式的约定 2. 多项式运算函数 【例 4.7-1】求 (s 2  2)(s s3   4)(s s 1  1) 的“商”及“余”多项式。 (1) format rat p1=conv([1,0,2],conv([1,4],[1,1])); % <2> p2=[1 0 1 1]; [q,r]=deconv(p1,p2); cq='商多项式为 '; cr='余多项式为 '; disp([cq,poly2str(q,'s')]),disp([cr,poly2str(r,'s')]) 商多项式为 s+5 余多项式为 5 s^2 + 4 s + 3 (2) qp2=conv(q,p2); pp1=qp2+[zeros(1,length(qp2)-length(r)),r];% <8> pp1==p1 % <9> ans = 1 1 1 1 1 【例 4.7-2】矩阵和特征多项式,特征值和多项式根。 (1) A=[11 12 13;14 15 16;17 18 19]; PA=poly(A) % <2> PPA=poly2str(PA,'s') PA = 1 -45 -18 * PPA = s^3 - 45 s^2 - 18 s + 1.6206e-014 (2) s=eig(A) r=roots(PA) s= 45.397 -0.39651 9.0033e-016 r= 45.397 -0.39651 9.0033e-016 (3) n = length(PA); AA = diag(ones(1,n-2,class(PA)),-1); AA(1,:) = -PA(2:n) ./ PA(1); % <8> AA sr = eig(AA) AA = 45 18 -1.6206e-014 1 0 0 0 1 0 sr = 45.397 -0.39651 9.0033e-016 26 % <6> % <7> 【例 4.7-3】构造指定特征根的多项式。 R=[-0.5,-0.3+0.4*i,-0.3-0.4*i]; P=poly(R) PPR=poly2str(PR,'x') P= 1 1.1 PPR = x^3 + 1.1 x^2 + 0.55 x + 0.125 0.55 0.125 【例 4.7-4】多项式求值指令 polyval 与 polyvalm 的本质差别。 (1) clear p=[1,2,3]; disp(['给定多项式为',poly2str(p,'x')]) X=[1,2;3,4] 给定多项式为 x^2 + 2 x + 3 X= 1 2 3 4 (2) va=X.^2+2*X+3 Va=polyval(p,X) va = 6 11 18 27 Va = 6 11 18 27 % <5> (3) vm=X^2+2*X+3*eye(2) Vm=polyvalm(p,X) vm = 12 14 21 33 Vm = 12 14 21 33 % <7> (4) cp=poly(X); disp(['矩阵 X 的特征多项式为',poly2str(cp,'x')]) cpXa=polyval(cp,X) cpX=polyvalm(cp,X) 矩阵 X 的特征多项式为 x^2 - 5 x - 2 cpXa = -6 -8 -8 -6 cpX = 2.2204e-016 0 0 2.2204e-016 4.7.2 卷积 27 1. 两有限长序列的卷积 【例 4.7-5】有序列 A(n)  1 0 两个序列的卷积。 (1) N1=3;N2=12; A=ones(1,(N2-N1+1)); M1=2;M2=9; B=ones(1,(M2-M1+1)); Nc1=N1+M1;Nc2=N2+M2; kcc=Nc1:Nc2; for n=Nc1:Nc2 w=0; for k=N1:N2 kk=k-N1+1; t=n-k; if t>=M1&t<=M2 tt=t-M1+1; w=w+A(kk)*B(tt); end end nn=n-Nc1+1; cc(nn)=w; end kcc,cc kcc = Columns 1 through 13 5 6 7 8 17 Columns 14 through 17 18 19 20 21 cc = Columns 1 through 13 1 2 3 4 5 Columns 14 through 17 4 3 2 1 n  3,4,,12 else 和 1 B(n)  0 9 10 11 12 13 5 6 7 8 8 n  2,3,,9 ,求这 else 14 15 16 8 7 6 (2) N1=3;N2=12; a=ones(1,N2+1);a(1:N1)=0; M1=2;M2=9; b=ones(1,M2+1);b(1:M1)=0; c=conv(a,b); kc=0:(N2+M2); kc,c kc = Columns 1 through 13 0 1 2 3 4 5 6 7 8 9 10 11 12 Columns 14 through 22 13 14 15 16 17 18 19 20 21 c= Columns 1 through 13 0 0 0 0 0 1 2 3 4 5 6 7 8 Columns 14 through 22 8 8 7 6 5 4 3 2 1 (3) 28 N1=3;N2=12; M1=2;M2=9; A=ones(1,(N2-N1+1)); B=ones(1,(M2-M1+1)); C=conv(A,B); Nc1=N1+M1;Nc2=N2+M2; KC=Nc1:Nc2; KC,C KC = Columns 1 through 13 5 6 7 8 9 10 11 12 13 14 15 16 17 Columns 14 through 17 18 19 20 21 C= Columns 1 through 13 1 2 3 4 5 6 7 8 8 8 7 6 5 Columns 14 through 17 4 3 2 1 (4) subplot(2,1,1),stem(kc,c), text(20,6,'0 起点法') CC=[zeros(1,KC(1)),C]; subplot(2,1,2),stem(kc,CC),text(18,6,'非平凡区间法') xlabel('n') 8 6 0 起点法 4 2 0 0 5 10 15 20 25 8 6 非平凡区间法 4 2 0 0 图 4.4-3 5 10 15 20 25 n 借助 conv 指令时两种不同序列记述法所得的卷积序列 2. 有限长序列与无限长序列的卷积 【例 4.7-6】设滤波器 h(z)  0.1z  0.35z 1  0.42z 2  0.05z 3  0.15z 4 ,输入 u(k) 是 长度为 1000 的 BPSK{1,1} 随机码,计算滤波器输出 y(k) 。 (1) %exm040707.m clear M=4; h=[0.1,0.35,-0.42,-0.05,0.15]; N=10000; 29 rng default u=randsrc(1,N); % tic y_filter=filter(h,1,u); t_filter=toc; % tic ct=[u(1),zeros(1,M)]; ut=toeplitz(ct,u); y_toepl=h*ut; t_toepl=toc; % tic y_conv=conv(h,u); t_conv=toc; y_conv(N+1:end)=[ ]; % tic for k=1:N w=0; for ii=1:M+1 if k-ii+1>0&&k-ii+1<=N w=w+h(ii)*u(k-ii+1); end end y_0(k)=w; end t_0=toc; disp(' t_filter t_conv t_toepl t_0') disp([t_filter,t_conv,t_toepl,t_0]) (2) 4.8 多项式拟合和非线性最小二乘 4.8.1 线性拟合和最小二乘 (1) (2) 4.8.2 多项式拟合 【例 4.8-1】对一组带噪原始数据,采用“普通”的多项式函数进行拟合。 (1) (2) rng default x=[1:10]'; c=[-0.1,1.3,-0.5,2.5]; 30 noise=3*(rand(size(x))-0.5); y=polyval(c,x)+noise; %<4> %<5> (3) Vd=[x.^3,x.^2,x,ones(size(x))]; N=length(x); n=size(Vd,2); df=N-n; %<6> (4) a1=(Vd\y)' %<10> [Q2,R2]=qr(Vd,0); %<11> Rinv=inv(R2); a2=(Rinv*Q2'*y)' yhat=Vd*a2'; r=y-yhat; s=sqrt(r'*r/df); %<16> sa=(s*sqrt(sum((Rinv).^2,2)))'%<17> s a1 = -0.0901 1.2189 -0.6262 3.6937 a2 = -0.0901 1.2189 -0.6262 3.6937 sa = 0.0176 0.2941 1.4260 1.9025 s= 0.9803 (5) [a3,ST]=polyfit(x,y,n-1) %<19> s3=ST.normr/sqrt(ST.df) %<20> a3 = -0.0901 1.2189 -0.6262 3.6937 ST = R: [4x4 double] df: 6 normr: 2.4011 s3 = 0.9803 (6) xp=(1:0.2:10)'; %<21> Vp=[xp.^3,xp.^2,xp,ones(size(xp))]; yp2=Vp*a2'; E=Vp/R2; sp2=s*sqrt(1+sum(E.^2,2)); %<25> (8) [yp3,sp3]=polyval(a3,xp,ST); %<26> (9) Ea=norm(a2-a3) Es=abs(s-s3) Eyp=norm(yp2-yp3) Esp=norm(sp2-sp3) Ea = 3.0930e-015 Es = 2.2204e-016 Eyp = 3.2682e-014 Esp = 31 1.7902e-015 (7) plot(x,y,'.k','MarkerSize',5) hold on plot(xp,yp3,'r','LineWidth',1.5) plot(xp,yp3+sp3,':b',xp,yp3-sp3,':b') %<34> legend('原始数据','拟合曲线','上下界','Location','best') xlabel('x'),ylabel('y') title('拟合曲线和因变量预测区间') text(1.5,32,'50%以上置信度的因变量预测区间') hold off 拟合曲线和因变量预测区间 35 50%以 上 置 信 度 的 因 变 量 预 测 区 间 30 25 20 y 15 10 原始数据 5 拟合曲线 上下界 0 1 2 3 4 5 6 7 8 9 10 x 图 4.8-1 多项式拟合 (8) subplot(2,1,1),stem(x,r,'r'),grid on title('原始数据拟合残差杆图') subplot(2,1,2) XP=[xp;flipud(xp);xp(1)]; %<42> SP3=[sp3;flipud(-sp3);sp3(1)]; %<43> fill(XP,SP3,'b'),alpha(0.3) title('预测误差带') xlabel('x') 32 图 4.8-2 拟合残差的随机性图示 4.8.3 非线性最小二乘拟合 1. 伪线性化处理 2. 非线性最小二乘拟合 【例 4.8-2】假设产生数据的原始模型为 y(x)  3e0.4x 12e3.2x , x 在[0, 4]中取值, y 受 到噪声 0.3*(rand(n,1)-0.5) 的污染。 (1) % exm040802 function [ci,ypred,delta,msE,x,y]=exm040802 % K=0.3; x=[0:0.2:4]'; y0=3*exp(-0.4*x)+12*exp(-3.2*x); rng(234) y_noise=K*(rand(size(x))-0.5); y=y0+y_noise; % a0=[1 1 1 1]; options=statset('Jacobian','on'); % <8> [a,r,J,~,msE]=nlinfit(x,y,@twoexps,a0,options); % <9> ci = nlparci(a,r,'jacobian',J); [ypred,delta] = nlpredci(@twoexps,x,a,r,'jacobian',J,'predopt','observation','simopt','on'); % function yhat=twoexps(a,x) 33 x=x(:); yhat=a(1)*exp(-a(3)*x)+a(2)*exp(-a(4)*x); end end (2) [ci,ypred,delta,msE,x,y]=exm040802; disp('拟合参数') disp(mean(ci')) 拟合参数 3.1191 11.7252 0.4129 3.1696 (3) n=size(ci,1); a0=mean(ci'); dci=ci'-[1;1]*a0; errorbar(1:n,a0,dci(1,:),dci(2,:),'*r','LineWidth',3) % axis([0,5,-inf,inf]) set(gca,'XTickMode','manual','XTick',[1:n]) set(gca,'XTickMode','manual','XTickLabel',[1:n]) set(gca,'YGrid','on') text(0.5,7.6,['上界 ',mat2str(ci(:,2)',5)]) text(0.5,7,['参数',' a(1) a(2) a(3) a(4)']) text(0.5,6.4,['下界 ',mat2str(ci(:,1)',5)]) xlabel('序号'),ylabel('拟合参数值') title('95%置信水平下的拟合参数置信区间') 95%置 信 水 平 下 的 拟 合 参 数 置 信 区 间 12 <31> 10 拟合参数值 8 上 界 [3.4284 12.043 0.45654 3.3132] 参 数 a(1) a(2) a(3) a(4) 下 界 [2.8098 11.408 0.36919 3.026] 6 4 2 1 2 3 4 序号 图 4.8-3 非线性拟合参数及其置信区间 (3) plot(x,[ypred+delta,ypred-delta],'b') hold on plot(x,ypred,'r--','LineWidth',2) plot(x,y,'k.','MarkerSize',5) hold off text(2,4,['拟合均方差为 ',num2str(msE)]) legend('新观察/联立预测','','拟合函数值','原始数据','Location','best') xlabel('x') title('预测区间图') 34 预测区间图 16 14 新 观 察 /联 立 预 测 12 拟合函数值 10 原始数据 8 6 4 拟 合 均 方 差 为 0.0045534 2 0 0 0.5 1 1.5 2 2.5 3 3.5 4 x 图 4.8-4 非线性拟合的新观察的联立预测区间 4.9 插值和样条 4.9.1 一维插值 【例 4.9-1】已知一组原始数据,确定它们所代表函数穿越 y  0.95 线的时刻。 (1) t=linspace(0,5,100);y=1-cos(3*t).*exp(-t); (2) plot(t,y,'b') grid on hold on plot(t,0.95*ones(size(t)),'r') hold off 35 图 4.9-1 根据原始基准数据绘制的函数穿越 y=0.95 线 图 4.9-2 据局部极致放大图读取穿越时刻 (3) it=min(find(y>0.95)); T=(it-3):(it+3); t_nearst=interp1(y(T),t(T),0.95,'nearst'); t_linear=interp1(y(T),t(T),0.95); t_spline=interp1(y(T),t(T),0.95,'spline'); 36 % <2> % <3> % <4> % <5> t_cubic=interp1(y(T),t(T),0.95,'cubic'); disp([' t_nearst t_linear t_spline t_cubic']) disp([t_nearst t_linear t_spline t_cubic]) t_nearst t_linear t_spline t_cubic 0.5051 0.4965 0.4962 0.4962 (4) t_zero=fzero('1-cos(3*x).*exp(-x)-0.95',0.5) t_zero = 0.4962 % <6> 4.9.2 高维函数的插值 【例 4.9-2】假设有一组海底深度测量数据,采用插值方式绘制海底形状图。 (1) rng(2, 'v5normal') x=-5:5;y=-5:5; [X,Y]=meshgrid(x,y); zz=1.2*exp(-((X-1).^2+(Y-2).^2))-0.7*exp(-((X+2).^2+(Y+1).^2)); Z=-500+zz+randn(size(X))*0.05; surf(X,Y,Z);view(-25,25) -498.5 -499 -499.5 -500 -500.5 -501 5 0 5 0 -5 -5 图 4.9-3 据基准数据绘制的曲面图 (2) xi=linspace(-5,5,50); yi=linspace(-5,5,50); [XI,YI]=meshgrid(xi,yi); ZI=interp2(X,Y,Z,XI,YI,'*cubic'); surf(XI,YI,ZI),view(-25,25) 37 图 4.9-4 由插值数据生成的曲面 4.9.3 样条插值 【例 4.9-3】根据连续时间函数 w(t)  e t 的采样数据,利用 spline 重构该连续函数,并检 查重构误差。 t=-5:0.5:5;w=exp(-abs(t)); N0=length(t);tt=linspace(t(1),t(end),10*N0); ww=spline(t,w,tt); error=max(abs(ww-exp(-abs(tt)))) plot(tt,ww,'b');hold on stem(t,w,'filled','r');hold off legend('重构函数','原采样数据') xlabel('t') error = 0.0840 1 重构函数 0.9 原采样数据 0.8 0.7 0.6 0.5 0.4 0.3 0.2 0.1 0 -5 -4 -3 -2 -1 0 1 2 3 4 5 t 图 4.9-5 样条插值重构信号 【例 4.9-4】用样条插值产生长、短轴分别在 45 度和 135 度线上的椭圆。 theta=[0:0.5:2]*pi; 38 y=[-0.5 1 -0.5 -1 0.5 1 -0.5;0.5 1 0.5 -1 -0.5 1 0.5]; theta2=linspace(theta(1),theta(end),50*length(theta)); yy=spline(theta,y,theta2); plot(yy(1,:),yy(2,:),'b');hold on plot(y(1,:),y(2,:),'or');hold off,axis('image') %<3> 1 0.8 0.6 0.4 0.2 0 -0.2 -0.4 -0.6 -0.8 -1 -1 -0.5 0 0.5 1 图 4.9-6 利用四个样点产生的椭圆 4.9.4 样条函数的应用 1. 样条函数的微积分 x  【例 4.9-5】对于函数 y  sin x ,其积分函数为 S(x)  sin xdx  1  cos x ,而导函数 0 为 y  cos x 。 (1) x=(0:0.1:1)*2*pi; y=sin(x); pp=spline(x,y) %<3> pp = form: 'pp' breaks: [1x11 double] coefs: [10x4 double] pieces: 10 order: 4 dim: 1 disp('第 2 子区间的 3 阶多项式') disp(poly2str(pp.coefs(2,: ),'x')) %<5> disp('第 3 子区间的 3 阶多项式') disp(poly2str(pp.coefs(3,: ),'x')) %<7> 第 2 子区间的 3 阶多项式 -0.11257 x^3 - 0.28435 x^2 + 0.80127 x + 0.58779 第 3 子区间的 3 阶多项式 0.0034798 x^3 - 0.49655 x^2 + 0.31062 x + 0.95106 39 (2) ipp=fnint(pp) %<8> disp('第 2 子区间的 4 阶积分多项式') disp(poly2str(ipp.coefs(2,: ),'x')) %<10> disp('第 3 子区间的 4 阶积分多项式') disp(poly2str(ipp.coefs(3,: ),'x')) ipp = form: 'pp' breaks: [1x11 double] coefs: [10x5 double] pieces: 10 order: 5 dim: 1 第 2 子区间的 4 阶积分多项式 -0.028144 x^4 - 0.094783 x^3 + 0.40063 x^2 + 0.58779 x + 0.19203 第 3 子区间的 4 阶积分多项式 0.00086996 x^4 - 0.16552 x^3 + 0.15531 x^2 + 0.95106 x + 0.69161 (3) dpp=fnder(pp) %<13> disp('第 2 子区间的 2 阶导数多项式') disp(poly2str(dpp.coefs(2,: ),'x')) %<15> disp('第 3 子区间的 2 阶导数多项式') disp(poly2str(dpp.coefs(3,: ),'x')) dpp = form: 'pp' breaks: [1x11 double] coefs: [10x3 double] pieces: 10 order: 3 dim: 1 第 2 子区间的 2 阶导数多项式 -0.33772 x^2 - 0.5687 x + 0.80127 第 3 子区间的 2 阶导数多项式 0.01044 x^2 - 0.9931 x + 0.31062 (4) DefiniteIntegral.bySpline=ppval(ipp,[1,2])*[-1;1];%<16> DefiniteIntegral.byTheory=(1-cos(2))-(1-cos(1)); DefiniteIntegral DefiniteIntegral = bySpline: 0.9563 byTheory: 0.9564 Derivative.bySpline=fnval(dpp,3); Derivative.byTheory=cos(3); Derivative Derivative = bySpline: -0.9895 byTheory: -0.9900 %<19> (3) fnplt(pp,'b-') %<22> hold on fnplt(ipp,'m:') % fnplt(dpp,'r--') % hold off legend('y(x)','\int y dx','y ''_x') xlabel('x') title('样条函数及其积分函数、导函数') <24> <25> 40 2.5 2 1.5 1 0.5 0 -0.5 -1 0 样条函数及其积分函数、导函数 y(x)  y dx y 'x 1 2 3 4 5 6 7 x 图 4.9-7 样条函数、样条函数的积分函数和导函数 2. 样条函数的零点和最小值 【例 4.9-6】求 f (t)  (sin2 t)  e0.1t  0.5 t 的零点。 (1) syms tp positive ftp=sin(tp)^2*exp(-0.1*tp)-0.5*tp; ftn=sin(-tp)^2*exp(0.1*tp)-0.5*tp; zsp=solve(ftp,tp) %<4> zsn=-solve(ftn,tp) maxsp=solve(diff(ftp,tp),tp) %<6> maxsn=-solve(diff(ftn,tp),tp) zsp = matrix([[0]]) zsn = matrix([[0]]) maxsp = matrix([[0.27414335682669078173489784260962]]) maxsn = matrix([[-0.25113921460114505973567301534822]]) (2) ft=@(t)(sin(t).^2.*exp(-0.1*t)-0.5*abs(t)); t=-10:0.1:10; %<8> y=feval(ft,t); %<9> plot(t,y,'r'); hold on plot(t,zeros(size(t)),'k'); xlabel('t');ylabel('f(t)') hold off grid on %<7> 41 1 0 -1 f(t) -2 -3 -4 -5 -10 -5 0 5 10 t 图 4.9-8 函数曲线的一般观察 (3) 图 4.9-9 函数曲线的一般观察 (4) t0=[-2.5,-1.5,-0.5,0.5,1.5,2.5]; %<16> for ii=1:length(t0) [z(ii),fz(ii)]=fzero(ft,t0(ii)); %<18> end z,fz z= -2.0074 -2.0074 -0.5198 0.5993 1.6738 fz = 1.0e-015 * 0.2220 0.2220 0 -0.0555 0.2220 1.6738 0.2220 (5) t0=[-2.5,-1.5,-0.5,0.5,1.5,2.5]; gt=@(t)(-sin(t).^2.*exp(-0.1*t)+0.5*abs(t)); for ii=1:length(t0) [za(ii),fa(ii)]=fminsearch(gt,t0(ii)); %<22> %<24> 42 end za fa=-fa za = -1.3986 fa = 0.4170 -1.3986 0.4170 -1.3985 0.4170 1.2153 0.1706 %<27> 1.2154 0.1706 (6) pp=spline(t,y); zpp=fnzeros(pp) zpp = -2.0074 -0.5199 -2.0074 -0.5199 %<28> %<29> -0.0000 -0.0000 -0.0000 -0.0000 0.5993 0.5993 gy=feval(gt,t); gpp=spline(t,gy); maxpp=-fnmin(gpp) maxpp = 0.4170 %<30> %<31> %<32> (7) tt=linspace(-10,10,202); %<33> yy=feval(ft,tt); pp2=spline(tt,yy); %<35> fnplt(pp2,'r') axis([-2.5,2.5,-0.3,0.45]) grid on title('不恰当断点序列产生的样条函数') xlabel('t'),ylabel('f(t)') 不恰当断点序列产生的样条函数 1.2153 0.1706 1.6738 1.6738 0.4 0.3 0.2 0.1 f(t) 0 -0.1 -0.2 -2 -1 0 1 2 t 图 4.9-10 生成的不恰当样条函数 (8) zpp2=fnzeros(pp2) zpp2 = -2.0074 -0.5198 -2.0074 -0.5198 %<41> 0.5993 0.5993 1.6738 1.6738 gyy=feval(gt,tt); gpp2=spline(tt,gyy); maxpp2=-fnmin(gpp2) maxpp2 = %<43> %<44> 43 0.4170 4.10 Fourier 分析 4.10.1快速 Fourier 变换和逆变换指令 4.10.2连续时间函数的 Fourier 级数展开 1. 展开系数的积分求取法 2. Fourier 级数与 DFT 之间的数学联系 3. MATLAB 算法实现 【例 4.10-1】利用符号计算方法求周期函数的 Fourier 级数展开系数,周期函数在[0, 2] 区间 上的定义为 y(t )  t    0.5 0 0.5  t  1.5 。 0  t  0.5 or 1.5  t  2 (1) syms ts T=2; ys=heaviside(ts-0.5)'*(ts-0.5)-heaviside(ts-1.5)'*((ts-1.5)+1);% <3> ezplot(ys,[0,2]) %<4> title('一个周期中的三角波形') 一个周期中的三角波形 1 0.8 0.6 0.4 0.2 0 0 0.5 1 1.5 2 ts 图 4.10-1 待解函数图形 (2) function [A0s,As,Bs]=exm041001_fzzysym(y,t,T) syms n A0s=int(y,t,0,T)/T; As=int(y*cos(2*pi*n*t/T),t,0,T); Bs=int(y*sin(2*pi*n*t/T),t,0,T); 44 (3) [A0s,As,Bs]=exm041001_fzzysym(ys,ts,T) %<6> A0s = conj(1)/4 - conj(0)/4 As = (cos((3*pi*n)/2) - cos(1/2*n*pi) + pi*n*sin((3*pi*n)/2))/(pi^2*n^2) Bs = -(sin((pi*n)/2) - sin(3/2*n*pi) + pi*n*cos((3*pi*n)/2))/(pi^2*n^2) (4) A0d=double(vpa(A0s)) Asd=double(vpa(subs(As,'n',1:6))) Bsd=double(vpa(subs(Bs,'n',1:6))) A0d = 0.2500 Asd = -0.3183 0.0000 0.1061 -0.0000 Bsd = -0.2026 0.1592 0.0225 -0.0796 %<7> %<8> %<9> -0.0637 -0.0081 0.0000 0.0531 (5) tp=ts-floor(ts/T)*T; ysp=subs(ys,ts,tp); ezplot(ysp,[-4,4]) title('三角波的周期化图示') %<10> %<11> 三角波的周期化图示 1 0.8 0.6 0.4 0.2 0 -4 -3 -2 -1 0 1 2 3 4 ts 图 4.10-2 待解函数的周期化图形 (6) [A0p,Asp,Bsp]=exm041001_fzzysym(ysp,ts,T) %<14> Warning: Explicit integral could not be found. Warning: Explicit integral could not be found. A0p = conj(1)/4 - conj(0)/4 Asp = int(-cos(pi*n*ts)*(conj(heaviside(ts - 2*floor(ts/2) - 1/2))*(2*floor(ts/2) - ts + 1/2) - conj(heaviside(ts - 2*floor(ts/2) - 3/2))*(2*floor(ts/2) - ts + 1/2)), ts = 0..2) Bsp = int(-sin(pi*n*ts)*(conj(heaviside(ts - 2*floor(ts/2) - 1/2))*(2*floor(ts/2) - ts + 1/2) - conj(heaviside(ts - 2*floor(ts/2) - 3/2))*(2*floor(ts/2) - ts + 1/2)), ts = 0..2) 45 (7) A0pd=double(vpa(A0p)) Aspd=double(vpa(subs(Asp,n,1:6))) Bspd=double(vpa(subs(Bsp,n,1:6))) A0pd = 0.2500 Aspd = -0.3183 -0.0000 0.1061 0.0000 Bspd = -0.2026 0.1592 0.0225 -0.0796 % % % -0.0637 -0.0081 0.0000 0.0531 <15> <16> <17> 【例 4.10-2】运用数值积分法,按式(4.10-8)和(4.10-9),求上例周期函数的 Fourier 级 数展开系数。 (1) function [t,y,S,a0,A,B]=exm041002_fzzyquad(a,T,Nf,K) if nargin<4;K=200;end if (nargin<3|isempty(Nf));Nf=15;end k=1:K; t=a+k*T/K; y=time_fun(t); a0=mean(y); A0=a0; A=zeros(1,Nf);B=zeros(1,Nf); S=zeros(Nf+1,K); S(1,:)=a0*ones(1,K); for n = 1:Nf A(n) = quadl(@cos_y,a,a+T,[ ],[ ],n,T)/T*2; B(n) = quadl(@sin_y,a,a+T,[ ],[ ],n,T)/T*2; S(n+1,:)=S(n,:)+A(n)*cos(2*n*pi*t/T)+B(n)*sin(2*n*pi*t/T); end %--------------------------------function wcos=cos_y(t,n,T) y=time_fun(t); wcos=cos(2*n*pi*t/T).*y; %--------------------------------function wsin=sin_y(t,n,T) y=time_fun(t); wsin=sin(2*n*pi*t/T).*y; %--------------------------------function y=time_fun(t) y=zeros(size(t)); ii=find(t>=0.5 & t<=1.5); y(ii)=ones(size(ii)).*(t(ii)-0.5); (2) [t,y,S,a0,aquad,bquad]=exm041002_fzzyquad(0,2,15);%<1> a0 A_quad=aquad(1:6) B_quad=bquad(1:6) a0 = 0.2500 A_quad = -0.3183 -0.0000 0.1061 0.0000 -0.0637 -0.0000 B_quad = -0.2026 0.1592 0.0225 -0.0796 -0.0081 0.0531 (3) 46 SS=[S;y]'; ribbon(t,SS) xlabel('谐波次数\rightarrow'),ylabel('t\rightarrow') title('1 到 16 次谐波截断的近似波形和原三角波') view([46,38]),colormap(jet) shading flat,light,lighting gouraud 图 4.10-3 近似波形和原三角波形 【例 4.10-3】运用 FFT,按式(4.10-11)和(4.10-12),求例 4.10-1 时间函数的 Fourier 级数展开 系数。 (1) function [A0,A,B,C,fn,t,w]=exm041003_fzzyfft(T,M,Nf) if (nargin<2 | isempty(M));M=14;end % <10> if nargin<3;Nf=6;end % <11> N=2^M; f=1/T; dt=T/N; n=0:1:(N-1); t=n*dt; w=time_fun(t); % W=fft(w); cn=W/N; % z_cn=find(abs(cn)<1.0e-10); cn(z_cn)=zeros(length(z_cn),1); %<23> cn_SH=fftshift(cn); %<24> C=[cn_SH cn_SH(1)]; A0=C(N/2+1); A(1:N/2)=2*real(C((N/2+2):end)); B(1:N/2)=-2*imag(C((N/2+2):end)); if Nf>N/2;error(['第三输入宗量 Nf 应小于 ' int2str(N/2-1)]);end A(Nf+1:end)=[ ]; B(Nf+1:end)=[ ]; n1=-N/2:1:N/2; 47 fn=n1*f; %-------------------------------function y=time_fun(t) y=zeros(size(t)); ii=find(t>=0.5 & t<=1.5); y(ii)=ones(size(ii)).*(t(ii)-0.5); (2) [A08,A8,B8]=exm041003_fzzyfft(2,8) [A017,A17,B17]=exm041003_fzzyfft(2,17) A08 = 0.2520 A8 = -0.3183 -0.0039 0.1061 0.0039 B8 = -0.2066 0.1591 0.0264 -0.0795 A017 = 0.2500 A17 = -0.3183 -0.0000 0.1061 0.0000 B17 = -0.2026 0.1592 0.0225 -0.0796 (3) a08=abs((A0d-A08)/A08) a8=abs((Asd-A8)./A8) b8=abs((Bsd-B8)./B8) a08 = 0.0078 a8 = 0.0001 1.0000 b8 = 0.0190 0.0002 0.0005 0.1482 1.0000 0.0008 a017=abs((A0d-A017)/A017) a17=abs((Asd-A17)./A17) b17=abs((Bsd-B17)./B17) a017 = 1.5259e-005 a17 = 0.0000 1.0000 0.0000 b17 = 1.0e-003 * 0.0376 0.0000 0.3387 1.0000 0.0000 %<1> %<2> -0.0636 -0.0120 -0.0637 -0.0081 %<3> %<4> 0.0013 0.3258 %<6> %<7> 0.0000 0.9404 -0.0039 0.0530 -0.0000 0.0531 1.0000 0.0018 1.0000 0.0000 4.10.3利用 DFT 计算连续函数 Fourier 变换 CFT 1. CFT 与 DFT 之间的数学联系 (1) (2) (3) 2. MATLAB 算法实现 48 【例 4.10-4】运用 FFT 求取矩形脉冲 w(t )  1 0 (1) syms ts w fs ys=heaviside(ts+0.5)-heaviside(ts-0.5); Yw=simple(fourier(ys,ts,w)); Yf=subs(Yw,w,2*pi*fs) subplot(2,1,1) hys=ezplot(ys,[-5,5]); axis([-5,5,-0.1,1.1]) set(hys,'LineWidth',3) subplot(2,1,2) ezplot(Yf,[-5,5]),grid on Yf = sin(pi*fs)/(pi*fs) 0.5  t  0.5 的谱。 else heaviside(ts + 1/2) - heaviside(ts - 1/2) 1 0.5 0 -5 -4 -3 -2 -1 0 1 2 3 4 5 ts sin( fs)/( fs) 1 0.5 0 -5 -4 -3 -2 -1 0 1 2 3 4 5 fs 图 4.10-4 矩形脉冲和频率特性 (2) function [y,t]=exm041004_RectanglePulse(Tn,Tw,M) N=2^M; n=(0:N-1)'; dt=(Tw(2)-Tw(1))/N; t=n*dt+Tw(1); y=zeros(size(t)); ii=(t>=Tn(1) & t<=Tn(2)); y(ii)=ones(sum(ii),1); (3) function [AW,f]=exm041004_cftbyfft(wt,t,flag) if nargin==2;flag=1;end N=length(t); 49 T=t(length(t))-t(1); dt=T/N; W0=fft(wt); W=dt*W0; df=1/T; %<18> n=0:1:(N-1); if flag==0 n=-N/2:(N/2-1); W=fftshift(W); end f=n*df; AW=abs(W); if nargout==0 plot(f,AW);grid,xlabel('频率f');ylabel('|w(f)|') end (4) clf Tn=[-0.5,0.5]; Tw5=[-5,5]; M5=5; [y,t]=exm041004_RectanglePulse(Tn,Tw5,M5); [AW5,f5]=exm041004_cftbyfft(y,t,0); M10=10; [y,t]=exm041004_RectanglePulse(Tn,Tw5,M10); [AW10,f10]=exm041004_cftbyfft(y,t,0); Tw1=[-1.5,1.5]; [y,t]=exm041004_RectanglePulse(Tn,Tw1,M10); [AW1,f1]=exm041004_cftbyfft(y,t,0); fsd=-2:0.1:2; fsd(find(fsd==0))=eps; Yfd=subs(Yf,fs,fsd); plot(f10,AW10,'g--','LineWidth',6) axis([-2,2,-0.1,1.1]) hold on,grid on plot(f5,AW5,'b-.','LineWidth',4) plot(f1,AW1,'r:','LineWidth',4) plot(fsd,abs(Yfd),'k','LineWidth',2) hold off legend('1024 点/窗宽 10','32 点/窗宽 10','1024 点/窗宽为 4','符号解') xlabel('f(Hz)') ylabel('幅频') title('幅频曲线不同算法比较') 50 幅频 幅频曲线不同算法比较 1 1024点 /窗 宽 10 32点 /窗 宽 10 1024点 /窗 宽 为 4 0.8 符号解 0.6 0.4 0.2 0 -2 -1.5 -1 -0.5 0 0.5 1 1.5 2 f(Hz) 图 4.10-5 采样点数及窗口宽度对混迭的影响 4.11 常微分方程 4.11.1 常微分方程初值问题的解算 1. (1) (2) (3) (4) 2. 求解初值问题的思路 解算指令的调用格式 3. 解算指令的属性及其设置 4. 嵌套函数法传递解算参数 【例 4.11-1】通过微分方程解算围绕地球旋转的卫星轨道。 51 (1) 图 4.11-1 地球轨道卫星运动加速度 (2) (3) function [t,X,Y]=exm041101(tspan,flag) G=6.672e-11;ME=5.97e24; vy0=4000;x0=-4.2e7; Y0=[x0;0;0;vy0]; %<4> opts=odeset('Refine',1); % <5> if flag~=0 opts=odeset(opts,'OutputFcn',@odephas2,'OutputSel',[1,2]); % <7> end [t,YY]=ode45(@dydt,tspan,Y0,opts); %<9> X=YY(:,1); Y=YY(:,2); %------------------------------ function yd=dydt(t,y) r=sqrt(sum(y(1:2).^2)); yd=[y(3:4);-G*ME*y(1:2)/r^3]; %<14> end end %<16> (4) t0=0;tf=60*60*24*5.68; tspan=[t0,tf]; [t,X,Y]=exm041101(tspan,1); 8 x 10 1 0.8 0.6 0.4 0.2 0 -0.2 -0.4 -0.6 -0.8 -1 -0.5 0 0.5 1 1.5 2 图 4.11-2 运用 odephas2 绘制的自动生成变步长解点轨线 (5)变步长观察(图 4.11-3) dt=diff(t); 2.5 x 108 52 plot(dt,'b+','MarkerSize',3) title('ode45 的步长变化') xlabel('The number of time step') ylabel('Time Step') x 104 5 ode45的 步 长 变 化 4.5 4 3.5 3 Time Step 2.5 2 1.5 1 0.5 0 0 5 10 15 20 25 30 35 The number of time step 图 4.11-3 精良因子为 1 情况下 ode45 输出解点反映步长变化 (6) tspan=linspace(t0,tf,120); [t,X,Y]=exm041101(tspan,1); 8 x 10 1 0.8 0.6 0.4 0.2 0 -0.2 -0.4 -0.6 -0.8 -1 -0.5 0 0.5 1 1.5 2 2.5 8 x 10 图 4.11-4 运用 odephas2 绘制的 tspan 指定解点轨线 53 图 4.11-5 精良因子为 4 情况下 ode45 输出解点时间间隔变化 5. 匿名函数法传递解算参数 【例 4.11-2】在初始条件 x(0)  1, dx(0)  0 情况下,求解著名的 van der Pol 微分方程 dt d 2 x  (1  x2 ) dx  x  0 。在   1000 时,该方程是典型的刚性(Stiff)方程。 dt 2 dt (1) (2) function S=exm041102_vdp(mu,y0,flag) tspan = [0; max(20,4*mu)]; %<2> opts = odeset('Jacobian',@(t,y)Jb(t,y,mu)); %<3> switch flag case 1 opts=odeset(opts,'OutputFcn',@odeplot,'OutputSel',[1]); case 2 opts=odeset(opts,'OutputFcn',@odephas2,'OutputSel',[1;2]); end S= ode15s(@(t,y)f(t,y,mu),tspan,y0,options); %<10> function dydt = f(t,y,mu) %<11> dydt = [ y(2) mu*(1-y(1)^2)*y(2)-y(1) ]; %<13> function dfdy= Jb(t,y,mu) %<14> dfdy = [ 0 1 -2*mu*y(1)*y(2)-1 mu*(1-y(1)^2) ]; %<16> (3) mu=1000; y0 = [1; 0];flag=1; S1000=exm041102_vdp(mu,y0,flag); xlabel('t') title(['mu=',int2str(mu),'时的位移曲线']) 54 mu=1000时 的 位 移 曲 线 2.5 2 1.5 1 0.5 0 -0.5 -1 -1.5 -2 -2.5 0 500 1000 1500 2000 2500 3000 3500 t 图 4.11-6 ode15s 解高度刚性方程所得位移曲线 4000 (4) mu=1; y0 = [1; 0];flag=1; S1=exm041102_vdp(mu,y0,flag); xlabel('t') title(['mu=',int2str(mu),'时的位移曲线']) mu=1时 的 位 移 曲 线 2.5 2 1.5 1 0.5 0 -0.5 -1 -1.5 -2 -2.5 0 2 4 6 8 10 12 14 16 18 20 t 图 4.11-7 ode15s 解非刚性方程所得位移曲线 6. 带事件设置的微分方程解算 【例 4.11-3】在利用微分方程解算指令 ode45 解算例 4.11-1 卫星轨迹同时,确定轨迹“远地 点”和“近地点”的发生时间、位置。此外,还要求卫星在第一次穿越远地点,再到达近 地点时,终止解算。 (1) (2) 55 function [t,X,Y,tev,Yev]=exm041103_odevent(tspan,flag) G=6.672e-11;ME=5.97e24; vy0=4000;x0=-4.2e7; Y0=[x0;0;0;vy0]; opts=odeset('RelTol',1e-5,'Event',@events); %<5> if flag~=0 opts=odeset(opts,'OutputFcn',@odephas2,'OutputSel',[1,2]); end [t,YY,tev,Yev,~]=ode45(@dydt,tspan,Y0,opts); %<9> X=YY(:,1); Y=YY(:,2); function yd=dydt(t,y) r=sqrt(sum(y(1:2).^2)); yd=[y(3:4);-G*ME*y(1:2)/r^3]; end function [value,isterminal,direction] = events(t,y) if t>100*eps drdt=y(1:2)' * y(3:4)/sqrt(y(1:2)'*y(1:2)); value=[drdt ;drdt]; else value=[1;1]; end direction=[-1;+1]; isterminal=[0;1]; end end %<1> %<5> (2) t0=0;tf=1e8; tspan=[t0,tf]; flag=1; [t,X,Y,tev,Yev]=exm041103_odevent(tspan,flag); hh=get(gca,'Children'); set(hh(1),'Marker','.','Color','b') set(hh(2),'Marker','.') text(0,6e7,'轨道','Color','b') hold on plot(Yev(1,1),Yev(1,2),'rs','MarkerSize',10) plot(Yev(2,1),Yev(2,2),'rs','MarkerSize',10) s1={' 远地点';['t =', sprintf('%6.0f',tev(1))]}; s2={' 近地点';['t =', sprintf('%6.0f',tev(2))]}; text(0.82*Yev(1,1),0,s1,'Color','r') text(0.88*Yev(2,1),-1e7,s2,'Color','r') [XE,YE,ZE] = sphere(10); RE=0.64e7;XE=RE*XE;YE=RE*YE;ZE=0*ZE; mesh(XE,YE,ZE) text(1e7,0,'地球','Color','g') hold off axis image %<7> 56 x 107 8 6 轨道 4 2 0 近地点 -2 t =489593 地球 -4 -6 -8 0 5 10 15 图 4.11-8 带事件标注的卫星轨道图 远地点 t =244797 20 7 x 10 4.11.2 常微分方程的边值问题解 1. bvp4c 求解边值问题的思路 2. 求解边值问题的配套指令 3. 求解含未知参数的边值问题 【例 4.11-4】求解马蒂厄方程(Mathieu's Equation) z  (  2q cos 2x)z  0 该问题的边界条件为 (4.11-13)  z(0)  1   z(0)  0 z( )  0 (4.11-14) 在式(4.11-13)中, q  5 已知,而  是待求的未知参数。(参见图 4.11-9) (1) (2) (3) function sol=exm041104_solve(s0,lam,q) sol=bvp4c(@ode,@bc,s0); function dydx=ode(x,y,lam) 57 dydx=[y(2) (2*q*cos(2*x)-lam)*y(1)]; end function res=bc(ya,yb,lam) %<7> res=[ya(1)-1 ya(2) yb(2)]; end end (4) clear lam0=1; q=5; x0=linspace(0,pi,5); s0=bvpinit(x0,@(x)([cos(2*x);sin(2*x)]),lam0) %<5> S=exm041104_solve(s0,lam0,q) S.stats lam=S.parameters plot(S.x,S.y(1,:),'b*-') hold on plot(x0,s0.y(1,:),'ro:') hold off axis([0,pi,-inf,inf]) legend('解函数','猜测函数','Location','North') xlabel('x') ylabel('z') s0 = solver: 'bvpinit' x: [0 0.7854 1.5708 2.3562 3.1416] y: [2x5 double] parameters: 1 yinit: @(x)([cos(2*x);sin(2*x)]) S= solver: 'bvp4c' x: [1x35 double] y: [2x35 double] yp: [2x35 double] parameters: 7.4495 stats: [1x1 struct] ans = nmeshpoints: 35 maxres: 9.4616e-004 nODEevals: 1491 nBCevals: 83 lam = 7.4495 58 解函数 1 猜测函数 0.5 z 0 -0.5 -1 0 0.5 1 1.5 2 2.5 3 x 图 4.11-9 初始猜测解点和最终求解结果 【例 4.11-5】采用不同初始猜测求解例 4.11-4 中的马蒂厄方程(Mathieu's Equation)。 (1) (2) function sol=exm041105_solve(s0,lam,q) sol=bvp4c(@(x,y,lam)ode(x,y,lam,q),@(ya,yb,lam)bc(ya,yb,lam),s0); function dydx=ode(x,y,lam,q) dydx=[y(2) (2*q*cos(2*x)-lam)*y(1)]; function res=bc(ya,yb,lam) res=[ya(1)-1 ya(2) yb(2)]; % <2> (3) clear lam0=1; q=5; x0=linspace(0,pi,5); for w=1:4 s0=bvpinit(x0,@(x)([cos(w*x);sin(w*x)]),lam0); S=exm041105_solve(s0,lam0,q); X{w}=S.x; % <8> Y{w}=S.y(1,:); % <9> lam(w)=S.parameters; subplot(2,2,w) plot(X{w},Y{w}) axis([0,pi,-inf,inf]) title(['{\omega}=',int2str(w),' ; ','{\lambda}=',num2str(lam(w))]) xlabel('x') ylabel('z') 59 end z z =1 ; =1.8584 4 2 0 z =2 ; =7.4495 1 0.5 0 -2 -0.5 -4 0 1 2 3 x =3 ; =1.8584 4 0 1 2 3 x =4 ; =17.0973 1 2 0.5 z 0 0 -2 -0.5 -4 0 1 2 3 0 1 2 3 x x 图 4.11-10 不同猜测所对应的解函数 4.12 最小值优化问题 4.12.1 MATLAB 最小值优化指令概述 (1) (2) 4.12.2 单变量局域优化指令 fminbnd (1) (2) (3)   【例 4.12-1】已知 y  x  cos(x)  e sin x1 ,在 10  x  10区间,求函数的极小值。 (1) syms x y=(abs(x)+cos(x))*exp(abs(sin(x)+1)); yd=diff(y,x); xs0=solve(yd) dy_xs0=vpa(subs(yd,x,xs0),6) y_xs0=vpa(subs(y,x,xs0),6) y_m_pi=vpa(subs(y,x,-10),6) 60 y_p_pi=vpa(subs(y,x,10),6) xs0 = matrix([[-227.76546738526000978854164528776]]) dy_xs0 = 0.0 y_xs0 = 227.76546738526000978854164528776 y_m_pi = 42.9042 y_p_pi = 14.4534 (2) x1=-10;x2=10; yx=@(x)(abs(x)+cos(x)).*exp(abs(sin(x)+1)); [xn0,fval,exitflag,output]=fminbnd(yx,x1,x2) xn0 = -1.5708 fval = 1.5708 exitflag = 1 output = iterations: 12 funcCount: 13 algorithm: [1x46 char] message: [1x112 char] (3) xx=-10:1/200:10; yxx=yx(xx); plot(xx,yxx) xlabel('x') ylabel('y') grid on 60 50 40 y 30 20 10 0 -10 -8 -6 -4 -2 0 2 4 6 x 图 4.12-1 [-10,10]区间中的函数曲线 8 10 61 图 4.12-2 函数极值点附近的局部放大和交互式取值 4.12.3 多变量无约束局域优化指令 fminsearch (1) (2) (3) 【例 4.12-2】如下 Rosenbrock's Banana Function 有唯一的理论最小值点 x  a , y  a2 。 f (x, y)  100( y  x2 )2  (a  x)2 (4.12-3) (1) (2) a=sqrt(3); fx=@(x)(100*(x(2)-x(1).^2).^2+(a-x(1)).^2); x0=[0;0]; opts=optimset('Plotfcns',@optimplotfval); %<4> [sx1,sfval1]=fminsearch(fx,x0,opts) %<5> sx1 = 1.7321 3.0000 sfval1 = 1.8800e-010 62 Current Function Value: 1.87999e-010 3 2.5 2 Function value 1.5 1 0.5 0 0 20 40 60 80 100 Iteration 图 4.12-3 属性值采用@optimplotfval 所绘制的寻优收敛曲线 (3) function [xs,fval,Fun]=exm041202_nested(a,x0) [xs,fval]=fminsearch(@fx,x0); Fun=100*(xs(2,:)-xs(1,:).^2).^2+(a-xs(1,:)).^2; function f=fx(x) f=(100*(x(2)-x(1)^2)^2+(a-x(1))^2); end end %<2> %<4> %<6> a=sqrt(3); x0=[-15,-5,0,2,6;-15,5,0,-2,6]; %<2> [xs,fval,Fun]=exm041202_nested(a,x0); disp('搜索到的最小值候选点') fprintf('%14.6g',xs(1,:)) %<5> fprintf('\n') fprintf('%14.6g',xs(2,:)) %<7> fprintf('\r') disp('候选点对应的目标函数值') fprintf('%14.6g',Fun) fprintf('\r\r') %<11> disp('注意:fminsearch 指令的第二输出量 fval 只给出最小目标值!') disp(fval) %<13> 搜索到的最小值候选点 1.73204 -14.378 0.00320991 2.88095 2.99995 7.64957 0.000537177 -2.59445 候选点对应的目标函数值 1.77495e-010 3.96346e+006 2.98892 11869.9 注意:fminsearch 指令的第二输出量 fval 只给出最小目标值! 1.7750e-010 120 6.60621 4.04368 156826 63 4.12.4 多变量约束局域优化指令 fmincon (1) (2) (3) 【例 4.12-3】在(4.12-8, 9)约束下,求(4.12-7)目标函数的最小值解。 f (x)  ex1 (4x12  2x22  4x1x2  2x2 1) x2 x1  20  x1  x1 11 (1) x2 0.1x1 1.8  x1  11 (2) clf x1=-15:0.5:-8;x2=-15:0.5:15; [X1,X2]=meshgrid(x1,x2); FX=@(X1,X2)exp(X1).*(4*X1.^2+2*X2.^2+4*X1.*X2+2*X2+1); surf(X1,X2,FX(X1,X2)) shading interp alpha(0.4) view([-140,26]) hold on % xx2=(x1+11)./sqrt(x1+20); plot3(x1,xx2,FX(x1,xx2),'r') plot3(x1,xx2,zeros(size(x1)),'b') x1e=x1(end);xx2e=xx2(end); plot3([x1e;x1e],[xx2e;xx2e],[0;FX(x1e,xx2e)],'b') % xxx2=-(11+x1)./abs(0.1*x1+1.8); plot3(x1,xxx2,FX(x1,xxx2),'r') plot3(x1,xxx2,zeros(size(x1)),'b') xxx2e=xxx2(end); plot3([x1e;x1e],[xxx2e;xxx2e],[0;FX(x1e,xxx2e)],'b') xlabel('x1'),ylabel('x2'),zlabel('fx') hold off (4.12-7) (4.12-8) (4.12-9) 64 图 4.12-4 在约束下的目标函数搜索曲面 (3) function [cx,ceqx]=exm041203_nonlcon(x) cx=[(-x(1)+x(2)*sqrt(x(1)+20)-11);(-x(1)-x(2)*abs(0.1*x(1)+1.8)-11)]; ceqx=[ ]; (4) fx=@(x)(exp(x(1))*(4*x(1)^2+2*x(2)^2+4*x(1)*x(2)+2*x(2)+1)); x0=[-16,-12,-8;10,4,-2]; opts = optimset('Algorithm','active-set'); % <3> [x,fval]=fmincon(fx,x0,[ ],[ ],[ ],[ ],[ ],[ ],@exm041203_nonlcon,opts) Local minimum found that satisfies the constraints. Optimization completed because the objective function is non-decreasing in feasible directions, to within the default value of the function tolerance,and constraints were satisfied to within the default value of the constraint tolerance. Active inequalities (to within options.TolCon = 1e-006): lower upper ineqlin ineqnonlin 1 2 x= -11.0000 -12.0000 -8.0000 0.0000 4.0000 -2.0000 fval = 0.0081 (5) [x,fval,exitflag,output,lambda,grad,hessian]=fmincon(fx,x0,[ ],[ ],[ ],[ ],[ ],[ ],@exm041203_nonlcon,opts) Local minimum found that satisfies the constraints. Optimization completed because the objective function is non-decreasing in feasible directions, to within the default value of the function 65 tolerance,and constraints were satisfied to within the default value of the constraint tolerance. Active inequalities (to within options.TolCon = 1e-006): lower upper ineqlin ineqnonlin 1 2 x= -11 0 fval = 0.0081 exitflag = 1 output = iterations: 2 funcCount: 6 lssteplength: 1 stepsize: 0 algorithm: [1x44 char] firstorderopt: 0 constrviolation: 0 message: [1x788 char] lambda = lower: [2x1 double] upper: [2x1 double] eqlin: [0x1 double] eqnonlin: [0x1 double] ineqlin: [0x1 double] ineqnonlin: [2x1 double] grad = 0.0066 -0.0007 hessian = 1.0e+010 * 2.7561 -1.8512 -1.8512 1.2434 (6) lambda.lower ans = 0 0 lambda.upper ans = 0 0 lambda.ineqnonlin ans = 0.0014 0.0052 (7) cx1=exm041203_nonlcon(x) cx1 = 1.0e-009 * 0.4029 -0.2446 4.12.5 GlobalSearch 实施的全域优化 (1) 66 (2) (3) 【例 4.12-4】求式(4.12-11)所示目标函数的全域最小值。 f (x, y)  g(r)h(t) g(r)  sin r  sin 2r  sin 3r  sin 4r  4 r 2  2 3 4  r 1 h(t)  2  cos t  cos(2t  0.5) 2 式中 x  r cos t , y  r sin t 。 (1) function f = exm041204_sawtooth(x) [t,r]=cart2pol(x(:,1),x(:,2)); %<2> h=cos(2*t-1/2)/2+cos(t)+2; g=(sin(r)-sin(2*r)/2+sin(3*r)/3-sin(4*r)/4+4).*r.^2./(r+1); f=g.*h; %<4> %<5> (2) x=-20:0.2:20; y=x; [X,Y]=meshgrid(x,y); XX=[X(:),Y(:)]; %<4> FXYv=exm041204_sawtooth(XX); FXY=reshape(FXYv,size(X,1),size(X,2));%<6> surf(X,Y,FXY) colormap(flipud(jet)) shading interp view([-35,44]) xlabel('x'),ylabel('y'),zlabel('FXY') (4.12-11) (4.12-12) (4.12-13) xc=-5:0.1:5; 图 4.12-5 有唯一全域最小和多局域最小的搜索曲面 67 yc=xc; [Xc,Yc]=meshgrid(xc,yc); XXc=[Xc(:),Yc(:)]; %<15> FXYvc=exm041204_sawtooth(XXc); FXYc=reshape(FXYvc,size(Xc,1),size(Xc,2)); %<17> contour(Xc,Yc,FXYc,30) colorbar xlabel('x'),ylabel('y') 图 4.12-6 多局域最小点的等位线表现图 (3) problem = createOptimProblem('fmincon',... 'options',optimset('Algorithm','sqp') ,... 'objective', @exm041204_sawtooth,'x0', [5,-5],'lb',-inf); % <3> (4) [xL,fval] = fmincon(problem) xL = -2.3363 2.8292 fval = 7.5734 (5) rng(0) % <1> stream=RandStream.getDefaultStream; load exm041204_randState set(stream,'State',sss) %<4> gs = GlobalSearch; [x,fval,exitflag,output,solutions] = run(gs,problem);%<6> GlobalSearch stopped because it analyzed all the trial points. All 5 local solver runs converged with a positive local solver exit flag. (6) x fval x= 1.0e-007 * 0.0414 0.1298 68 fval = 1.5467e-015 exitflag exitflag = 1 output output.message %<5> output = funcCount: 2581 localSolverTotal: 5 localSolverSuccess: 5 localSolverIncomplete: 0 localSolverNoSolution: 0 message: [1x137 char] ans = GlobalSearch stopped because it analyzed all the trial points. All 5 local solver runs converged with a positive local solver exit flag. solutions %<6> solutions = 1x3 GlobalOptimSolution Properties: X Fval Exitflag Output X0 solutions(1) %<7> ans = GlobalOptimSolution Properties: X: [4.1365e-009 1.2976e-008] Fval: 1.5467e-015 Exitflag: 1 Output: [1x1 struct] X0: {[1 1] [-184.7338 75.1540]} solutions(2) %<8> ans = GlobalOptimSolution Properties: X: [-2.3363 2.8292] Fval: 7.5734 Exitflag: 1 Output: [1x1 struct] X0: {[5 -5] [-137.6152 -70.7332]} solutions(3) %<9> ans = GlobalOptimSolution Properties: X: [-170.4493 206.3740] Fval: 688.9910 Exitflag: 2 Output: [1x1 struct] X0: {[-250.2947 94.5424]} 69 第 5 章 符号计算 符号计算的优点:凭借恒等式,数学定理,通过推理和演绎,给出具有“无限尺度” 描写能力的解析结果。当没有封闭解时,符号计算则妥协地给出任意精度数值解。所谓“无 限尺度”是相对数值计算的“有限精度、有限空间”而言的。 MATLAB 本身由数值计算引擎驱动,而没有符号演绎能力。2008 年前,MATLAB 的 符号计算能力借助于 Maple。现在,随 MATLAB 默认安装的符号计算引擎是 MuPAD。虽 然 MATLAB 尽力地保持着形式上的向前兼容,但引擎换装确实导致 MATLAB 符号计算环 境发生了根本改变。本章内容完全针对 MuPAD 引擎的符号计算而写,分三个层面:  无需任何 MuPAD 知识,仅使用 MATLAB 符号数学工具包(Symbolic math toolbox)提 供的(前台)函数实施的符号计算及仿真。本章第 1 节比较完整地描述了符号计算的 机理、规则和帮助系统。第 2 到第 6 节所涉内容包括微积分、微分方程、积分变换、 矩阵分析和代数方程。第 7 节代数状态方程和第 8 节数据探索的内容,用以表现现代 计算能力对传统方法或技巧的冲击。  需要少量 MuPAD 知识,拓展符号计算应用范围的内容安排在第 5.9 节。在这一节中不 仅讲述特殊函数计算,而且还介绍了如何利用符号函数产生 M 函数文件,如何利用符 号函数制作用户所需的 Simulink 模块。  需要较多 MuPAD 知识,借助 evalin 和 feval 指令进入 MuPAD 空间完成符号计算。 对于那些在 MATLAB 中仍选择 Maple 符号计算引擎的读者来说,本章第一层面的内容 仍可借鉴。 值得指出:随书光盘 mbook 目录上的“ch05_符号计算.doc”保存有本章全部算例的运 作指令、计算结果和图形;mfile 目录上则保存有本章算例中所有带 exm 前缀文件名的 M 文 件和 MEX 文件。 5.1 符号对象的产生和识别 5.1.1 基本符号对象的创建 1 定义符号数字和符号常数 2 定义基本符号变量 1 3 定义元符号表达式 5.1.2 符号计算中的算符和函数指令 1 符号计算中的算符 2 符号计算中的函数指令 5.1.3 符号对象、变量、自由变量的识别 1 符号对象的识别 【例 5.1-1】数据对象及其识别指令的使用。 (1) clear a=1;b=2;c=3;d=4; Mn=[a,b;c,d] Mc='[a,b;c,d]' Ms=sym(Mc) Mn = 1 2 3 4 Mc = [a,b;c,d] Ms = [ a, b] [ c, d] (2) SizeMn=size(Mn) SizeMc=size(Mc) SizeMs=size(Ms) SizeMn = 2 2 SizeMc = 1 9 SizeMs = 2 2 (3) CMn=class(Mn) CMc=class(Mc) CMs=class(Ms) CMn = double CMc = char CMs = sym (4) isa(Mn,'double') isa(Mc,'char') isa(Ms,'sym') ans = 1 ans = 1 2 ans = 1 (5) whos Mn Mc Ms Name Size Mc 1x9 Mn 2x2 Ms 2x2 Bytes Class 18 char 32 double 60 sym Attributes 2 符号变量及自由变量的认定 【例 5.1-2】基本符号变量和衍生符号表达式的定义、符号变量、自由符号变量的机器辨认。 (1) clear syms a b k t w x y z X A c=sym('22'); f=sym('M*N'); ex1=c+f+(exp(-a*t)*sin(w*t)+b*y+k*x+A*X+log(z)) ex1 = log(z) + b*y + k*x + sin(t*w)/exp(a*t) + A*X + M*N + 22 (2) symvar(ex1) %<6> ans = [ A, M, N, X, a, b, k, t, w, x, y, z] findsym(ex1) ans = A,M,N,X,a,b,k,t,w,x,y,z (3) symvar(ex1,20) %<8> ans = [ x, y, w, z, t, k, b, a, X, N, M, A] findsym(ex1,13) % ans = x,y,w,z,t,k,b,a,X,N,M,A (4) who %<10> % Your variables are: A X a ans b c ex1 f k t w x y z (5) dex1dx=diff(ex1,z) %<11> iex1db=int(ex1,b) %<12> dex1dx = 1/z iex1db = (y*b^2)/2 + (log(z) + k*x + sin(t*w)/exp(a*t) + A*X + M*N + 22)*b 【例 5.1-3】元符号表达式的定义、符号变量、自由符号变量的机器辨认。 3 (1) clear c=sym('22'); f=sym('M*N'); ex2=c+f+sym('exp(-a*t)*sin(w*t)+b*y+k*x+A*X+log(z)') ex2 = log(z) + b*y + k*x + sin(t*w)/exp(a*t) + A*X + M*N + 22 (2) symvar(ex2) %<5> ans = [ A, M, N, X, a, b, k, t, w, x, y, z] (3) symvar(ex2,20)%<6> ans = [ x, y, w, z, t, k, b, a, X, N, M, A] (4) who Your variables are: ans c ex2 f (5) dex1dx=diff(ex2,z) %<8> ??? Undefined function or variable 'z'. dex1db=int(ex2,b) %<9> ??? Undefined function or variable 'b'. (6) E3=sym('a*sqrt(theta)') % ??? Error using ==> sym.sym>convertExpression at 2547 Error: argument must be of 'Type::Arithmetical' [sqrt] Error in ==> sym.sym>convertChar at 2458 s = convertExpression(x); Error in ==> sym.sym>convertCharWithOption at 2441 s = convertChar(x); Error in ==> sym.sym>tomupad at 2195 S = convertCharWithOption(x,a); Error in ==> sym.sym>sym.sym at 111 S.s = tomupad(x,''); E4=sym('a*sqrt(theta123)') E4 = a*theta123^(1/2) % <7> 【例 5.1-4】symvar 确定自由变量是对整个数组进行的。 (1) clear syms a b t v w x y z A=[a+b*x,y*sin(t)+w;x*exp(-t),log(z)+v] A= [ a + b*x, w + y*sin(t)] [ x/exp(t), v + log(z)] 4 (2) symvar(A,1) ans = x symvar(A,3) ans = [ x, y, w] symvar(A,10) ans = [ x, y, w, z, v, t, b, a] 5.1.4 符号运算机理和变量假设 1 符号运算的工作机理 2 对符号变量的限定性假设 (1) (2) 3 清除变量和撤销假设 【例 5.1-5】syms 对变量所作限定性假设的影响。 (1) syms x clear f=x^3+4.75*x+2.5; rf=solve(f,x) rf = -1/2 1/4 - (79^(1/2)*i)/4 1/4 + (79^(1/2)*i)/4 evalin(symengine,'getprop(x)') ans = C_ %<4> evalin(symengine,'property::showprops(x);') %<5> ans = [ empty sym ] (2) syms x real rfr=solve(f,x) rfr = -1/2 evalin(symengine,'getprop(x)') ans = R_ %<8> evalin(symengine,'property::showprops(x);')%<9> ans = [x in R_] 5 (3) clear x syms x g=x^2+x+5; rg=solve(g,x) Warning: Explicit solution could not be found. > In solve at 81 rg = [ empty sym ] (4) syms x clear rg=solve(g,x) rg = - 1/2 - (19^(1/2)*i)/2 - 1/2 + (19^(1/2)*i)/2 【例 5.1-6】借助 evalin 对符号变量进行假设的设定和撤销。 (1) clear syms x f=x^3-5.25*x-2.5; rf=feval(symengine,'solve',f,'x') %<4> rf = [ -1/2, 5/2, -2] (2) x=sym(x,'positive'); rf=feval(symengine,'solve',f,'x') rf = 5/2 %<6> rfs=solve(f,x) rfs = 5/2 evalin(symengine,'getprop(x)') ans = Dom::Interval(0, Inf) %<8> evalin(symengine,'delete x') evalin(symengine,'getprop(x)') ans = C_ %<10> (3) evalin(symengine,'assume(x,Type::Integer);') rf=feval(symengine,'solve',f,'x') rf = -2 %<11> %<12> evalin(symengine,'assumeAlso(x>0)') rf_ev=evalin(symengine,'solve(x^3-5.25*x-2.5);') rf_evc=evalin(symengine,['solve(',char(f),')']) rf_f=feval(symengine,'solve',f,'x') rf_ev = [ empty sym ] rf_evc = [ empty sym ] rf_f = [ empty sym ] %<13> %<14> %<15> %<16> 6 evalin(symengine,'assume(x, Type::Complex);') %<17> rf=feval(symengine,'solve',f,'x') %<18> rf = [ -1/2, 5/2, -2] (4) syms %<19> 'ans' 'f' 'rf' 'rf_ev' 'rf_evc' 'rf_f' 'rfs' 'x' 5.1.5 符号帮助及其他常用指令 1 符号运作的帮助体系 (1)“直接调用符号计算指令”的求助 (2)借助 mfun 调用的“特殊函数指令”的求助 (3)借助 evalin 或 feval 调用的“MuPAD 指令”的求助。 【例 5.1-7】关于 laplace, erfc, rec 三个指令的求助过程。 (1) (2) 图 5.1-1 “可直接调用的符号计算指令”的帮助信息搜索 7 (3) 图 5.1-2 MATLAB 帮助浏览器展示全部特殊函数符号计算指令及用法 8 图 5.1-3 MuPAD 帮助浏览器展示的 rec 指令帮助信息 2 服务于符号运作的其他指令 【例 5.1-8】各种帮助指令、符号变量罗列指令 (1) clear all reset(symengine) %<2> Da=1.2;Dw=1/3; % syms sa sw sx sy sz % syms A B positive %<5> syms C real %<6> (2) whos Name A B C Da Dw sa sw sx sy sz (3) syms Size 1x1 1x1 1x1 1x1 1x1 1x1 1x1 1x1 1x1 1x1 %<7> Bytes Class 60 sym 60 sym 60 sym 8 double 8 double 60 sym 60 sym 60 sym 60 sym 60 sym Attributes %<8> 9 'A' 'B' 'C' 'sa' 'sw' 'sx' 'sy' 'sz' (4) evalin(symengine,'anames(Properties)') ans = [ A, B, C] (5) clear A syms %<11> 'B' 'C' 'ans' 'sa' 'sw' 'sx' 'sy' %<9> 'sz' evalin(symengine,'anames(Properties)') ans = [ A, B, C] (6) syms B clear %<13> syms 'B' 'C' 'ans' 'sa' 'sw' 'sx' 'sy' % <12> 'sz' evalin(symengine,'anames(Properties)') ans = [ A, C] % <15> 5.2 数字类型转换及符号表达式操作 5.2.1 数字类型及转换 1 三种数字类型及转换指令 图 5.2-1 符号、字符、数值间的相互转换 10 2 双精度数字向符号数字转换 【例 5.2-1】本例目的:准确符号数字的产生;双精度数字转换成符号数字的各种格式;由 双精度数字转换而得符号数的误差;vpa 的用法;数字类别的判断。 (1) clear sa=sym('1/3') %<2> sb=sym('pi+sqrt(5)') %<3> sa = 1/3 sb = pi + 5^(1/2) (2) format long a=1/3 %<5> b=pi+sqrt(5) %<6> sa_a=vpa(sa-a) %<7> sb_b=vpa(sb-b) %<8> a= 0.333333333333333 b= 5.377660631089583 sa_a = 0.0 sb_b = 0.000000000000000013822375841085200048593542564188 (3) asr=sym(a) bsr=sym(b) sa_asr=vpa(sa-asr) sb_bsr=vpa(sb-bsr) asr = 1/3 bsr = 189209612611719/35184372088832 sa_asr = 0.0 sb_bsr = 0.000000000000000013822375841085200048593542564188 (4) ase=sym(a,'e') bse=sym(b,'e') sa_ase=vpa(sa-ase) sb_bse=vpa(sb-bse) ase = 1/3 - eps/12 bse = 189209612611719/35184372088832 sa_ase = 0.083333333333333333333333333333333*eps sb_bse = 0.000000000000000013822375841085200048593542564188 (5) asf=sym(a,'f') bsf=sym(b,'f') sa_asf=vpa(sa-asf) sb_bsf=vpa(sb-bsf) 11 asf = 6004799503160661/18014398509481984 bsf = 189209612611719/35184372088832 sa_asf = 0.000000000000000018503717077085942340393861134847 sb_bsf = 0.000000000000000013822375841085200048593542564188 (6) asd=sym(a,'d') bsd=sym(b,'d') sa_asd=vpa(sa-asd) sb_bsd=vpa(sb-bsd) asd = 0.33333333333333331482961625624739 bsd = 5.3776606310895829210494412109256 sa_asd = 0.000000000000000018503717077085943333333327037792 sb_bsd = 0.000000000000000013822375841085179119638453173161 (7) class(sa) ans = sym disp('a 的类别 asr 的类别 sa_a 的类别') disp([class(a),blanks(4),class(asr),blanks(7),class(sa_a)]) a 的类别 asr 的类别 sa_a 的类别 double sym sym 【例 5.2-2】本例目的:揭露字符串数字在不同计算引擎中的不同表现;指令 format 的用法; double 与 str2double 的区别。 (1) clear format long %<2> ad=1/2+3^(2/3) astr='1/2+3^(2/3)' asym=sym(astr) ad = 2.580083823051904 astr = 1/2+3^(2/3) asym = 3^(2/3) + 1/2 (2) disp(' ad astr asym') disp([blanks(6),' 的数据类别']) disp([class(ad),blanks(3),class(astr),blanks(4),class(asym)]) ad astr asym 的数据类别 double char sym (3) asymPLUSad=asym+sym(0.1) asymPLUSda2=asym+0.1 asymPLUSad = 3^(2/3) + 3/5 %<9> %<10> 12 asymPLUSda2 = 3^(2/3) + 3/5 (4) astr==asym ans = 1 asym2=asym+sym('0.1') astr2=asym+'0.1' asym2 = 3^(2/3) + 0.6 astr2 = 3^(2/3) + 0.6 %<12> %<13> (5) get(0,'format') %<14> format %<15> format compact %<16> disp('字符串''0.1''的 ASCII 码值数组') disp(double('0.1')) ad ans = long 字符串'0.1'的 ASCII 码值数组 48 46 49 ad = 2.5801 ad3=ad+double('0.1') astr3=ad+'0.1' ad3 = 50.5801 48.5801 astr3 = 50.5801 48.5801 %<20> %<21> 51.5801 51.5801 (6) asym+sym(ad)+sym('0.1') %<22> asym_ad_str=asym+ad+'0.1' %<23> ans = 3^(2/3) + 3.1800838230519040905619476689026 asym_ad_str = 3^(2/3) + 3.1800838230519040905619476689026 (7) da=double('a') sda=str2double('a') d3=double('3') sd3=str2double('3') da = 97 sda = NaN d3 = 51 sd3 = 3 13 3 符号数字向双精度数字转换 【例 5.2-3】double 指令的不同作用。 (1) clear format long ad=1/2+sqrt(2) astr='1/2+sqrt(2)' asym=sym(astr) ad = 1.914213562373095 astr = 1/2+sqrt(2) asym = 2^(1/2) + 1/2 (2) double_asym=double(asym) double_asym==ad double_asym = 1.914213562373095 ans = 1 (3) format format compact double(astr) ad ans = 49 47 50 43 115 113 114 116 40 50 41 ad = 1.9142 4 符号数字的任意精度表达形式 【例 5.2-4】本例演示:digits 的用法及影响;vpa 指定符号数字有效位的影响和含义;符号 计算引擎的重置指令 reset(symengine)。 (1) reset(symengine) %<1> sa=sym('1/3+sqrt(2)') sa = 2^(1/2) + 1/3 (2) digits %<3> Digits = 32 format long a=1/3+sqrt(2) sa_Plus_a=vpa(sa+a,20) sa_Minus_a=vpa(sa-a,20) a= 1.747546895706428 sa_Plus_a = 3.4950937914128567869 %<6> %<7> 14 sa_Minus_a = -0.000000000000000022658064826339973669 (3) sa32=vpa(sa) %<8> digits(48) %<9> sa5=vpa(sa,5) %<10> sa48=vpa(sa) %<11> sa32 = 1.747546895706428382135022057543 sa5 = 1.7475 sa48 = 1.74754689570642838213502205754303141190300520871 (4) a b=a+1/10^12 a= 1.747546895706428 b= 1.747546895707429 a5=vpa(a,5),b5=vpa(b,5) a5 = 1.7475 b5 = 1.7475 a5==b5 ans = 0 5.2.2 符号表达式的简化操作 【例 5.2-5】各种简化指令的使用示例。 (1) syms x y (2) p=x^4 - 6*x^3 + 6*x^2 - 6*x + 5; cp=coeffs(p) hp=horner(p) sp=simple(p) cp = [ 5, -6, 6, -6, 1] hp = x*(x*(x*(x - 6) + 6) - 6) + 5 sp = (x^2 + 1)*(x - 1)*(x - 5) (3) q=x^4-2*x^3-16*x^2+2*x+15; pq=p/q fpq=factor(pq) pq = (x^4 - 6*x^3 + 6*x^2 - 6*x + 5)/(x^4 - 2*x^3 - 16*x^2 + 2*x + 15) fpq = (x^2 + 1)/((x + 3)*(x + 1)) 15 (4) np=factor(3366438) prod(np) np = 2 3 ans = 3366438 131 4283 (5) f=(x-3)*(x-2)/((x-7)*(x-5)) [Num,Den]=numden(f) ef=expand(f) eef=expand(ef) f= ((x - 2)*(x - 3))/((x - 5)*(x - 7)) Num = (x - 2)*(x - 3) Den = (x - 5)*(x - 7) ef = (x^2 - 5*x + 6)/(x^2 - 12*x + 35) eef = 6/(x^2 - 12*x + 35) - (5*x)/(x^2 - 12*x + 35) + x^2/(x^2 - 12*x + 35) (6) trif=(tan(x)+tan(y))/(tan(x)*tan(y)-1) strif=simple(trif) trif = (tan(x) + tan(y))/(tan(x)*tan(y) - 1) strif = -tan(x + y) (7) s=exp(-x)*x*y+exp(x)*y+exp(-x)*x^2+x*y*sin(y) csx=collect(s) csy=collect(s,y) csexp=collect(s,exp(-x)) s= x^2/exp(x) + y*exp(x) + x*y*sin(y) + (x*y)/exp(x) csx = x^2/exp(x) + (y/exp(x) + y*sin(y))*x + y*exp(x) csy = (exp(x) + x/exp(x) + x*sin(y))*y + x^2/exp(x) csexp = (x^2 + y*x)/exp(x) + y*exp(x) + x*y*sin(y) (8) A=[3/2,(x^2+3)/(2*x-1)+3*x/(x-1);4/x^2+3/x,(x^2-3*x+4)] fA=factor(A) [NA,DA]=numden(fA) B=NA./DA A= [ 3/2, (3*x)/(x - 1) + (x^2 + 3)/(2*x - 1)] [ 3/x + 4/x^2, x^2 - 3*x + 4] fA = [ 3*2^(-1), (x^3 + 5*x^2 - 3)/((2*x - 1)*(x - 1))] [ (3*x + 4)/x^2, x^2 - 3*x + 4] NA = [ 3, x^3 + 5*x^2 - 3] [ 3*x + 4, x^2 - 3*x + 4] DA = [ 2, (2*x - 1)*(x - 1)] [ x^2, 1] 16 B= [ 3/2, (x^3 + 5*x^2 - 3)/((2*x - 1)*(x - 1))] [ (3*x + 4)/x^2, x^2 - 3*x + 4]] 5.2.3 表达式中的置换操作 1 公因子法简化表达 【例 5.2-6】对符号矩阵 A  a c b d    进行特征向量分解。 (1) clear A=sym('[a b;c d]') [V,D]=eig(A) A= [ a, b] [ c, d] 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] (2) subexpr([V;D]) %<4> who sigma = (a^2 - 2*a*d + d^2 + 4*b*c)^(1/2) ans = [ (a/2 + d/2 - sigma/2)/c - d/c, (a/2 + d/2 + sigma/2)/c - d/c] [ 1, 1] [ a/2 + d/2 - sigma/2, 0] [ 0, a/2 + d/2 + sigma/2] Your variables are: A D V ans sigma (3) Dw=subexpr(D,'w') w= (a^2 - 2*a*d + d^2 + 4*b*c)^(1/2) Dw = [ a/2 + d/2 - w/2, 0] [ 0, a/2 + d/2 + w/2] (4) [RVD,w]=subexpr([V;D],'w') %<7> RVD = [ (a/2 + d/2 - w/2)/c - d/c, (a/2 + d/2 + w/2)/c - d/c] [ 1, 1] [ a/2 + d/2 - w/2, 0] [ 0, a/2 + d/2 + w/2] w= (a^2 - 2*a*d + d^2 + 4*b*c)^(1/2) 17 2 通用置换指令 【例 5.2-7】本例目的:用简单算例演示 subs 的各种置换方式;演示符号计算与数值计算之 间的一种转换途径。 (1) clear syms a b x; f=a*sin(x)+b f= b + a*sin(x) (2) f1=subs(f,sin(x),'log(y)') %<4> class(f1) f1 = b + a*log(y) ans = sym (3) f2=subs(f,a,3.11) class(f2) f2 = b + (311*sin(x))/100 ans = sym (4) f3=subs(f,{a,b,x},{2,5,sym('pi/3')}) %<8> class(f3) f3 = 3^(1/2) + 5 ans = sym (5) format format compact f4=subs(f,{a,b,x},{2,5,pi/3}) class(f4) f4 = 6.7321 ans = double %<12> (6) f5=subs(f,x,0:pi/2:pi) class(f5) f5 = [ b, a + b, (4967757600021511*a)/40564819207303340847894502572032 + b] ans = sym (7) t=0:pi/10:2*pi; f6=subs(f,{a,b,x},{2,3,t}) plot(t,f6) f6 = Columns 1 through 7 %<17> 18 3.0000 3.6180 4.1756 Columns 8 through 14 4.6180 4.1756 3.6180 Columns 15 through 21 1.0979 1.0000 1.0979 4.6180 3.0000 1.3820 5 4.5 4 3.5 3 2.5 2 1.5 1 0 1 2 3 4 4.9021 2.3820 1.8244 5.0000 1.8244 2.3820 4.9021 1.3820 3.0000 5 6 7 图 5.2-2 利用符号表达式变量置换产生的单根曲线 (8) k=(0.5:0.1:1)'; f6=subs(subs(f,{a,b},{k,2}),x,t); size(f6) plot(t,f6) ans = 6 21 %<20> 3 2.8 2.6 2.4 2.2 2 1.8 1.6 1.4 1.2 1 0 1 2 3 4 5 6 7 图 5.2-3 利用两次 subs 置换产生的多根曲线 19 【例 5.2-8】借助 subs,对符号矩阵 A  a c b d    特征值、特征相量进行简化。 (1) clear A=sym('[a b;c d]'); [V,D]=eig(A); subexpr([V;D]); %<4> sigma = (a^2 - 2*a*d + d^2 + 4*b*c)^(1/2) (2) Q=sigma^2; VDq=subs([V;D],Q,'Q'); Vq=VDq(1:size(V,1),:) Dq=VDq(size(V,1)+1:end,:) %<6> %<7> Vq = [ (a/2 + d/2 - Q^(1/2)/2)/c - d/c, (a/2 + d/2 + Q^(1/2)/2)/c - d/c] [ 1, 1] Dq = [ a/2 + d/2 - Q^(1/2)/2, 0] [ 0, a/2 + d/2 + Q^(1/2)/2] 5.3 符号微积分 5.3.1 极限和导数的符号计算 【例 5.3-1】两种重要极限 lim sin kt 和 lim 1  1 kx   。 t0 kt x x  syms t x k s=sin(k*t)/(k*t); f=(1-1/x)^(k*x); Lsk=limit(s,0) Ls1=subs(Lsk,k,1) Lf=limit(f,x,inf) Lf1=vpa(subs(Lf,k,sym('-1')),48) Lsk = 1 Ls1 = 1 Lf = 1/exp(k) Lf1 = 2.7182818284590452353602874713526624977572470937 【例 5.3-2】对 f a  t cos x t3 ln x    求 df dx , d2 f dt 2 , d2 f dtdx 。 syms a t x; f=[a,t^3;t*cos(x), log(x)]; df=diff(f) dfdt2=diff(f,t,2) dfdxdt=diff(diff(f,x),t) df = [ 0, 0] 20 [ -t*sin(x), 1/x] dfdt2 = [ 0, 6*t] [ 0, 0] dfdxdt = [ 0, 0] [ -sin(x), 0]  f1 【例 5.3-3】求 f (x1, x2 )   x1e x2   x2 cos(x1) sin(x2    ) 的 Jacobian 矩阵   x1  f2    x1 f 3  x1 syms x1 x2; f=[x1*exp(x2);x2;cos(x1)*sin(x2)]; v=[x1;x2]; %<3> Jf=jacobian(f,v) % Jf = [ exp(x2), x1*exp(x2)] [ 0, 1] [ -sin(x1)*sin(x2), cos(x1)*cos(x2)] f1 x2    f2  。 x2 f 3    x2  【例 5.3-4】 f (x)  sin x ,求 f x(0) , f x(x) 。 (1) clear syms x syms d positive f_p=sin(x); df_p=limit((subs(f_p,x,x+d)-f_p)/d,d,0) df_p0=limit((subs(f_p,x,d)-subs(f_p,x,0))/d,d,0) df_p = cos(x) df_p0 = 1 %<5> %<6> (2) f_n=sin(-x); df_n=limit((f_n-subs(f_n,x,x-d))/d,d,0) %<8> df_n0=limit((subs(f_n,x,0)-subs(f_n,x,-d))/d,d,0) %<9> df_n = -cos(x) df_n0 = -1 (3) f=sin(abs(x)); dfdx=diff(f,x) dfdx0=subs(dfdx,x,0) dfdx = cos(abs(x))*sign(x) dfdx0 = 0 %<11> %<12> (4) xn=-3/2*pi:pi/50:0;xp=0:pi/50:3/2*pi;xnp=[xn,xp(2:end)]; hold on plot(xnp,subs(f,x,xnp),'k','LineWidth',3) % <14> 21 plot(xn,subs(df_n,x,xn),'--r','LineWidth',3) plot(xp,subs(df_p,x,xp),':r','LineWidth',3) legend(char(f),char(df_n),char(df_p),'Location','NorthEast') grid on xlabel('x') hold off % <17> 1 0.8 0.6 0.4 0.2 0 -0.2 -0.4 -0.6 -0.8 -1 -5 -4 -3 -2 -1 0 1 2 x 图 5.3-1 函数及其导函数 sin(abs(x)) -cos(x) cos(x) 3 4 5 【例 5.3-5】设 cos(x  sin y)  sin y ,求 dy 。 dx (1) clear syms x g=sym('cos(x+sin(y(x)))=sin(y(x))') %<3> dgdx=diff(g,x) %<4> g= cos(x+sin(y(x)))=sin(y(x)) dgdx = -sin(x + sin(y(x)))*(cos(y(x))*diff(y(x), x) + 1) = cos(y(x))*diff(y(x), x) (2) dgdx1=subs(dgdx,'diff(y(x),x)','dydx') %<5> dgdx1 = -sin(x + sin(y(x)))*(dydx*cos(y(x)) + 1) = dydx*cos(y(x)) (3) dydx=solve(dgdx1,'dydx') dydx = -sin(x + sin(y(x)))/(cos(y(x)) + cos(y(x))*sin(x + sin(y(x)))) 【例 5.3-6】求 f (x)  xe x 在 x  0 处展开的 8 阶 Maclaurin 级数。 (1) syms x r=taylor(x*exp(x),9,x,0) pretty(r) %<2> 22 r= x^8/5040 + x^7/720 + x^6/120 + x^5/24 + x^4/6 + x^3/2 + x^2 + x 8 7 6 543 x x x xxx 2 ---- + --- + --- + -- + -- + -- + x + x 5040 720 120 24 6 2 (2) R = evalin(symengine,'series(x*exp(x),x=0,8)') % <4> pretty(R) R= x + x^2 + x^3/2 + x^4/6 + x^5/24 + x^6/120 + x^7/720 + x^8/5040 + O(x^9) 3456 7 8 2x x x x x x 9 x + x + -- + -- + -- + --- + --- + ---- + O(x ) 2 6 24 120 720 5040 5.3.2 序列/级数的符号求和    【例 5.3-7】求 n k 1 1 k(k  1) ,  k 1 x 2k 1 2k 1 ,  k 1    (2k 1  1)2 , (1)k k    。 (1) syms n k f1=1/(k*(k+1)); s1=symsum(f1,k,1,n) s1 = n/(n + 1) (2) f2=x^(2*k-1)/(2*k-1); s2=symsum(f2,k,1,inf) s2 = piecewise([abs(x) < 1, atanh(x)]) (3) f3=[1/(2*k-1)^2,(-1)^k/k]; s3=symsum(f3,k,1,inf) s3 = [ pi^2/8, -log(2)] 5.3.3 符号积分 【例 5.3-8】本例演示:符号积分指令的使用;对符号积分的理解;符号参数的限定假设的 影响;Beta 函数和 Gamma 函数。 (1) clear syms a b x f1=x*log(x) s1=int(f1,x) s1=simple(s1) %<5> f1 = x*log(x) s1 = 23 (x^2*(log(x) - 1/2))/2 s1 = x^2*(log(x)/2 - 1/4) (2) f2=[a*x,b*x^2;1/x,sin(x)] disp(' ') disp('The integral of f is') pretty(int(f2)) f2 = [ a*x, b*x^2] [ 1/x, sin(x)] The integral of f is +- -+ | 2 3| | ax bx | | ----, ---- | |2 3 | | | | log(x), -cos(x) | +- -+ (3) f3=log(x)*log(1-x); s3=int(f3,x,0,1) s3 = 2 - pi^2/6 (4) syms x n f41=sin(x)^n; s41=int(f41,x,0,pi/2) %<14> Warning: Explicit integral could not be found. s41 = piecewise([-1 < Re(n), beta(1/2, n/2 + 1/2)/2], [Re(n) <= -1, int(x^n/(1 - x^2)^(1/2), x = 0..1)]) syms n positive f42=sin(x)^n; s42=int(f42,x,0,pi/2) s42 = beta(1/2, n/2 + 1/2)/2 %<15> %<17> s42n4=subs(s42,n,'4') %<18> s42n4vpa=vpa(s42n4) s42n4 = (3*pi)/16 s42n4vpa = 0.589048622548086232211745634364906790786969262383 (5) format long g1=gamma(0.5) g2=gamma(2.5) g3=gamma(0.5+2.5) s4_nn=g1*g2/g3/2 g1 = 1.772453850905516 g2 = 1.329340388179137 g3 = 2 24 s4_nn = 0.589048622548086    【例 5.3-9】求三重积分 2 x2 x2y (x2  y2  z2 )dzdydx 。 1 x xy syms x positive syms y z F2=int(int(int(x^2+y^2+z^2,z,sqrt(x*y),x^2*y),y,sqrt(x),x^2),x,1,2) VF2=vpa(F2) F2 = (14912*2^(1/4))/4641 - (6072064*2^(1/2))/348075 + (64*2^(3/4))/225 + 1610027357/6563700 VF2 = 224.921535733311431597907100328046757677071376012 【例 5.3-10】求阿基米德(Archimedes)螺线 r  a  , (a  0) 在  0 到 间的曲线长 度函数,并求出 a  1,  2 时的曲线长度。 (1) syms a r theta phi r=a*theta; x=r*cos(theta); y=r*sin(theta); dLdth=sqrt(diff(x,theta)^2+diff(y,theta)^2); warning off %<5> L=simple(int(dLdth,theta,0,phi)) %<6> L= ((asinh(phi) + phi*(phi^2 + 1)^(1/2))*(a^2)^(1/2))/2 (2) L_2pi=subs(L,[a,phi],sym('[1,2*pi]')) L_2pi_vpa=vpa(L_2pi) L_2pi = asinh(2*pi)/2 + pi*(4*pi^2 + 1)^(1/2) L_2pi_vpa = 21.256294148209098800702512272566 (3) L1=subs(L,a,sym('1')); ezplot(L1*cos(phi),L1*sin(phi),[0,2*pi]) grid on hold on x1=subs(x,a,sym('1')); y1=subs(y,a,sym('1')); h1=ezplot(x1,y1,[0,2*pi]); %<14> set(h1,'Color','r','LineWidth',5) title(' ') %<16> legend('螺线长度-幅角曲线','阿基米德螺线') hold off 25 y 4 螺 线 长 度 -幅 角 曲 线 阿基米德螺线 2 0 -2 -4 -6 -8 -10 -12 -14 -16 -5 0 5 10 15 20 x 图 5.3-2 阿基米德螺线(粗红)和螺线长度函数(细蓝) 5.4 微分方程的符号解法 5.4.1 符号解法和数值解法的互补作用 5.4.2 求微分方程符号解的一般指令 5.4.3 微分方程符号解示例 【例 5.4-1】求 dx  y, dy  x 的解。 dt dt clear all %<1> S=dsolve('Dx=y,Dy=-x') disp(' ') disp(['微分方程的解',blanks(8),'x',blanks(20),'y']) disp([S.x,S.y]) S= y: [1x1 sym] x: [1x1 sym] 微分方程的解 x y [ C2*cos(t) + C1*sin(t), C1*cos(t) - C2*sin(t)] 【例 5.4-2】图示微分方程 y  xy  ( y)2 的通解和奇解的关系。 (1) clear all %<1> y=dsolve('(Dy)^2-x*Dy+y=0','x') %<2> y= 26 x^2/4 C3*x - C3^2 (2) clf,hold on hy1=ezplot(y(1),[-6,6,-4,8],1); %<4> set(hy1,'Color','r','LineWidth',5) for k=-2:0.5:2 %<6> y2=subs(y(2),'C3',k); %<7> ezplot(y2,[-6,6,-4,8],1) end %<9> hold off box on legend('奇解','通解','Location','Best') ylabel('y') title(['\fontsize{14}微分方程',' (y '')^2 – xy '' + y = 0 ','的解']) 微分方程 (y ')2 – xy ' + y = 0 的解 8 奇解 通解 6 4 y 2 0 -2 -4 -6 -4 -2 0 2 4 6 x 图 5.4-1 通解和奇解曲线 【例 5.4-3】求解两点边值问题: xy  3y  x2 , y(1)  0, y(5)  0 。 (1) y=dsolve('x*D2y-3*Dy=x^2','y(1)=0,y(5)=0','x') y= (31*x^4)/468 - x^3/3 + 125/468 (2) xn=-1:6; yn=subs(y,'x',xn) ezplot(y,[-1,6]) hold on plot([1,5],[0,0],'.r','MarkerSize',20) text(1,1,'y(1)=0') text(4,1,'y(5)=0') title(['x*D2y - 3*Dy = x^2',', y(1)=0,y(5)=0']) hold off yn = 27 Columns 1 through 7 0.6667 0.2671 Column 8 14.1132 0 -1.3397 -3.3675 -4.1090 x*D2y - 3*Dy = x2, y(1)=0,y(5)=0 5 4 3 2 1 y(1)=0 0 -1 -2 -3 -4 y(5)=0 -1 0 1 2 3 4 5 6 x 图 5.4-2 两点边值问题的解曲线 0.0000 5.5 符号变换和符号卷积 5.5.1 Fourier 变换及其反变换 【例 5.5-1】求单位阶跃函数的 Fourier 变换。 (1) syms t w ut=heaviside(t); UT=fourier(ut) UT = pi*dirac(w) - i/w (2) Ut=ifourier(UT,w,t) SUt=simple(Ut) %<5> Ut = (pi + pi*(2*heaviside(t) - 1))/(2*pi) SUt = heaviside(t) (3) t=-2:0.01:2; ut=heaviside(t); kk=find(t==0); %<8> plot(t(kk),ut(kk),'.r','MarkerSize',30) hold on ut(kk)=NaN; %<10> plot(t,ut,'-r','LineWidth',3) 28 plot([t(kk),t(kk)],[ut(kk-1),ut(kk+1)],'or','MarkerSize',10) hold off grid on axis([-2,2,-0.2,1.2]) xlabel('\fontsize{14}t'),ylabel('\fontsize{14}ut') title('\fontsize{14}Heaviside(t)') Heaviside(t) ut 1 0.8 0.6 0.4 0.2 0 -0.2 -2 -1.5 -1 -0.5 0 0.5 1 1.5 2 t 图 5.5-1 Heaviside(t) 定义的单位阶跃函数 【例 5.5-2】利用 Heaviside 函数构成矩形脉冲 y  A   0 t  /2 的 Fourier 变换。 t  /2 (1) syms A t w tao yt=A*(heaviside(t+tao/2)-heaviside(t-tao/2)); Yw=fourier(yt,t,w) Yw_fy=simplify(Yw) Yw_fy_e=simple(Yw_fy) Yw = A*((sin((tao*w)/2) + cos((tao*w)/2)*i)/w - (- sin((tao*w)/2) + cos((tao*w)/2)*i)/w) Yw_fy = (2*A*sin((tao*w)/2))/w Yw_fy_e = (2*A*sin((tao*w)/2))/w (2) Yt=ifourier(Yw_fy_e,w,t) Yt_e=simple(Yt) %<7> Yt_fy=simplify(Yt) %<8> Yt = -(A*(pi*heaviside(t - tao/2) - pi*heaviside(t + tao/2)))/pi Yt_e = A*heaviside(t + tao/2) - A*heaviside(t - tao/2) Yt_fy = -A*(heaviside(t - tao/2) - heaviside(t + tao/2)) (3) t3=3; tn=-3:0.1:3; yt13=subs(yt,{A,tao},{1,t3}) 29 yt13n=subs(yt13,'t',tn); kk=find(tn==-t3/2|tn==t3/2); %<13> plot(tn(kk),yt13n(kk),'.r','MarkerSize',30) yt13n(kk)=NaN; %<15> hold on plot(tn,yt13n,'-r','LineWidth',3) hold off grid on axis([-3,3,-0.5,1.5]) yt13 = heaviside(t + 3/2) - heaviside(t - 3/2) 1.5 1 0.5 0 -0.5 -3 -2 -1 0 1 2 3 图 5.5-2 由 Heaviside(t) 构造的矩形波 (4) Yw13=subs(Yw_fy_e,{A,tao},{1,t3}); subplot(2,1,1),ezplot(Yw13),grid on subplot(2,1,2),ezplot(abs(Yw13)),grid on (2 sin((3 w)/2))/w 3 2 1 0 -1 -6 -4 -2 0 2 4 6 w (2 abs(sin((3 w)/2)))/abs(w) 3 2 1 0 -6 -4 -2 0 2 4 6 w 图 5.5-3 矩形脉冲的频率曲线和幅度频谱 30 【例 5.5-3】求 f (t)  e (tx)  0 tx 的 Fourier 变换,在此 x 是参数, t 是时间变量。 tx (1) clear syms t x w ft=exp(-(t-x))*heaviside(t-x); %<3> gt=exp(-(t-x)); %<4> (2) F1=simple(fourier(ft,t,w)) G1=simple(fourier(gt,t,w)) F1 = (1/exp(w*x*i))/(1 + w*i) G1 = exp(x)*transform::fourier(1/exp(t), t, -w) (2) F2=simple(fourier(ft,t)) F3=simple(fourier(ft)) F2 = -exp(t^2*i)/(- 1 + t*i) F3 = -(1/exp(t*w*i))/(- 1 + w*i) 5.5.2 Laplace 变换及其反变换 【例 5.5-4】分别求 eat sin bt , u(t  a) ,  (t  b) , t n 的 Laplace 变换。 (1) syms t s a b f1=exp(-a*t)*sin(b*t) F1=laplace(f1,t,s) f1 = sin(b*t)/exp(a*t) F1 = b/((a + s)^2 + b^2) %<2> (2) sym a clear %<4> f2=heaviside(t-a) F2=laplace(f2,t,s) ans = a f2 = heaviside(t - a) F2 = laplace(heaviside(t - a), t, s) syms a positive F3=laplace(f2) F3 = 1/(s*exp(a*s)) %<7> (3) f4=dirac(t-b); F4=laplace(f4,t,s) F4 = piecewise([b < 0, 0], [0 <= b, 1/exp(b*s)]) 31 f5=dirac(t-a); %<11> F5=laplace(f5,t,s) ft_F5=ilaplace(F5,s,t) F5 = 1/exp(a*s) ft_F5 = dirac(a - t) (4) n=sym('n','clear'); %<14> F6=laplace(t^n,t,s) F6 = piecewise([-1 < Re(n), gamma(n + 1)/s^(n + 1)]) n=sym('n','positive') %<16> F6=laplace(t^n,t,s) %<17> n= n F6 = gamma(n + 1)/s^(n + 1) 5.5.3 Z 变换及其反变换 【例 5.5-5】一组 Z 变换、反变换算例。 (1) clear syms n z clear %<2> gn=6*(1-(1/2)^n) G=simple(ztrans(gn,n,z)); pretty(G) gn = 6 - 6*(1/2)^n 6z -------------- 2 2z -3z+1 (2) syms n w T z clear fwn=sin(w*n*T); FW=ztrans(fwn,n,z); pretty(FW),disp(' ') inv_FW=iztrans(FW,z,n) %<6> z sin(T w) --------------------- 2 z - 2 cos(T w) z + 1 inv_FW = sin(T*n*w) (3) syms n z clear f1=1; F1=ztrans(f1,n,z); pretty(F1) %<11> 32 inv_F1=iztrans(F1,z,n) z ----z-1 inv_F1 = 1 (4) clear syms n z clear delta=sym('kroneckerDelta(n, 0)'); KD=ztrans(delta,n,z) inv_KD=iztrans(KD) KD = 1 inv_KD = kroneckerDelta(n, 0) %<16> %<17> (5) syms n z clear %<20> k=sym('k','positive'); %<21> fd=sym('f(n)*kroneckerDelta(n-k, 0)'); FD=ztrans(fd,n,z) inv_FD=iztrans(FD,z,n) FD = piecewise([k in Z_, f(k)/z^k], [Otherwise, 0]) inv_FD = piecewise([k in Z_, f(k)*kroneckerDelta(k - n, 0)], [Otherwise, 0]) (6) FD_evalin=evalin(symengine,'assume(k>0): assumeAlso(k in Z_): transform::ztrans(f(n)*kroneckerDelta(n, k), n, z): ') %<25> FD_evalin = f(k)/z^k (7) syms a z n clear GZ=exp(-a/z); gn=iztrans(GZ,z,n) gn = (-a)^n/factorial(n) %<28> 5.5.4 符号卷积 【例 5.5-6】已知系统冲激响应 h(t)  1 et/TU (t) ,求 u(t)  etU (t) 输入下的输出响应。 T syms T t tao ut=exp(-t); ht=exp(-(t)/T)/T; yt=int(subs(ut,t,tao)*subs(ht,t,t-tao),tao,0,t) yt = -(1/exp(t) - 1/exp(t/T))/(T - 1) 【例 5.5-7】采用 Laplace 变换和反变换求上例的输出响应。 syms s yt=laplace(ut,t,s)*laplace(ht,t,s) 33 yt=simple(ilaplace(yt,s,t)) yt = 1/(T*(s + 1/T)*(s + 1)) yt = (1/exp(t/T) - 1/exp(t))/(T - 1) 5.6 符号矩阵分析和代数方程解 5.6.1 符号矩阵分析 【例 5.6-1】求矩阵 A  a11 a21 (1) syms a11 a12 a21 a22 A=[a11,a12;a21,a22] DA=det(A) IA=inv(A) a12 a22    的行列式、逆和特征根。 A= [ a11, a12] [ a21, a22] DA = a11*a22 - a12*a21 IA = [ a22/(a11*a22 - a12*a21), -a12/(a11*a22 - a12*a21)] [ -a21/(a11*a22 - a12*a21), a11/(a11*a22 - a12*a21)] (2) EA=subexpr(eig(A),'D') D= (a11^2 - 2*a11*a22 + a22^2 + 4*a12*a21)^(1/2) EA = a11/2 + a22/2 - D/2 a11/2 + a22/2 + D/2 5.6.2 线性方程组的符号解 【例 5.6-2】求 d  n  p  q,n  d  q  p  10,q  d  n  p,q  p  n  8d  1线性方 22 4 程组的解。 (1) A=sym([1 1/2 1/2 -1;1 1 -1 1;1 -1/4 -1 1;-8 -1 1 1]); b=sym([0;10;0;1]); X1=A\b X1 = 1 8 8 9 (2) eq1=sym('d+n/2+p/2-q'); %<4> eq2=sym('d+n-p+q-10'); eq3=sym('d-n/4-p+q'); eq4=sym('-8*d-n+p+q-1'); S=solve(eq1,eq2,eq3,eq4,'d','n','p','q'); disp([' d',' n',' p',' q']) %<8> 34 disp([S.d,S.n,S.p,S.q]) dnpq [ 1, 8, 8, 9] %<10> 5.6.3 一般代数方程组的解 【例 5.6-3】求方程组 uy^2  vz  w  0 , y  z  w  0 关于 y, z 的解。 S=solve('u*y^2+v*z+w=0','y+z+w=0','y','z') %<1> disp('S.y'),disp(S.y),disp('S.z'),disp(S.z) %<2> S= y: [2x1 sym] z: [2x1 sym] S.y (v + 2*u*w + (v^2 + 4*u*w*v - 4*u*w)^(1/2))/(2*u) - w (v + 2*u*w - (v^2 + 4*u*w*v - 4*u*w)^(1/2))/(2*u) - w S.z -(v + 2*u*w + (v^2 + 4*u*w*v - 4*u*w)^(1/2))/(2*u) -(v + 2*u*w - (v^2 + 4*u*w*v - 4*u*w)^(1/2))/(2*u) 【例 5.6-4】solve 指令求 d  n  p  q , n  d  q  p  10 , q  d  n  p 构成的“欠 22 4 定”方程组解。 syms d n p q eq1=d+n/2+p/2-q;eq2=n+d+q-p-10;eq3=q+d-n/4-p; % <2> S=solve(eq1,eq2,eq3,d,n,p,q); % <3> disp([' S.d',' S.n',' S.p',' S.q']) disp([S.d,S.n,S.p,S.q]) S.d S.n S.p S.q [ z, x8, z11, z21] 【例 5.6-5】求 (x  2) x  2 的解。 s=solve('(x+2)^x=2','x') s= 0.69829942170241042826920133106081 【例 5.6-6】求解带限定性假设的代数方程的解。 (1) syms x clear %<1> Eq=x^4-16; X1=solve(Eq,x) X1 = 2 -2 2*i -2*i (2) syms x real X2=solve(Eq,x) X2 = 2 -2 %<4> (3) syms x positive %<6> % <1> 35 X3=feval(symengine,'solve',x^4-16,x) X3 = 2 (4) X4=evalin(symengine,'solve(x^4-16=0,x) assuming x>0:') X4 = 2 % <7> % <8> 5.7 符号算法的综合应用 5.7.1 三维根轨迹和数据探索 【 例 5.7-1 】 增 益 放 大 系 数 k 变 化 时 , 研 究 图 5.7-1 所 示 闭 环 系 统 的 根 轨 迹 。 图 中 G(s)  1 。 s(s  3)(s2  2s  2) (1) 图 5.7-1 具有变增益系数 K 的单位负反馈系统 (2) clear syms s syms k positive %<3> EC=k+s*(s+3)*(s^2+2*s+2); EEC=expand(EC); %<5> (3) kk=[0:0.2:4,4.2:0.001:4.4,4.6:0.2:7.8,8:0.01:8.2,9:12]'; nk=length(kk);Rk=zeros(nk,4); for ii=1:nk SE=subs(EEC,k,kk(ii)); PE=sym2poly(SE); Rk(ii,:)=roots(PE)'; end Rreal=real(Rk);Rimag=imag(Rk); (4) figure(1) plot(Rreal,Rimag,'.') %<9> legend('R1','R2','R3','R4','Location','Best') hold on x00=[-3,0.5];plot(x00,zeros(size(x00)),'k-') y00=[-1.5,1.5];plot(zeros(size(y00)),y00,'k-') plot([-2.3,0],[0,1.1],'ro','MarkerSize',15) text(-2.25,0.1,'A'),text(0.05,1,'B') hold off xlabel('根的实部'),ylabel('根的虚部') title('常规根轨迹') 36 图 5.7-2 处于数据关联状态的常规根轨迹 (5) figure(2) plot3(Rreal,Rimag,[kk,kk,kk,kk],'.') %<20> box on,grid on legend('R1','R2','R3','R4','Location','NorthWest') view([63,68]) xlabel('根的实部'),ylabel('根的虚部'),zlabel('增益系数') title('三维根轨迹') 37 (6) 图 5.7-3 处于数据关联状态的三维根轨迹 图 5.7-4 figure(1)的指定数据源对话窗 38 (7) 图 5.7-5 figure(2)的指定数据源对话窗 图 5.7-6 工作空间的内存变量 图 5.7-7 处于数据关联状态的内存变量 39 (8) (9) (10) 图 5.7-8 关联数据被同时自动标识的效果 5.7.2 代数状态方程求符号传递函数 1 结构框图的代数状态方程解法 【例 5.7-1】求图 5.7-1 所示某三环系统的传递函数。 图 5.7-1 三环系统的结构框图 40 (1) (2) (3) (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]; Y2Ua=c*((eye(size(A))-A)\b); %利用“左除”取代“求逆”,计算传递函数 disp([blanks(5),'传递函数 Y2Ua 为']) pretty(Y2Ua) 传递函数 Y2Ua 为 G1 G2 G3 G4 ------------------------------------------G2 G3 G4 H1 - G3 G4 H2 + G1 G2 G3 G4 H3 + 1 2 信号流图的代数状态方程解法 【例 5.7-2】作为比较,画出图 5.7-1 所示 结构框图的等价信号流图,并据此信号流图运用 “代数状态方程”求系统的传递函数。本例演示:信号流图的代数状态方程的建立;根据 代数状态方程求传递函数;在 G1  100 s 10 ,G2  s 1  1 ,G3  s2 s 1  4s  4 ,G4  s 1 s6 , H1  2s s   12 1 , H 2  s 1 s2 , H3  1 的情况下,求取参数具体化的传递函数。 (1) (2) (3) 图 5.7-2 三环系统的信号流图 41 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]; Y2Ub=c*((eye(size(A))-A)\b); disp([blanks(5),'传递函数 Y2Ub 为']) pretty(Y2Ub) 传递函数 Y2Ub 为 G1 G2 G3 G4 ------------------------------------------G2 G3 G4 H1 - G3 G4 H2 + G1 G2 G3 G4 H3 + 1 (4) syms s Sblock={100/(s+10),1/(s+1),(s+1)/(s^2+4*s+4),(s+1)/(s+6),(2*s+12)/(s+ 1),(s+1)/(s+2),1}; %<9> Y2Uc=simple(subs(Y2Ub,{G1,G2,G3,G4,H1,H2,H3},Sblock)); %<10> [NN,DD]=numden(Y2Uc); NN=expand(NN); disp('参数具体化的传递函数 Y2Uc 为') pretty(NN/DD) 参数具体化的传递函数 Y2Uc 为 2 100 s + 300 s + 200 ------------------------------------------- 5 4 3 2 s + 21 s + 157 s + 663 s + 1301 s + 910 3 多输入多输出系统传递矩阵的求取 【例 5.7-3】运用“代数状态方程法”求图 5.7-3 所示“2 输入 2 输出”系统的传递矩阵。 图 5.7-3 二输入二输出系统的结构框图 42 (1) (2) clear syms G1 G2 G3 G4 H1 H2 H3 syms F1 F2 F3 F4 syms W A=sym(zeros(11,11));B=sym(zeros(11,2));C=sym(zeros(2,11)); A(1,4)=-G1;B(1,1)=G1; A(2,1)=G2;A(2,9)=G2; A(3,2)=G3;A(3,11)=-G3; A(4,3)=G4; A(5,8)=-F1;B(5,2)=F1; A(6,5)=F2; A(7,6)=F3;A(7,10)=F3; A(8,7)=F4; B(9,2)=H1; A(10,1)=H2;A(10,9)=H2; A(11,7)=H3; C(1,3)=1; C(2,7)=1; G=C*((eye(size(A))-A)\B); %<19> [GG,W]=subexpr(G,W); %<20> disp('GG(1,1)='),disp(simple(GG(1,1))),disp(' ') disp('GG(1,2)='),disp(simple(GG(1,2))),disp(' ') disp('GG(2,1)='),disp(simple(GG(2,1))),disp(' ') disp('GG(2,2)='),disp(simple(simple((GG(2,2))))),disp(' ') disp('W='),disp(simple(W)) GG(1,1)= G1*G3*W*(G2 - F3*H2*H3 + F1*F2*F3*F4*G2) GG(1,2)= G3*W*(G2*H1 - F1*F2*F3*H3 - F3*H1*H2*H3 + F1*F2*F3*F4*G2*H1) GG(2,1)= F3*G1*H2*W GG(2,2)= W*(F1*F2*F3 + F3*H1*H2 + F1*F2*F3*G1*G2*G3*G4) W= 1/(F1*F2*F3*F4+G1*G2*G3*G4-F3*G1*G3*G4*H2*H3 + F1*F2*F3*F4*G1*G2*G3*G4 + 1) (3) G_1to1=simple(subs(G(1,1),[H1,H2,H3],[0,0,0])); disp('当 H1=0,H2=0,H3=0 时,(Y1/U1)的传递函数为') pretty(G_1to1) 当 H1=0,H2=0,H3=0 时,(Y1/U1)的传递函数为 G1 G2 G3 --------------G1 G2 G3 G4 + 1 G_2to2=simple(subs(G(2,2),[H1,H2,H3],[0,0,0])); disp('当 H1=0,H2=0,H3=0 时,(Y2/U2)的传递函数为') pretty(G_2to2) 当 H1=0,H2=0,H3=0 时,(Y2/U2)的传递函数为 %<26> %<29> 43 F1 F2 F3 --------------F1 F2 F3 F4 + 1 5.8 符号计算结果的可视化 5.8.1 直接可视化符号表达式 1 单独立变量符号函数的可视化  【例 5.8-1】绘制 y  2 t  e2 cos 3 t 和它的积分 s(t)  t y(t)dt 在[0, 4 ] 间的图形(图 3 2 0 5.8-1)。 syms t tao y=2/3*exp(-t/2)*cos(sqrt(3)/2*t) s=subs(int(y,t,0,tao),tao,t) subplot(2,1,1) ezplot(y,[0,4*pi]),ylim([-0.2,0.7]) grid on subplot(2,1,2) ezplot(s,[0,4*pi]) grid on title('s = \int y(t)dt') y= (2*cos((3^(1/2)*t)/2))/(3*exp(t/2)) s= 1/3-(2*(cos((3^(1/2)*t)/2)/2- (3^(1/2)*sin((3^(1/2)*t)/2))/2))/(3*exp(t/2)) (2 cos((31/2 t)/2))/(3 exp(t/2)) 0.6 0.4 0.2 0 -0.2 0 2 4 6 8 10 12 t s =  y(t)dt 0.5 0.4 0.3 0.2 0 2 4 6 8 10 12 t 图 5.8-1 ezplot 使用示例 2 双独立变量符号函数的可视化 【例 5.8-2】使用球坐标参量画部分球壳(图 5.8-2)。 44 clf x='cos(s)*cos(t)'; y='cos(s)*sin(t)'; z='sin(s)'; ezsurf(x,y,z,[0,pi/2,0,3*pi/2]) view(17,40) shading interp colormap(spring) light('position',[0,0,-10],'style','local') light('position',[-1,-0.5,2],'style','local') material([0.5,0.5,0.5,10,0.3]) 图 5.8-2 ezsurf 在参变量格式下绘制的图形 5.8.2 符号计算结果的数值化绘图 【例 5.8-3】符号法求函数 y  f (x)  1  2 的积分,用 plot 指令绘制函数及其积分函 1 ex 数的曲线;对反函数积分的两种算法进行可视化比较。 (1) clear syms x y real fx=1-2/(1+exp(x)); disp('f(x)=') pretty(fx) disp(' ') fxint=int(fx,x,0,x) f(x)= 2 1 - ---------- exp(x) + 1 fxint = 2*log(exp(x) + 1) - log(4) - x 45 (2) xk=0:0.1:2; fxk=subs(fx,x,xk); fxintk=subs(fxint,x,xk); plot(xk,fxk,'g',xk,fxintk,'r+-','LineWidth',2.5) title('函数及其积分函数') xlabel('x') legend('f(x)','\int^x_0 f(x) dx','Location','best') 函数及其积分函数 1 0.8 0.6 0.4 0.2 0 0 0.5 1 1.5 x 图 5.8-3 用双精度数据绘曲线 f(x) x0 f(x) dx 2 (3) gy=subs(finverse(fx),x,y) gyint=int(gy,y,0,y) gy = log(-(y + 1)/(y - 1)) gyint = piecewise([y < 1, log(1 - y^2) + y*log(y + 1) - y*log(1 - y)], [1 <= y, log(y^2 - 1) + y*log(-(y + 1)/(y - 1)) - pi*i]) (4) gf=simplify(subs(gy,y,fx)) gf = x (5) yk=subs(fx,x,xk); gyintk=subs(gyint,y,yk); GYintk=xk.*fxk-fxintk; plot(yk,gyintk,'r','LineWidth',5) hold on plot(yk,GYintk,'*k','MarkerSize',15) hold off xlabel('y') legend('直接法计算反函数积分', '互补法求反函数积分','location','best') 46 0.7 直接法计算反函数积分 0.6 互补法求反函数积分 0.5 0.4 0.3 0.2 0.1 0 0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 y 图 5.8-4 反函数积分两种算法结果比较 5.8.3 可视化与数据探索 【例 5.8-4】借助可视化手段,加深 Taylor 展开的邻域近似概念。借助图形研究函数 f (x, y)  sin(x 2  y) 在 x  0, y  0 处的截断 8 阶小量的 Taylor 展开。 (1) TL1=evalin(symengine,'mtaylor(sin(x^2+y),[x,y],8)') TL1 = (x^6*y^2)/12 - x^6/6 + (x^4*y^3)/12 - (x^4*y)/2 - (x^2*y^6)/720 + (x^2*y^4)/24 - (x^2*y^2)/2 + x^2 - y^7/5040 + y^5/120 - y^3/6 + y (2) Fxy=sym('sin(x^2+y)') Fxy_TL1=Fxy-TL1 Fxy = sin(x^2 + y) Fxy_TL1 = sin(x^2 + y) - y + (x^2*y^2)/2 - (x^2*y^4)/24 - (x^4*y^3)/12 + (x^2*y^6)/720 - (x^6*y^2)/12 + (x^4*y)/2 - x^2 + x^6/6 + y^3/6 - y^5/120 + y^7/5040 (3) figure(1) ezsurf(Fxy,[-2,2,-3,3]) shading interp view([-63,52]) colormap(spring) light,light('position',[-10,4,50],'style','local','color','r') 47 图 5.8-5 原函数在较大范围内的图形 (4) figure(2) ezsurf(TL1,[-2,2,-3,3]) shading interp view([-43,54]) colormap(spring) light light('position',[-10,2,2],'style','local','color',[0.8,0.3,0.3]) light('position',[-2,-10,2],'style','local','color',[0.4,0.5,0.7]) (5) figure(3) 图 5.8-6 Taylor 展开在较大范围内的图形 48 subplot(1,2,1),ezsurf(Fxy,[-0.5,0.5,-0.5,0.5],'circ') axis([-1,1,-1,1,-2,2]) shading interp view([-49,17]) light light('position',[-30,0,-2],'style','local','color','r') subplot(1,2,2),ezsurf(TL1,[-0.5,0.5,-0.5,0.5],'circ') axis([-1,1,-1,1,-2,2]) shading interp colormap(spring) view([-49,17]) light light('position',[-30,0,-2],'style','local','color','r') 图 5.8-7 原函数和 Taylor 展开近似函数在小范围内的图形 (6) figure(4) ezsurf(Fxy_TL1,[-0.5,0.5],'circ') shading interp colormap(spring) view([-53,34]) light light('position',[-10,15,0],'style','local','color',[0.8,0.3,0.3]) 49 图 5.8-8 小范围内的误差曲面 5.9 符号计算资源的数值环境应用 5.9.1 符号表达式、串操作及数值计算 M 码间的转换 图 5.9-1 符号计算码与数值计算 M 码之间的转换指令 50 5.9.2 符号工具包资源表达式转换成 M 码函数 1 转换指令 matlabFunction 2 把符号包资源转换成 M 码函数的示例 【例 5.9-1】试写出能对于任给(具体数值的)边界条件,计算微分方程 xy  3y  x2 数 值解的 M 码。 (1) clear all s=dsolve('x*D2y-3*Dy=x^2','y(a)=yL,y(b)=yR','x') s= (a^4*b^3 + 3*yR*a^4 - a^3*b^4 - 3*yL*b^4)/(3*(a^4 - b^4)) - x^3/3 + (x^4*(a^3 - b^3 + 3*yL - 3*yR))/(3*(a^4 - b^4)) (2) Hs=matlabFunction(s,'file','exm050901_ZZY','vars',{'x','a','b','yL',' yR'},'outputs',{'y'}) % <2> Hs = @exm050901_ZZY (3) a=1;b=5;yL=0;yR=0; xn=-1:6;yn=Hs(xn,a,b,yL,yR) %<4> x=-1:0.2:6;y=Hs(x,a,b,yL,yR); %<5> plot(x,y,'b-'),hold on plot([1,5],[0,0],'.r','MarkerSize',20),hold off title(['xy{\prime\prime}- 3y{\prime}=x^2,',' ','y(1)=0, y(5)=0']) text(1,1,'y(1)=0'),text(4,1,'y(5)=0') xlabel('x'),ylabel('y') yn = 0.6667 0.2671 0.0000 -1.3397 -3.3675 -4.1090 0.0000 14.1132 xy- 3y=x2, y(1)=0, y(5)=0 15 10 y 5 y(1)=0 0 y(5)=0 -5 -1 0 1 2 3 4 5 6 x 图 5.9-2 两点边值问题的解曲线 (4) 51 function y = exm050901_ZZY(x,a,b,yL,yR) t2 = a.^2; t3 = b.^2; t4 = t2.^2; t5 = t3.^2; t6 = x.^2; t7 = t4-t5; t8 = 1.0./t7; y= t8.*(t5.*yL.*3.0-t4.*yR.*3.0+a.*t2.*t5-b.*t3.*t4).*(-1.0./3.0)-t6.*x.*(1.0./3.0)+t6.^2.*t8.*(yL.*3.0 -yR.*3.0+a.*t2-b.*t3).*(1.0./3.0); (5) ym=exm050901_ZZY(xn,a,b,yL,yR) ym = Columns 1 through 7 0.6667 0.2671 0.0000 Column 8 14.1132 -1.3397 -3.3675 -4.1090 % <12> 0 【例 5.9-2】编写一个通用的求解微分方程两点边值问题数值解的 M 函数文件。 (1) function y = exm050902_ZZY(de,x,a,b,yL,yR,flag) if nargin~=7 error('输入量数目应有 7 个 !') end s=dsolve(de,'y(a)=yL,y(b)=yR','x'); Hs=matlabFunction(s,'vars',{'x','a','b','yL','yR'}); y=Hs(x,a,b,yL,yR); if flag==1 plot(x,y,'-b',[a,b],[yL,yR],'*r','MarkerSize',15) title(de) xlabel('x'),ylabel('y') shg end % <14> (2) x=-1:6; a=1;b=5;yL=0;yR=0; de1='x*D2y-3*Dy=x^2'; y = exm050902_ZZY(de1,x,a,b,yL,yR,0) y= 0.6667 0.2671 0.0000 -1.3397 -3.3675 -4.1090 0 14.1132 (3) de2='x*D2y-3*Dy=3*x^2+x'; x=-1:0.2:6; y = exm050902_ZZY(de2,x,3,6,-2,10,1); 52 图 5.9-3 用 exm050902_ZZY 求解另一微分方程所得解 【例 5.9-3】借助“符号表达式/matlabFunction”途径,将矩阵符号运算 c  Ab 转换成相应 的 M 函数文件,并进行正确性验证。 (1) syms A b % <1> c=A*b; % <2> matlabFunction(c,'file','exm050903','vars',[A,b]); %<3> which exm050903 %<4> D:\NewBook\Master20101204\Ch05_符号\exm050903.m (2) A=magic(3); % b=[1;1;1];; c=exm050903(A,b) ??? Error using ==> times Matrix dimensions must agree. Error in ==> exm050903 at 8 c = A.*b; (3) c=A*b c= 15 15 15 (4) 【例 5.9-4】写出适应解一般 2 阶齐次状态微分方程的 M 函数文件。 (1) (2) clear all syms t a11 a12 a21 a22 x10 x20 A=[a11,a12;a21,a22];x0=[x10;x20]; xt=expm(A*t)*x0; %<2> %<3> 53 matlabFunction(xt,'file','exm050904','vars',{t,[a11,a12;a21,a22],[x10 ;x20]}); (3) t=0:0.1:6; An=[0,1;-2,-3];x0n=[0;1]; xt=exm050904(t,An,x0n); %<8> plot(t,xt(1,:),'-b',t,xt(2,:),'.r') legend('x1(t)','x2(t)') xlabel('t'),ylabel('x(t)') 1.2 x1(t) 1 x2(t) 0.8 0.6 x(t) 0.4 0.2 0 -0.2 0 1 2 3 4 5 6 t 图 5.9-4 状态方程的齐次解曲线 〖说明〗 syms t A x0 xt=expm(A*t)*x0; xtc=char(xt) xtc = x0*exp(A*t) 3 把 MuPAD 资源转换为 M 码函数的示例 【例 5.9-5】把递推方程 f (n)  3 f (n 1)  2 f (n  2) 的通解转换为 M 码函数文件,以便 今后,在不同初始条件下,计算符合上述递推方程的序列。 (1) cm='solve(rec(f(n)=-3*f(n-1)-2*f(n-2),f(n),{f(0)=y0,f(1)=y1}))'; y = evalin(symengine,cm) %<2> y= (-1)^n*(2*y0 + y1) - (-2)^n*(y0 + y1) (2) y10=subs(y,{'n','y0','y1'},{1:10,1.5,-1.6}) % y10 = Columns 1 through 7 -1.6000 1.8000 -2.2000 3.0000 -4.6000 Columns 8 through 10 27.0000 -52.6000 103.8000 7.8000 -14.2000 (3) matlabFunction(y, 'file', 'exm050905'); 54 (4) y0=1.5;y1=-1.6; k=10; ymfile=zeros(1,k); for ii=1:k ymfile(ii)=exm050905(ii,y0,y1); end ymfile ymfile = Columns 1 through 7 -1.6000 1.8000 -2.2000 3.0000 Columns 8 through 10 27.0000 -52.6000 103.8000 -4.6000 7.8000 -14.2000 5.9.3 用符号表达式创建 SIMULINK 用户模块 1 转换指令 emlBlock 2 把符号包资源转换为 SIMULINK 模块的示例 【例 5.9-6】在图 5.9-5 所示的系统中,已知质量 m  1 kg,阻尼 b  2 N.sec/m,弹簧系数 k  100 N/m,且质量块的初始位移 x(0)  0.05 m,其初始速度 x(0)  0 m/sec,要求创建 该系统的 SIMULINK 模型,并进行仿真运行。 图 5.9-5 弹簧—质量—阻尼系统 (1) (2) syms x v m d k dvdt = -v*d/m-x*k/m; emlBlock('exm050906/SMD',dvdt,'vars',[k m d x v]) 55 (3) 图 5.9-6 据式(5.9-2)创建的系统模块 (4) 图 5.9-7 信号 v 和 x 的产生及向 SMD 模块反馈 (5) 图 5.9-8 已建立的完整模型 56 (6) 图 5.9-9 仿真所得的位移变化曲线 5.10 MuPAD 资源的深层利用 5.10.1 借助 mfun 调用 MuPAD 特殊函数  【例 5.10-1】已知 f (x)  x 1 dt ,试画出 f (x) 在 0  x  0.9 的曲线。 0 ln t (1) syms t x gt=1/log(t); gt_0=limit(gt, t,0,'right') gt_0 = 0 (2) ezplot(gt,[0,1]) grid on legend('gt') 57 1/log(t) 0 gt -2 -4 -6 -8 -10 -12 -14 0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1 t 图 5.10-1 在关心区间内的被积函数 (3) fx=int(gt,t,0,x) % <7> Warning: Explicit integral could not be found. fx = piecewise([x < 1, Li(x)], [Otherwise, int(1/log(t), t = 0..x)]) (4) x=0:0.05:0.9; %<8> fxMfun=mfun('Li',x) %<9> fxMfun = Columns 1 through 7 NaN -0.0131 -0.0324 Columns 8 through 14 -0.2019 -0.2529 -0.3114 Columns 15 through 19 -0.7809 -0.9369 -1.1340 -0.0564 -0.0851 -0.1187 -0.3787 -0.4564 -0.5469 -1.3959 -1.7758 -0.1574 -0.6534 (5) hold on plot(x,fxMfun,'--r','LineWidth',3) legend('gt','fxMfun','Location','Best') title(' ') hold off 58 0 -2 -4 -6 gt fxMfun -8 -10 -12 -14 0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1 t 图 5.10-2 被积函数曲线 gt 和积分曲线 fx (6) fx_matlab=-expint(-log(x)) fx_matlab = Columns 1 through 7 NaN -0.0131 -0.0324 Columns 8 through 14 -0.2019 -0.2529 -0.3114 Columns 15 through 19 -0.7809 -0.9369 -1.1340 -0.0564 -0.3787 -1.3959 -0.0851 -0.4564 -1.7758 % <15> -0.1187 -0.5469 -0.1574 -0.6534 (7) Li_expint=-expint(-log(0)) Li_mfun=mfun('Li',0) Li_Ei=mfun('Ei',log(0)) Li_mupud=evalin(symengine,'Li(0)') Li_expint = NaN Li_mfun = NaN Li_Ei = 0 Li_mupud = 0 %<16> %<19> 5.10.2 直接调用 MuPAD 的函数 1 非 mfunlist 列表 MuPAD 函数的调用步骤 2 借助 evalin 运行 MuPAD 函数 【 例 5.10-2 】 求 递 推 方 程 f (n)  3 f (n 1)  2 f (n  2) 的 通 解 , 并 画 出 初 始 条 件 f (0)  1.5 , f (1)  1.6 时, n  0,1,,10 时刻的序列数据图。 (1) (2) 59 (3) 图 5.10-3 实践 MuPAD 关于递推方程求解所给的算例 (4) y0=1.5;y1=-1.6; % <1> cm='solve(rec(f(n)=-3*f(n-1)-2*f(n-2),f(n),{f(0)=y0,f(1)=y1}))'; %<2> y = evalin(symengine,cm) %<3> y= (-1)^n*(2*y0 + y1) - (-2)^n*(y0 + y1) (5) warning('off','all') %<4> syms n y0 y1 %<5> ys010=subs(y,{y0,y1,n},{1.5,-1.6,0:1:10}) class(ys010) %<7> ys010 = Columns 1 through 7 1.5000 -1.6000 1.8000 -2.2000 Columns 8 through 11 -14.2000 27.0000 -52.6000 103.8000 ans = double % 3.0000 -4.6000 <6> 7.8000 (6) yc=char(y) %<8> ycv=vectorize(yc) %<9> y0=1.5;y1=-1.6; n=0:10; y010=eval(ycv) %<12> plot(n,y010,'*b','MarkerSize',8) xlabel('n'),ylabel('y(n)') yc = (-1)^n*(2*y0 + y1) - (-2)^n*(y0 + y1) ycv = (-1).^n.*(2.*y0 + y1) - (-2).^n.*(y0 + y1) y010 = Columns 1 through 7 1.5000 -1.6000 1.8000 -2.2000 3.0000 Columns 8 through 11 -14.2000 27.0000 -52.6000 103.8000 -4.6000 7.8000 60 y(n) 120 100 80 60 40 20 0 -20 -40 -60 0 1 2 3 4 5 6 7 8 9 10 n 图 5.10-4 递推方程的前 10 个时刻的解 3 借助 feval 运行 MuPAD 函数 【例 5.10-3】求 f  xyz 的 Hessian 矩阵。 (1) (2) 图 5.10-5 实践 MuPAD 关于求解不等式所给的算例 (3) syms x y z FH=feval(symengine,'linalg::hessian',x*y*z,'[x,y,z]') FH = [ 0, z, y] [ z, 0, x] [ y, x, 0] % <2> 【例 5.10-4】求 f (x, y)  sin( ax2  y) ,在 x   , y  0 处的前 8 阶泰勒(Taylor)近似展 2 61 开式。 (1) (2) 图 5.10-6 实践 MuPAD 关于求解不等式所给的算例 (3) syms x y a=1; mt0=feval(symengine,'mtaylor',sin(a*x^2+y^2),'[x,y]',8) mt1=feval(symengine,'mtaylor',sin(a*x^2+y^2),'[x=0,y=0]',8) mt2=feval(symengine,'mtaylor','sin(a*x^2+y^2)','[x,y]',8) % <3> % <4> % <5> mt0 = - x^6/6 - (x^4*y^2)/2 - (x^2*y^4)/2 + x^2 - y^6/6 + y^2 mt1 = - x^6/6 - (x^4*y^2)/2 - (x^2*y^4)/2 + x^2 - y^6/6 + y^2 mt2 = - (a^3*x^6)/6 - (a^2*x^4*y^2)/2 - (a*x^2*y^4)/2 + a*x^2 - y^6/6 + y^2 62 第 6 章 数据可视及探索 视觉是人们感受世界、认识自然的最重要依靠。数据可视化的目的:借助几何、色彩 媒质表现一堆貌似杂乱的离散数据集合的形态,暴露数据内在关系和总体趋势,进而揭示 出数据所传递的内在本质。随着计算机软硬件的发展,能力越来越强的图形表现,反过来 对科学计算方法本身也产生了越来越大的影响。 针对符号计算和数值计算,MATLAB 配置了两套形式上不同的绘图指令:“图形易绘 指令”和“数值绘图指令”。前者配合符号计算,已安排在第 5.8 节;而本章内容将完全围 绕数值绘图展开。 本章将系统地阐述:离散数据表示成图形的基本机理;曲线、曲面绘制的基本技法和 指令;特殊图形的生成和使用示例;如何使用线型、色彩、数据点标记凸现不同数据的特 征;如何利用着色、灯光照明、反射效果、材质体现和透明度处理渲染、烘托表现高维函 数的性状;如何生成和运用标识,画龙点睛般地注释图形;如何表现变址、灰度、真彩图 象;如何制作动画等。 随着 MATLAB 版本的升级,现今的 MATLAB 图形窗不再是“单向性的图形显示工具”, 而已成为进行“双向性探索的图形交互界面”。为此,占本章四分之一篇幅的第 6.8 节用于 专门叙述全交互式绘图、图形对象属性的交互式设置、绘图用 M 函数文件的自动生成、以 及用于数据探索的数据探针、数据刷和数据链。 整章内容安排遵循由浅入深、由基本到高级、由算例带归纳的原则。所有算例都是运 行实例,易于读者实践试验,并从中掌握一般规律。 顺便指出:由于纸质印刷版无法表现图形色彩,因此,请读者阅读本章时,能同时参 看对应的电子文档“ch06_数据可视及探索.doc”。该文档存放在随书光盘 mbook 目录。此 外,算例中带 exm 前缀文件名的 M 文件电子文档则保存在随书光盘的 mfile 目录上。 6.1 引导 6.1.1 离散数据和离散函数的可视化 【例 6.1-1】图形表示离散函数 y  n 。(图 6.1-1) n=(-10:10)'; y=abs(n); plot(n,y,'r.','MarkerSize',20) axis equal grid on xlabel('n') 1 12 10 8 6 4 2 0 -2 -10 -8 -6 -4 -2 0 2 4 6 8 10 n 图 6.1-1 离散函数的可视化 6.1.2 连续函数的可视化 【例 6.1-2】用图形表示连续调制波形 y  sin(t)sin(9t) 。(图 6.1-2) t1=(0:11)/11*pi; t2=(0:400)/400*pi; t3=(0:50)/50*pi; y1=sin(t1).*sin(9*t1); y2=sin(t2).*sin(9*t2); y3=sin(t3).*sin(9*t3); subplot(2,2,1),plot(t1,y1,'r.') %<7> axis([0,pi,-1,1]),title('(1)点过少的离散图形') subplot(2,2,2),plot(t1,y1,t1,y1,'r.') %<9> axis([0,pi,-1,1]),title('(2)点过少的连续图形') subplot(2,2,3),plot(t2,y2,'r.') %<11> axis([0,pi,-1,1]),title('(3)点密集的离散图形') subplot(2,2,4),plot(t3,y3) %<13> axis([0,pi,-1,1]),title('(4)点足够的连续图形') 2 (1)点 过 少 的 离 散 图 形 1 0.5 0 -0.5 -1 0 1 2 3 (3)点 密 集 的 离 散 图 形 1 0.5 0 -0.5 -1 0 1 2 3 (2)点 过 少 的 连 续 图 形 1 0.5 0 -0.5 -1 0 1 2 3 (4)点 足 够 的 连 续 图 形 1 0.5 0 -0.5 -1 0 1 2 3 图 6.1-2 连续函数的图形表现方法 【例 6.1-3】绘制奇数正多边形及圆。(图 6.1-3) N=9; t=0:2*pi/N:2*pi; x=sin(t);y=cos(t); tt=reshape(t,2,(N+1)/2); tt=flipud(tt); tt=tt(:); xx=sin(tt);yy=cos(tt); subplot(1,2,1),plot(x,y) title('(1) 正常排序图形'),axis equal off,shg subplot(1,2,2),plot(xx,yy) title('(2) 非正常排序图形'),axis equal off,shg (1) 正 常 排 序 图 形 (2) 非 正 常 排 序 图 形 图 6.1-3 自变量排列次序对连续曲线图形的影响 3 6.1.3 可视化的一般步骤 1. 绘制二维图形的一般步骤 2. 绘制三维图形的一般步骤 6.2 二维线图及修饰操作 6.2.1 基本指令 plot 的调用格式 1. 基本调用格式 【例 6.2-1】本例演示:plot 的最基本调用格式;绘图的基本步骤和方法;“三元组”的含 义;plot 的单输入调用格式,以及它所产生图形与“三元组”图形的区别。 x=0:0.05*pi:2*pi; y=exp(-x/3).*cos(2*x); subplot(2,1,1) plot(x,y,'o-r') axis([0,2*pi,-1,1]) subplot(2,1,2) plot(y) axis([1,length(y),-1,1]) 图 6.2-1 三元组调用格式与单输入格式图形的区别 2. 衍生调用格式 【例 6.2-2】本例演示:因变量为多列数组 的 plot 调用格式;plot(t,Y) plot(Y)所绘曲线的区 别;“线宽”属性的设置。(图 6.2-2) 4 clf t=(0:pi/20:2*pi)'; k=0.4:0.1:1; Y=cos(t)*k; plot(t,Y,'LineWidth',2) axis tight 图 6.2-2 采用矩阵因变量和默认色彩绘制多条曲线 3. 带属性设置的调用格式 【例 6.2-3】用图形表示连续调制波形 y  sin(t)sin(9t) 及其包络线。(图 6.2-3) t=(0:pi/100:pi)'; y1=sin(t)*[1,-1]; y2=sin(t).*sin(9*t); t3=pi*(0:9)/9; y3=sin(t3).*sin(9*t3); %<1> %<2> %<3> % <4> % <5> plot(t,y1,'r:',t,y2,'-bo') % <6> hold on plot(t3,y3,'s','MarkerSize',10,'MarkerEdgeColor',[0,1,0],'MarkerFaceC olor',[1,0.8,0]) % <8> axis tight %<9> hold off %<10> % % %plot(t,y1,'r:',t,y2,'-bo',t3,y3,'s','MarkerSize',10,'MarkerEdgeColor ',[0,1,0],'MarkerFaceColor',[1,0.8,0]) % <11> 5 1 0.8 0.6 0.4 0.2 0 -0.2 -0.4 -0.6 -0.8 -1 0 0.5 1 1.5 2 2.5 3 图 6.2-3 采用属性设置所绘的曲线 6.2.2 坐标控制和图形标识 1. 坐标轴的控制 【例 6.2-4】观察各种轴控制指令的影响。演示采用长轴为 3.25,短轴为 1.15 的椭圆。注意: 采用多子图(图 6.2-4)表现时,图形形状不仅受“控制指令”影响,而且受整个图面“宽 高比”及“子图数目”的影响。本书这样处理,是出于篇幅考虑。读者欲想准确体会控制 指令的影响,请在全图状态下进行观察。 t=0:2*pi/99:2*pi; x=1.15*cos(t);y=3.25*sin(t); subplot(2,3,1) plot(x,y) axis normal grid on title('Normal and Grid on') subplot(2,3,2),plot(x,y) axis equal grid on,title('Equal') subplot(2,3,3),plot(x,y) axis square grid on,title('Square') subplot(2,3,4),plot(x,y) axis image box off title('Image and Box off') subplot(2,3,5),plot(x,y) axis image fill box off,title('Image and Fill') subplot(2,3,6),plot(x,y) axis tight box off,title('Tight') 6 Normal and Grid on 4 2 2 Equal Square 4 2 0 0 0 -2 -2 -2 -4 -4 -2 0 2 -2 0 2 -2 0 2 Image and Box off Image and Fill Tight 2 1 2 0.5 0 0 0 -0.5 -2 -1 -2 -1 0 1 -1 0 1 -1 0 1 图 6.2-4 各种轴控制指令的不同影响 2. 分格线和坐标框 3. 图形标识指令 4. 标识字符的精细控制 【例 6.2-5】通过绘制二阶系统阶跃响应。,综合演示图形标识。本例比较综合,涉及的指 令较广。请读者耐心读、实际做、再看例后说明,定会有匪浅收益。(图 6.2-5 ) clf;t=6*pi*(0:100)/100; y=1-exp(-0.3*t).*cos(0.7*t); plot(t,y,'r-','LineWidth',3) %<3> hold on tt=t(find(abs(y-1)>0.05));ts=max(tt); %<5> plot(ts,0.95,'bo','MarkerSize',10) %<6> hold off axis([-inf,6*pi,0.6,inf]) set(gca,'Xtick',[2*pi,4*pi,6*pi],'Ytick',[0.95,1,1.05,max(y)])%<9> set(gca,'XtickLabel',{'2*pi';'4*pi';'6*pi'}) %<10> set(gca,'YtickLabel',{'0.95';'1';'1.05';'max(y)'})%<11> grid on text(13.5,1.2,'\fontsize{12}{\alpha}=0.3') %<13> text(13.5,1.1,'\fontsize{12}{\omega}=0.7') %<14> cell_string{1}='\fontsize{12}\uparrow'; %<15> cell_string{2}='\fontsize{16} \fontname{隶书}镇定时间'; cell_string{3}='\fontsize{6} '; cell_string{4}=['\fontsize{14}\rmt_{s} = ' num2str(ts)]; %<18> text(ts,0.85,cell_string,'Color','b','HorizontalAlignment','Center') %<19> title('\fontsize{14}\it y = 1 - e^{ -\alpha t}cos{\omegat}') %<20> xlabel('\fontsize{14} \bft \rightarrow') 7 ylabel('\fontsize{14} \bfy \rightarrow') %<22> max(y) y = 1 - e - tcost =0.3 y =0.7 1.05 1 0.95  镇定时间 ts = 9.6133 2*pi 4*pi 6*pi t 图 6.2-5 二阶阶跃响应图的标识 6.2.3 多次叠绘、双纵坐标和多子图 1. 多次叠绘 【例 6.2-6】利用 hold 绘制离散信号通过零阶保持器后产生的波形。(图 5.2-6) t=2*pi*(0:20)/20; y=cos(t).*exp(-0.4*t); stem(t,y,'g','Color','k'); hold on stairs(t,y,':r','LineWidth',3) hold off legend('\fontsize{14}\it stem','\fontsize{14}\it stairs') box on 8 1 stem 0.8 stairs 0.6 0.4 0.2 0 -0.2 -0.4 0 1 2 3 4 5 6 7 2. 双纵坐标图 图 6.2-6 两类不同曲线绘于同一图布 x  【例 6.2-7】画出函数 y  x sin x 和积分 s  (x sin x)dx 在区间[0,4]上的曲线(图 6.2-7)。 0 clf;dx=0.1;x=0:dx:4;y=x.*sin(x); s=cumtrapz(y)*dx; %<2> a=plotyy(x,y,x,s,'stem','plot'); %<3> text(0.5,1.5,'\fontsize{14}\ity=xsinx') %<4> sint='{\fontsize{16}\int_{\fontsize{8}0}^{ x}}'; %<5> ss=['\fontsize{14}\its=',sint,'\fontsize{14}\itxsinxdx']; %<6> text(2.5,3.5,ss) %<7> set(get(a(1),'Ylabel'),'String','被积函数 \ity=xsinx') %<8> set(get(a(2),'Ylabel'),'String',ss) %<9> xlabel('x') 9 被 积 函 数 y=xsinx s= xxsinxdx 0 5 y=xsinx 0 4 s= xxsinxdx 0 2 -5 0 0 0.5 1 1.5 2 2.5 3 3.5 4 x 图 6.2-7 函数和积分 3. 多子图 【例 6.2-8】演示 subplot 指令对图形窗的分割(图 6.2-8)。 clf;t=(pi*(0:1000)/1000)'; y1=sin(t);y2=sin(10*t);y12=sin(t).*sin(10*t); subplot(2,2,1),plot(t,y1);axis([0,pi,-1,1]) subplot(2,2,2),plot(t,y2);axis([0,pi,-1,1]) subplot('Position',[0.2,0.1,0.6,0.40]) plot(t,y12,'b-',t,[y1,-y1],'r:') axis([0,pi,-1,1]) 10 1 1 0.5 0.5 0 0 -0.5 -0.5 -1 -1 0 1 2 3 0 1 2 3 1 0.5 0 -0.5 -1 0 0.5 1 1.5 2 2.5 3 图 6.2-8 多子图的布置 6.3 三维绘图及修饰操作 6.3.1 三维线图指令 plot3 【例 6.3-1】本例演示:三维线图的“四元组”调用格式;表现线函数的参数方程。 t=(0:0.02:2)*pi; x=sin(t);y=cos(t);z=cos(2*t); plot3(x,y,z,'b-',x,y,z,'bd') view([-82,58]) box on legend('链','宝石','Location','Best') 11 链 宝石 1 0.5 0 -0.5 -1 1 0.5 0 -0.5 6.3.2 图 6.3-1 宝石项链 三维曲面/网线图指令 1. 基本调用格式 【例 6.3-2】用曲面图表现函数 z  x2  y 2 (图 6.3-2)。 clf x=-4:4; y=x; [X,Y]=meshgrid(x,y); Z=X.^2+Y.^2; surf(X,Y,Z); colormap(hot) %<7> hold on stem3(X,Y,Z,'bo') hold off xlabel('x'),ylabel('y'),zlabel('z') axis([-5,5,-5,5,0,inf]) view([-84,21]) 1 0.5 0 -0.5 -1 -1 12 30 25 20 z 15 10 5 0 5 0 y 图 6.3-2 曲面图和格点 2. 衍生调用格式 3. 色图 colormap 4. 浓淡处理 shading 【例 6.3-3】三种浓淡处理方式比较。(图 6.3-3) clf x=-4:4;y=x; [X,Y]=meshgrid(x,y); Z=X.^2+Y.^2; surf(X,Y,Z) colormap(jet) subplot(1,3,1),surf(Z),axis off subplot(1,3,2),surf(Z),axis off,shading flat subplot(1,3,3),surf(Z),axis off,shading interp set(gcf,'Color','w') 5 0 -5 -5 x 图 6.3-3 三种浓淡处理方式 faceted/flat/interp 的效果比较 6.3.3 视点控制和图形的旋动 13 1. 视点控制 view 图 6.3-4 视点设置参数示意 2. 图形旋动 rotate 图 6.3-5 旋转图形对象的右手螺旋法则 【例 6.3-4】本例演示:surf 指令的四元组调用法;用 colorbar 色轴标注数值大小;colorbar 所产生色轴的位置控制;旋转指令 rotate 的调用格式。(图 6.3-6) clf;[X,Y] = meshgrid([-2:.2:2]); Z=4*X.*exp(-X.^2-Y.^2); G=gradient(Z); subplot(1,2,1),surf(X,Y,Z,G) colorbar('Location','North','Position',[0.37,0.90,0.295,0.015]) subplot(1,2,2),h=surf(X,Y,Z,G); rotate(h,[-2,-2,0],30,[2,2,0]), colormap(jet) 14 图 6.3-6 图形对象的旋转 6.3.4 光照、材质和透视 1. 光照 light 2. 材质处理 material 【例 6.3-5】灯光、照明、材质指令所表现的图形。(图 6.3-7) clf; [X,Y,Z]=sphere(40); colormap(jet) subplot(1,2,1),surf(X,Y,Z),axis equal off,shading interp light ('position',[0 -10 1.5],'style','infinite') lighting phong material shiny subplot(1,2,2),surf(X,Y,Z,-Z),axis equal off,shading flat light;lighting flat light('position',[-1,-1,-2],'color','y') light('position',[-1,0.5,1],'style','local','color','w') set(gcf,'Color','w') %<3> %<4> %<5> %<6> %<7> %<8> %<9> %<10> %<11> 图 6.3-7 灯光、照明、材质指令所表现的图形 3. 透明处理 15 【例 6.3-6】本例演示:alpha, alim, alphamap 的多种调用格式及其它们的配用。 (1) figure(close) [X,Y,Z]=peaks(20); surf(X,Y,Z);xlabel('x'),ylabel('y'),zlabel('z') shading flat alpha(0.5) %<5> (2) alpha('x') %<6> 图 6.3-8 透明度相同的曲面 16 (3) alpha(Z) alim([-3,3]) alpha('scaled') alpha('interp') 图 6.3-9 随 x 坐标增加而变得愈不透明 %<7> %<8> %<9> %<10> (4) shading interp alpha(Z) alpha('interp') alphamap('vdown') 图 6.3-10 透明轴设定并采用插补产生透明度 17 图 6.3-11 中部最透明而上下端最不透明的曲面 (5) Alimit=alim alim_mode=alim('mode') Alimit = -3 3 alim_mode = manual 6.3.5 消隐、镂空和裁切 1. 网线的消隐 【例 6.3-7】透视演示(图 6.3-12)。 [X0,Y0,Z0]=sphere(30); X=2*X0;Y=2*Y0;Z=2*Z0; surf(X0,Y0,Z0); shading interp hold on,mesh(X,Y,Z),colormap(hot) hold off hidden off axis equal,axis off 18 图 6.3-12 剔透玲珑球 2. 图形的镂空 【例 6.3-8】演示:如何利用“非数”NaN,对图形进行镂空处理。(图 6.3-13) P=peaks(30); P(18:20,9:15)=NaN; surfc(P);colormap(summer) light('position',[50,-10,5]),lighting flat material([0.9,0.9,0.6,15,0.4])%材质控制 图 6.3-13 镂方孔的曲面 3. 裁切 【例 6.3-9】表现切面(图 6.3-14)。 19 clf,x=[-8:0.1:8];y=x;[X,Y]=meshgrid(x,y);ZZ=X.^2-Y.^2; ii=find(abs(X)>6|abs(Y)>6); ZZ(ii)=zeros(size(ii)); surf(X,Y,ZZ),shading interp;colormap(copper) light('position',[0,-15,1]);lighting phong material([0.8,0.8,0.5,10,0.5]) 图 6.3-14 经裁切处理后的图形 6.4 高维可视化 6.4.1 二维半图线 【例 6.4-1】本例演示:pcolor , contour, contourf 的调用格式;等位线标高指令 clabel 的配合 使用和区别;colorbar 在用户指定位置上创建着色标尺;subplot 子图位置的控制;图形窗背 景底色的设置。(图 6.4-1) clf;clear [X,Y,Z]=peaks(30); n=6; subplot('Position',[0.13,0.11,0.335,0.75]) pcolor(X,Y,Z) shading interp zmax=max(max(Z)); zmin=min(min(Z)); caxis([zmin,zmax]) colorbar('Location','North','Position',[0.25,0.92,0.515,0.025]) hold on C=contour(X,Y,Z,n,'k:'); clabel(C) hold off subplot('Position',[0.57,0.11,0.335,0.75]) [C,h]=contourf(X,Y,Z,n,'k:'); clabel(C,h) colormap(cool) set(gcf,'Color','w') 20 3.89 5.96 -0.237 -2.3 1.83 1.83 -4.37 -0.237 -2.3 图 6.4-1 “二维半”指令的演示 6.4.2 准四维表现 【例 6.4-2】用颜色表现 z  f (x, y) 函数的梯度、曲率等特征。(图 6.4-2) clf x=3*pi*(-1:1/15:1);y=x;[X,Y]=meshgrid(x,y); R=sqrt(X.^2+Y.^2); R(R==0)=eps; Z=sin(R)./R; [dzdx,dzdy]=gradient(Z); %<5> dzdr=sqrt(dzdx.^2+dzdy.^2); %<6> subplot('Position',[0.13,0.21,0.335,0.65]) surf(X,Y,Z,abs(dzdr)) %<8> % <7> shading interp; colorbar('Location','North','Position',[0.25,0.12,0.515,0.025]) %<10> brighten(0.6); colormap jet alphamap('rampup') alpha('color') %<14> alpha('interp') title('No. 1 surf(X,Y,Z,abs(dzdr))') dz2=del2(Z); %<17> subplot('Position',[0.57,0.21,0.335,0.65]) surf(X,Y,Z,abs(dz2)) %<19> % <18> shading interp title('No. 2 surf(X,Y,Z,abs(dz2))') 21 图 6.4-2 准四维表现曲面的径向导数和曲率特征 6.4.3 四维切片及等位线 【例 6.4-3】利用 slice 和 contourslice 表现 MATLAB 提供的无限大水体中水下射流速度数据 flow 。flow 是一组定义在三维空间上的函数数据。本例将动用切片、视角、色彩和透明度 等综合手段观察定义在三维空间上的函数。 (1) figure(1);clf [X,Y,Z,V]=flow; x1=min(min(min(X)));x2=max(max(max(X))); y1=min(min(min(Y)));y2=max(max(max(Y))); z1=min(min(min(Z)));z2=max(max(max(Z))); sx=linspace(x1+1.2,x2,5); sy=0; sz=0; slice(X,Y,Z,V,sx,sy,sz); view([-33,36]);shading interp; colormap jet; alpha('color') alphamap('rampdown') colorbar axis off u=caxis; 22 图 6.4-3 切片图 (2) figure(2);clf v1=min(min(min(V)));v2=max(max(max(V))); cv=linspace(v1,v2,15); contourslice(X,Y,Z,V,sx,sy,sz,cv) view([-12,30]) colormap jet colorbar caxis(u) box on 23 6.5 动态图形 图 6.4-4 切片等位线图 6.5.1 高层指令生成动态图形 1. 彗星状轨迹图 【例 6.5-1】卫星返回地球的运动轨线示意。(请读者自己在指令窗中运行以下指令。) shg;R0=1; a=12*R0;b=9*R0; T0=2*pi; T=5*T0;dt=pi/100;t=[0:dt:T]'; f=sqrt(a^2-b^2); th=12.5*pi/180; E=exp(-t/20); x=E.*(a*cos(t)-f);y=E.*(b*cos(th)*sin(t));z=E.*(b*sin(th)*sin(t)); plot3(x,y,z,'g') [X,Y,Z]=sphere(30);X=R0*X;Y=R0*Y;Z=R0*Z; grid on,hold on surf(X,Y,Z) shading interp x1=-18*R0;x2=6*R0;y1=-12*R0;y2=12*R0;z1=-6*R0;z2=6*R0; axis([x1 x2 y1 y2 z1 z2]) view([133 65]) comet3(x,y,z,0.02) hold off 24 图 6.5-1 卫星返回地球轨线示意 2. 色图的变幻 【例 6.5-2】指令 spinmap 的应用。(图 6.5-2) ezsurf('x*y','circ');shading flat;view([-18,28]) C=summer; CC=[C;flipud( C )]; colormap(CC) spinmap(30,4) 图 6.5-2 用于色图变幻演示的图形 3. 影片动画 【例 6.5-3】三维图形的影片动画。因印刷关系,在纸面上无法表现,请读者自己在指令窗 中运行以下指令。 (1) clf x=3*pi*(-1:0.05:1);y=x;[X,Y]=meshgrid(x,y); R=sqrt(X.^2+Y.^2)+eps; Z=sin(R)./R; h=surf(X,Y,Z);colormap(jet);axis off n=12; 25 for i=1:n rotate(h,[0 0 1],25); mmm(i)=getframe; end close (2) shg,axis off movie(mmm,5,10) 6.5.2 低层指令生成实时动画 【例 6.5-4】制作红色小球沿一条带封闭路径的下旋螺线运动的实时动画(图 6.5-3)。 (1) function f=exm060504_anim(K,ki) t1=(0:1000)/1000*10*pi;x1=cos(t1);y1=sin(t1);z1=-t1; t2=(0:10)/10;x2=x1(end)*(1-t2);y2=y1(end)*(1-t2);z2=z1(end)*ones(size(x2)); t3=t2;z3=(1-t3)*z1(end);x3=zeros(size(z3));y3=x3; t4=t2;x4=t4;y4=zeros(size(x4));z4=y4; x=[x1 x2 x3 x4]; n=length(x); if nargin<2 ki=fix(n/2); end y=[y1 y2 y3 y4];z=[z1 z2 z3 z4]; shg plot3(x,y,z,'Color',[1,0.6,0.4],'LineWidth',2.5) axis off h=line('xdata',x(1),'ydata',y(1),'zdata',z(1),'Color','r','Marker', '.', 'MarkerSize',40,'EraseMode','xor'); KK=K*n; text(-1,-0.85,-36,'倒计数') KK=KK-1; htext=text(-1,-1,-40,int2str(KK)); i=2;j=1; while 1 set(h,'xdata',x(i),'ydata',y(i),'zdata',z(i)); drawnow; % <23> pause(0.0005) % <24> i=i+1; KK=KK-1; set(htext,'string',int2str(KK)) %<27> if nargin==2 && nargout==1 if(i==ki&&j==1);f=getframe(gcf);end % <29> end if i>n i=1;j=j+1; if j>K;break;end end end (2) shg f=exm060504_anim(1,254); 26 (3) image(f.cdata),axis off 图 6.5-3 红球沿下旋螺线运动的瞬间照片 6.6 特殊图形指令 6.6.1 彩色份额图 1. 面域图 area 【例 6.6-1】面域图指令 area 的用法 。(图 6.6-1) x=-2:2 Y=[3,5,2,4,1;3,4,5,2,1;5,4,3,2,5]%(3*5)的 Y 数组的 CS=flipud(cumsum(Y)) area(x',Y',0) legend('因素 A','因素 B','因素 C') grid on,colormap(spring) x= -2 -1 0 1 2 Y= 3 5 2 4 1 3 4 5 2 1 5 4 3 2 5 CS = 11 13 10 8 7 6 9 7 6 2 3 5 2 4 1 27 14 12 10 8 6 4 2 0 -2 -1.5 -1 -0.5 0 0.5 1 图 6.6-1 面域图表现各分量的贡献 因素A 因素B 因素C 1.5 2 2. 直方图 bar, barh, bar3, bar3h 【例 6.6-2】本例演示:二维、三维直方图绘制指令 bar 和 bar3 的基本用法(图 6.6-2)。每 种直方图都有两种图型:垂直直方图(bar, bar3)和水平直方图(barh, bar3h)。而每种图 型又有两种表现模式:累计式(对应关键词为 stacked):分组式(对应关键词为 grouped)。 x=-2:2; Y=[3,5,2,4,1;3,4,5,2,1;5,4,3,2,5]; subplot(1,2,1) bar(x',Y','stacked') xlabel('x'),ylabel('\Sigma y'),colormap(cool) legend('因素 A','因素 B','因素 C') subplot(1,2,2) bar3h(x',Y','grouped') y x 14 因素A 12 因素B 2 因素C 1 10 0 8 -1 6 -2 4 0 2 2 0 -2 -1 0 1 2 x 4 y 6 图 6.6-2 二维、三维直方图 3. 饼图 pie, pie3 【例 6.6-3】饼图指令 pie , pie3 用来表示各元素占总和的百分数(图 6.6-3)。该指令第二输 入宗量是与第一宗量同长的 0-1 向量,1 使对应扇块突出。 a=[1,1.6,1.2,0.8,2.1]; 28 subplot(1,2,1) pie(a,[1 0 1 0 0]) axis equal legend({'1','2','3','4','5'},'Location','EastOutside') subplot(1,2,2) pie3(a,double(a==min(a))) colormap(cool) 15% 31% 1 2 24% 3 4 12% 5 18% 15% 24% 31% 12% 18% 图 6.6-3 饼形统计图 6.6.2 有向线图 【例 6.6-4】 本例演示:compass 和 feather 指令要求输入量是“直角坐标系”数据;把极坐 标变换为直角坐标的指令 pol2cart。(图 6.6-4) t=-pi/2:pi/12:pi/2; r=ones(size(t)); [x,y]=pol2cart(t,r); subplot(1,2,1),compass(x,y),title('Compass') subplot(1,2,2),feather(x,y),title('Feather') 6.6.3 Compass 90 1 120 60 150 0.5 30 180 0 210 330 240 300 270 1 0.8 0.6 0.4 0.2 0 -0.2 -0.4 -0.6 -0.8 -1 0 Feather 5 10 15 图 6.6-4 compass 和 feather 指令的区别 多面体异形图 29 1. 德洛奈三角剖分和 Voronoi 图 【例 6.6-5】本例演示:德洛奈三角剖分(Delaunay Triangulation)指令 delaunay 和 Voronoi 多边形(Voronoi Polygon)指令 voronoi 的调用格式;fill 采用色图色彩填色;借助图柄设置 线宽属性。(图 6.6-5) clf; rng(111,'v5uniform') n=30; X=rand(n,1)-0.5; Y=rand(n,1)-0.5; T=delaunay(X,Y); Tc=[T T(:,1)]; hold on;axis square ism=1:length(T); fh=fill(X(Tc'),Y(Tc'),ism); set(fh([28,37]),'LineWidth',5) voronoi(X,Y,'r') colormap(summer) hold off 0.5 0.4 0.3 0.2 0.1 0 -0.1 -0.2 -0.3 -0.4 -0.5 0 0.5 图 6.6-5 Delaubay 三角剖分和 Voronoi 多边形 2. 填色图 fill,fill3 【例 6.6-6】本例演示:表示 fill 指令所填色多边形的数组必须首尾数据重合(见第<4>行); fill 或 fill3 输入量构造的多边形都必须是封闭的(见第<9><10><11>行);任意位置图例的 生成(见第<14><15>行)。(图 6.6-6) clf subplot('Position',[0.10,0.16,0.205,0.75]) n=10;dt=2*pi/n;t=0:dt:2*pi; t=[t,t(1)]; %<4> 30 x=sin(t);y=cos(t); fill(x,y,'c') axis equal off subplot('Position',[0.44,0.16,0.335,0.75]) X=[0.5 0.5 0.5 0.5;0.5 0.5 0.5 0.5;0 1 1 0]; Y=[0.5 0.5 0.5 0.5;0.5 0.5 0.5 0.5;0 0 1 1]; Z=[1 1 1 1;0 0 0 0;0 0 0 0]; %<11> C=[1,10,20,30]; fill3(X,Y,Z,C) LH=legend('1','2','3','4','Location','SouthWest'); set(LH,'Position',[0.291,0.122,0.121,0.136]) view([-16 74]),colormap cool xlabel('x'),ylabel('y'),box on;grid on % % %<14> <9> <10> 1 0.5 0 1 0.8 0.6 0.4 1 0.2 2y 1 0.5 3 4 00 x 图 6.6-6 用 fiil 和 fill3 对多边形填色 3. 不规则数据的网线图和曲面图 【例 6.6-7】用三角网线、曲面图表现函数 z  sin R , R  R rng(10) X=6*pi*(rand(120,1)-0.5); Y=6*pi*(rand(120,1)-0.5); R=sqrt(X.^2+Y.^2); R(R==0)=eps;Z=sin(R)./R; tri=delaunay(X,Y); subplot(1,2,1),trimesh(tri,X,Y,Z) subplot(1,2,2),trisurf(tri,X,Y,Z) colormap(jet);brighten(0.5) x2  y 2 。(图 6.6-7) 31 1 1 0.5 0.5 0 0 -0.5 10 0 -0.5 10 10 0 0 10 0 -10 -10 -10 -10 图 6.6-7 不规则数据的三维表现 4. 彩带图 ribbon 【例 6.6-8】用彩带绘图指令 ribbon ,绘制归化二阶系统 G  s2 1 在不同   2s 1 值时的 阶跃响应(见图 6.6-8)。 clear zeta2=[0.1 0.2 0.3 0.4 0.5 0.6 0.8 1.0]; %<2> n=length(zeta2); for k=1:n;Num{k,1}=1;Den{k,1}=[1 2*zeta2(k) 1];end S=tf(Num,Den); t=(0:0.4:30)'; [Y,~]=step(S,t); tt=t*ones(size(zeta2)); ribbon(tt,Y,0.4) view([150,50]),shading interp,colormap(jet) light,lighting phong,box on for k=1:n;str_lgd{k,1}=num2str(zeta2(k));end legend(str_lgd) str1='\itG = (s^{2} + 2\zetas + 1)^{-1}'; str2='\fontsize{14}\fontname{隶书}取不同'; str3='{\fontsize{10}\it \zeta }'; str4='\fontsize{14}\fontname{隶书}时的阶跃响应'; title([str1,str2,str3,str4]) ylabel('t') zlabel('\ity(\zeta,t) \rightarrow') 32 图 6.6-8 二阶系统在不同阻尼系数时的响应 6.6.4 散点图 scatter 和 plotmatrix 【例 6.6-9】模拟性地表现受噪声污染的 64QAM 星座信号。(图 6.6-9) rng(2) S=randsrc(10000,2,[-7,-5,-3,-1,1,3,5,7]); Sn=S+0.3*randn(size(S)); scatter(Sn(:,1),Sn(:,2),'.') grid on,box on,axis equal axis([-9,9,-9,9]) xlabel('实部'),ylabel('虚部') 33 图 6.6-9 含噪声 64QAM 信号的二维散点图 【例 6.6-10】本例演示:plotmatrix 的三种调用格式;( p  n) 的 X 数组和 ( p  m) 的 Y 数组, 在 plotmatrix(X,Y)作用下,画出 (m  n) 个小子图,其中第 (i, j) 个小子图是根据 Y 第 i 列和 X 第 j 列数据画出的;plotmatrix(X)作用与 plotmatrix(X,X)相同;由同列相互作用产生的小 子图位置画出频数直方图。(图 6.6-10) rng default X=randn(1000,2); Y=rand(1000,1); subplot(1,3,1),plotmatrix(X) subplot(1,3,2),plotmatrix(Y) subplot(1,3,3),plotmatrix(X,Y) 图 6.6-10 plotmatrix 表现数据统计特性 6.6.5 泛函绘图指令 fplot 【例 6.6-11】本例演示:fplot 与 ezplot, plot 等线图指令的绘图效果比较。(图 6.6-11) fun=@(t)(sin(1./t)); subplot(1,3,1),ezplot(fun,[0.01,0.1]) title('\fontsize{10}\fontname{隶书}ezplot 绘图效果') 34 t=linspace(0.01,0.1,50); subplot(1,3,2),plot(t,fun(t)) axis([0.01,0.1,-1.23,1.23]),xlabel('t') title('\fontsize{10}\fontname{隶书}plot 绘图效果') subplot(1,3,3),fplot(fun,[0.01,0.1],1e-3) axis([0.01,0.1,-1.23,1.23]),xlabel('t') title('\fontsize{10}\fontname{隶书}fplot 绘图效果') ezplot绘图效果 plot绘图效果 fplot绘图效果 1 1 1 0.5 0.5 0.5 0 0 0 -0.5 -0.5 -0.5 -1 -1 -1 0.05 0.1 0.05 0.1 0.05 0.1 t t t 图 6.6-11 fplot 自适应绘图的优点体现 6.7 图象 6.7.1 图象的类别和显示 6.7.2 图象的读写 【例 6.7-1】图象文件的读取和图象的显示。 (1) clear im1=imfinfo('trees','tif'); disp(['原图像文件格式',blanks(5),'图像类型']) disp([im1(1).Format,blanks(14),im1(1).ColorType]) [X,cmap]=imread('trees.tif'); image(X);colormap(cmap) axis image off title('变址图像') 原图像文件格式 图像类型 tif indexed 35 变址图像 图 6.7-1 变址图象 (2) imbody=imfinfo('liftingbody','png'); disp(['原图像文件格式',blanks(5),'图像类型']) disp([imbody.Format,blanks(14),imbody.ColorType]) X=imread('liftingbody.png'); imagesc(X);colormap(gray) axis image off title('灰度图象') 原图像文件格式 图像类型 png grayscale 灰度图象 图 6.7-2 灰度图象 (3) imold=imfinfo('office_4','jpg'); disp(['原图像文件格式',blanks(5),'图像类型']) disp([imold.Format,blanks(14),imold.ColorType]) X=imread('office_4.jpg'); imwrite(X,'ffzzy.tiff') 36 image(imread('ffzzy.tiff')) axis image off title('真彩图像') 原图像文件格式 图像类型 jpg truecolor 真彩图像 图 6.7-3 真彩图象 6.8 图形窗的编辑探索功能 6.8.1 图形窗的结构 1. 图形窗的功能分区 37 图 6.8-1 编辑状态的图形窗 2. 图形窗工具条 图 6.8-2 图形窗工具条专用按键 3. 主要构件与对应菜单 38 图 6.8-3 子图坐标选配窗的功能分区 39 图 6.8-4 图形对象浏览列表的功能 图 6.8-5 图形对象属性编辑器 6.8.2 指令鼠标混合操作生成绘图文件 【例 6.8-1】本例演示:简单线图如何在图形窗编辑下转变成图 6.8-6 所示的图形;图形窗的 属性编辑功能;如何从图形窗产生绘图函数文件;如何修改自动生成文件。 40 图 6.8-6 精细修饰的图形 (1)运行指令绘出简图 t=(0:pi/100:pi)'; y1=sin(t)*[1,-1]; y2=sin(t).*sin(9*t); t3=pi*(0:9)/9; y3=zeros(size(t3)); plot(t,y1,t,y2,t3,y3) (2)使图形窗工作在编辑状态。 (3) 图 6.8-7 编辑工作模式下的图形窗界面 41 (4) 图 6.8-8 横坐标上限设置示例 (5) 图 6.8-9 包络线的设置示例 (6) 图 6.8-10 调制曲线的设置示例 图 6.8-11 调制曲线的设置示例 (7) 表 6.8-2 自动产生文件和新修改文件的对照 MATLAB 自动产生的“图形修饰文件” “图形修饰文件” function createfigure(X1, YMatrix1, X2, Y1) function exm060801_2 %CREATEFIGURE(X1,YMATRIX1,X2,Y1) % X1横坐标列数组 % X1: vector of x data % YMATRIX1: matrix of y data % X2: vector of x data % Y1: vector of y data % YMatrix1 是3列与X1等长列构成的数组; % 列次序为2条包络线、1条调制线 % X2 与Y1配对绘制曲线过零点 % Auto-generated by MATLAB % Create figure figure1 = figure; % t=(0:pi/100:pi)'; % <1> y1=sin(t)*[1,-1]; y2=sin(t).*sin(9*t); t3=pi*(0:9)/9; y3=zeros(size(t3)); % <5> X1=t;YMatrix1=[y1,y2]; % <6> X2=t3;Y1=y3; % <7> 42 % Create axes axes1 = axes('Parent',figure1); % Uncomment the following line to preserve the xlim(axes1,[0 3.1416]); % X-limits of the axes % xlim(axes1,[0 3.1416]); box(axes1,'on'); hold(axes1,'all'); % Create multiple lines using matrix input to plot plot1 = plot(X1,YMatrix1,'LineStyle',':','Color',[1 0 0],'Parent',axes1); set(plot1(3),'Marker','o','Color',[0 0 1],'LineStyle','-'); % Create plot plot(X2,Y1,'MarkerFaceColor',[1 1 0],... 'MarkerEdgeColor',[0 0.5 0],... 'Marker','square',... 'LineStyle','none'); 6.8.3 数据探针 <10> 【例 6.8-2】本例演示:数据探针激活的指令方式;数据探针标识单个和多个图形点;数据 构图点和任意图形点的获取;探针获取数据的保存。(图 6.8-12) (2) (3) 图 6.8-12 数据探针标识的曲面数据及其现场菜单 43 图 6.8-13 由变量编辑器所显示的新生变量 cursor_info 图 6.8-14 变量编辑器所显示的新生变量 cursor_info(1,1)的内容 6.8.4 数据刷 【例 6.8-3】本例借助多条 2 维曲线图,演示图形窗数据刷的基本使用方法:数据刷的激活; 单点及成片数据的刷取;接续刷取数据的操作方法;用刷取数据创建新变量;被刷数据的 镂空。此外,本例还演示了 line 所绘曲线数据的不可刷取性。 (1) clear,clf rng(0,'v5normal') x=linspace(0,2*pi,100); yr=0.3*randn(size(x)); yes=exp(-x/3).*sin(3*x); ye=exp(-x/3); plot(x,yr,'b-',x,yes,'g-','LineWidth',2) line(x,ye,'Color','k') line(x,-ye,'Color','k') grid on,shg (2) (3) (4) 44 (5) 图 6.8-15 图形数据的刷取 图 6.8-16 被刷图形数据的鉴别窗 45 (6) 图 6.8-17 被刷图形数据的保存 图 6.8-18 被刷数据删除后的图形 6.8.5 数据链和数据联动 【例 6.8-4】本例演示:数据链和图形关联;关联图形的自动配置和手工检验;数据刷和数 据联动。 (1) clear 46 N=100; t=(linspace(0,2*pi,N))'; x=sin(t); y=cos(t); subplot(2,1,1),plot(t,x,'c') axis([0,2*pi,-1.2,1.2]) hold on stairs(t,sin(t.*t),'b') hold off subplot(2,1,2),stem(t,y,'k') axis([0,2*pi,-1.2,1.2]) (2) 图 6.8-19 经自动关联后的图形窗 47 (3) (4) (5) 图 6.8-20 手工设定曲线对应数据源的对话窗 图 6.8-21 在 t 变量子窗中主动刷取的数据 48 图 6.8-22 图形窗中被联动刷红的线段 49 第 7 章 M 文件和函数句柄 除极简单问题外,大多数实际问题不可能仅仅依靠 MATLAB 指令窗中一条条零碎的指 令解决,而需要编程。本章就是为帮助读者编写解决实际问题的程序文件而设置的。 本章的前三节介绍 MATLAB 程序文件的编写基础,包括程序的基本构件、数据流控制、 M 文件的基本类型等。 从第 7.4 节起到第 7.7 节止,由浅入深地用四大节篇幅分别叙述了编写复杂程序所必需 的组件和技术:  各类函数、子函数及对象:主函数、子函数、匿名函数和嵌套函数;内联对象;  直接句柄和匿名句柄。  构成泛函计算能力的 eval 和 feval 指令。  变量的使用域和跨内存调用和赋值。 本章最后一节系统介绍提高程序质量、编程效率和动态调试能力的辅助工具:词串彩 化和定界符匹配提示、M-Lint 代码分析器、交互式调试器和性能剖析器。 本章配备了许多精心设计的算例。这些算例是完整的,可直接演练的。注意:算例中 凡带 exm 前缀文件名的 M 文件、P 文件在随书光盘上都有相应的电子文档。读者通过这些 算例,将真切感受到抽象概念的内涵、各指令间的协调,将从感知上领悟到编程的至关要 领。 7.1 M 码编程的基本构件 1 变量 (Variables) 2 运算及运算符 3 标点符号 (Symbol) 4 关键词 (Keywords) 5 特殊值 (Special Values) 6 MATLAB 函数 (Internal MATLAB Functions) 7 指令及指令行 (Commands and Command line) 7.2 MATLAB 的数据流控制 1 7.2.1 for 循环和 while 循环控制 1 循环结构的基本形式 【例 7.2-1】创建 Hilbert 矩阵。 (1) (2) clear for K=1:15 A = zeros(K,K) ; %<2> for ii = 1:K %<3> for jj = 1:K %<4> A(ii,jj) = 1/(ii+jj-1); end end %<7> CA(K)=cond(A); if K==5 format rat disp('A5='),disp(A) format end end semilogy(CA) grid on xlabel('矩阵的阶'),ylabel('矩阵条件数') title('Hilbert 矩阵的条件数') A5= 1 1/2 1/3 1/4 1/5 1/2 1/3 1/4 1/5 1/6 1/3 1/4 1/5 1/6 1/7 1/4 1/5 1/6 1/7 1/8 1/5 1/6 1/7 1/8 1/9 1020 Hilbert矩 阵 的 条 件 数 1015 矩阵条件数 1010 105 0 10 0 5 10 15 矩阵的阶 图 7.2-1 Hibert 矩阵条件与其阶数的关系 【例 7.2-2】矩阵(数组)构建方法对构建速度的影响。 (1) clear tic K=1000; for ii = 1:K for jj = 1:K 2 A1(ii,jj) = 1/(ii+jj-1); end end t1=toc t1 = 7.8449 (2) tic K=1000; A2 = zeros(K,K); for ii = 1:K for jj = 1:K A2(ii,jj) = 1/(ii+jj-1); end end t21=toc/t1 t21 = 0.2855 (3) tic K=1000; II=repmat(1:K,K,1); JJ=II'; A3=1./(II+JJ-1); t31=toc/t1 t31 = 0.0091 N 【 例 7.2-3 】 对 于 预 先 指 定 的 控 制 精 度  , 求 S  1 n ,其中 N 要满足约束  n1 k k 1   N  a r gm i n 1 N     。   k   k1  (1) function [S,N]=exm070203_1(epsilon) d=inf;k=0;s=0;S=0; while d>epsilon k=k+1; s=s+k; d=1/s; S=S+d; end N=k; function [S,N]=exm070203_2(epsilon) d=inf;k=0;s=0;S=0; while 1 k=k+1; s=s+k; d=1/s; S=S+d; if d try h=plot(varargin{:}); % <4> catch h=ezplot(varargin{:}); % <6> end ERR=lasterror; % <8> switch nargout % <9> case 1 varargout{1}=h; % <11> case 2 varargout{1}=h; % <13> varargout{2}=ERR; % <14> otherwise if ~isempty(ERR.message) % <16> disp('ERR ='),disp(ERR),disp(' ') disp('ERR.message ='),disp(ERR.message),disp(' ') disp('ERR.stack ='),disp(ERR.stack),disp(' ') end end shg 7 (2) x=(0:100)*2*pi/100;y=exp(-x).*cos(x); exm070206_AnyPlot(x,y,'.r','MarkerSize',5) 1.2 1 0.8 0.6 0.4 0.2 0 -0.2 0 1 2 3 4 5 6 7 图 7.2-6 采用 plot 格式画的曲线 (3) exm070206_AnyPlot('exp(-x)*cos(x)',[0,7,-0.2,1.2]) ERR = message: [1x48 char] identifier: 'MATLAB:plot:InvalidFirstInput' stack: [1x1 struct] ERR.message = Error using ==> plot Invalid first data argument ERR.stack = file: 'D:\NewBook\Master20101204\Ch07_编程\exm070206_AnyPlot.m' name: 'exm070206_AnyPlot' line: 5 exp(-x) cos(x) 1.2 1 0.8 0.6 0.4 0.2 0 -0.2 0 1 2 3 4 5 6 7 x 8 图 7.2-7 采用 ezplot 格式画的曲线 (4) [H,EM]=exm070206_AnyPlot('cos(t)','sin(t)'); EM EM = message: [1x48 char] identifier: 'MATLAB:plot:InvalidFirstInput' stack: [1x1 struct] x = cos(t), y = sin(t) y 0.8 0.6 0.4 0.2 0 -0.2 -0.4 -0.6 -0.8 -1.5 -1 -0.5 0 0.5 1 1.5 x 图 7.2-8 采用 ezplot 参数方程格式画的曲线 7.2.5 1 2 3 编程用的其他指令 return 返回和 pause 暂定 error 出错信息和 warning 警告 与键盘交互指令 input 和 keyboard 7.3 M 文件和 P 文件 7.3.1 M 文件 1 M 脚本文件 (一)一般性说明 (二)M 脚本文件的基本结构 2 M 函数文件 (一)一般性说明 9 (二)M 函数文件的基本结构 【例 7.3-1】编写一个 M 函数文件。 它具有以下功能:(A)根据指定的半径,画出蓝色圆 周线;(B)可以通过输入字符串,改变圆周线的颜色、线型;(C)假若需要输出圆面积, 则绘出圆。 (1) function [S,L]=exm070301(N,R,str) switch nargin case 0 N=100;R=1;str='-b'; case 1 R=1;str='-b'; case 2 str='-b'; case 3 ; otherwise error('输入量太多。'); end; t=0:2*pi/N:2*pi; x=R*sin(t);y=R*cos(t); if nargout==0 plot(x,y,str); elseif nargout>2 error('输出量太多。'); else S=N*R*R*sin(2*pi/N)/2; L=2*N*R*sin(pi/N); fill(x,y,str) end axis equal square box on shg (2) [S,L]=exm070301(6,2,'-g') S= 10.3923 L= 12.0000 10 2 1.5 1 0.5 0 -0.5 -1 -1.5 -2 -2 -1 0 1 2 图 7.3-1 绿色正六边形 7.3.2 P 码文件的创建、查询和清除 【例 7.3-2】借用例 7.3-1 中现成的程序 exm070301.m 创建 exm070302.p 文件,并绘制蓝色 五边形。 (1) (2) (3) help exm070302_help exm070302.m The area and perimeter of a regular polygon (正多边形 的面积和周长) N The number of sides R The circumradius str A line specification to determine line type/color S The area of the regular polygon L The perimeter of the regular polygon exm070302 用蓝实线画半径为 1 的圆 exm070302(N) 用蓝实线画外接半径为 1 的正 N 边形 exm070302(N,R) 用蓝实线画外接半径为 R 的正 N 边形 exm070302(N,R,str) 用 str 指定的线画外接半径为 R 的正 N 边形 S=exm070302(...) 给出多边形面积 S ,并画相应正多边形填色图 [S,L]=exm070302(...) 给出多边形面积 S 和周长 L,并画相应正多边形填色图 (4) exm070302(5) 11 1 0.5 0 -0.5 -1 -1 -0.5 0 0.5 1 图 7.3-2 蓝色正五边形 7.4 MATLAB 的函数类别 7.4.1 1 2 主函数和子函数 主函数 子函数 【例 7.4-1】编写一个内含子函数的 M 函数绘图文件。 (1) function Hr=exm070401(flag ) t=(0:50)/50*2*pi; x=sin(t); y=cos(t); Hr=@cirline; feval(Hr,flag,x,y,t) % ------------function cirline(wd,x,y,t) switch wd case 'line' plot(t, x, 'b' ,t , y, 'r', 'LineWidth', 2) case 'circle' plot(x, y, '-g', 'LineWidth', 8), axis square off otherwise error('输入宗量只能取 ''line'' 或 ''circle'' ! ') end shg (2) 12 HH=exm070401('circle') HH = @cirline 图 7.4-1 绿色圆周线 (3) t=0:2*pi/5:2*pi;x=cos(t);y=sin(t); HH('circle',x,y,t) 7.4.2 1 图 7.4-2 由子函数绘制的绿色正五边形 匿名函数 匿名函数及其句柄的创建 2 匿名函数的调用 13 7.4.3 1 嵌套函数 嵌套函数的结构特点 2 调用规则 3 变量作用域 【例 7.4-2】嵌套函数的调用和变量作用域运行示例。 function exm070402_Azy clear,clc u='在主函数 exm070402_Azy 中的定义变量 u。' disp(' '),disp('Press any key to continue'),pause B1 function B1 disp('******第二层嵌套函数 B1 被主函数调用******') u disp('以上显示是:在第二层嵌套函数 B1 中,访问 u 的结果。') disp(' '),disp('Press any key to continue'),pause u='现在第二层嵌套函数 B1 中,u 被重新赋为此字符串了。' disp(' '),disp('Press any key to continue'),pause C1 function C1 disp('******第三层嵌套函数 C1 被直系父函数 B1 调用******') u disp('以上显示是:在第二层嵌套函数 C1 中,访问 u 的结果。 ') disp(' '),disp('Press any key to continue'),pause u='现在第三层嵌套函数 C1 中,u 被第 2 次改写了。' disp(' '),disp('Press any key to continue'),pause B2; end end %----------------------% function B2 disp('******第二层嵌套函数 B2 被“旁系”B1 的子函数 C1 调用了!******') u disp('以上显示是:在“旁系”B2 中,访问 u 的结果。') disp('这是由于变量 u 的“根”在主函数中缘故。') disp(' '),disp('Press any key to continue'),pause C2 function C2 disp('******第三层嵌套函数 C2 被直系父函数 B2 调用!******') u disp('以上显示是:在“旁系”B2\C2 中,访问 u 的结果。') disp('这也是由于变量 u 的“根”在主函数 Azy 中缘故。') disp(' '),disp('Press any key to continue'),pause u='在 B2\C2 嵌套函数中,u 被隔层重新设置。' w='在 B2\C2 嵌套函数中,新定义的变量 w。' end end 14 disp(' '),disp('Press any key to continue'),pause disp('******现在回到主函数了!******') u disp('历经多个嵌套函数后,所保留下的最后在 B2\C2 所赋的值。') w disp('不管哪个嵌套函数定义的变量(如 w),主函数总能对此变量访问和设置。') end 7.5 函数句柄 7.5.1 函数作用域和优先等级 7.5.2 1 2 函数句柄的创建 直接句柄创建法 匿名句柄创建法 7.5.3 1 2 函数句柄的调用格式 直接句柄调用格式 匿名句柄调用格式 7.5.4 观察函数句柄的内涵 【例 7.5-1】采用 M 函数文件描写 y(t)  cos 1 at 2 ,其中 a 是可变参数。试画出 0.2  t  0.3 区间上的函数曲线。 (1) function y=exm070501_chirp(t,a) switch nargin case 1 a=1; case 2 otherwise error('本函数只允许 1 个或 2 个输入量!') end y=cos(1./(a*t .^2)); (2) a=1.5; t=0.2:0.0001:0.3; y0=exm070501_chirp(t,a); %<3> 15 (3) Fy=@exm070501_chirp; a=1.5; t=0.2:0.0001:0.3; y1=Fy(t,a); %<4> %<7> (4) a=1.5; Gy=@(t)exm070501_chirp(t,a); t=0.2:0.0001:0.3; y2=Gy(t); %<9> %<11> (5) CFy=functions(Fy) %<12> CGy=functions(Gy) %<13> CFy = function: 'exm070501_chirp' type: 'simple' file: 'D:\NewBook\Master20101204\Ch07_编程\exm070501_chirp.m' CGy = function: '@(t)exm070501_chirp(t,a)' type: 'anonymous' file: '' workspace: {[1x1 struct]} CGy.workspace{1} ans = a: 1.5000 (6) same01=(norm(y0-y1)/norm(y0)<1e-12) same02=(norm(y0-y2)/norm(y0)<1e-12) same01 = 1 same02 = 1 7.6 泛函演算指令 7.6.1 eval 【例 7.6-1】计算“表达式”串,产生向量值。 (1) clear t=pi; cem='[t/2,t*2,sin(t)]'; y=eval(cem) y= 1.5708 6.2832 0.0000 (2) clear t=pi; eval('theta=t/2,y=sin(theta)'); theta = 1.5708 16 y= 1 (3) A=ones(2,1); B=ones(1,3); c=eval('A*B') c= 1 1 1 1 1 1 (4) clear all CEM={'cos','exp','10^'}; for k=1:3 theta=pi*k/12; y(1,k)=eval([CEM{k},'(',num2str(theta),')']); end y y= 0.9659 1.6881 6.1010 (5) B=magic(4); [Q,D]=eval('eig(B)'); Q= -0.5000 -0.8236 -0.5000 0.4236 -0.5000 0.0236 -0.5000 0.3764 D= 34.0000 0 0 8.9443 0 0 0 0 0.3764 0.0236 0.4236 -0.8236 0 0 -8.9443 0 -0.2236 -0.6708 0.6708 0.2236 0 0 0 0.0000 7.6.2 feval 【例 7.6-2】feval 和 eval 的调用区别 (1) format short x=pi/4; Ve=eval('1+sin(x)') Ve = 1.7071 Vf=feval('1+sin(x)',x) ??? Error using ==> feval Invalid function name '1+sin(x)'. (2) rng(1,'v5normal') A=randn(2,2); [u1,d1,v1]=svd(A); Hs=@svd; [u2,d2,v2]=Hs(A); [u3,d3,v3]=feval(Hs,A); [u4,d4,v4]=eval('svd(A)'); disp('A 阵奇异值分解三对组') 17 disp([blanks(11),'u1',blanks(18),'d1',blanks(17),'v1']) disp([u1,d1,v1]) A 阵奇异值分解三对组 u1 d1 v1 -0.8566 0.5160 1.3683 0 -0.5056 0.8627 0.5160 0.8566 0 0.6105 0.8627 0.5056 7.6.3 内联对象 【例 7.6-5】用内联对象表达 y(a, b, x)   b a2 sin  x 。 (1) Y=inline('[a^2;b*sin(x)]','a','b','x') Y= Inline function: Y(a,b,x) = [a^2;b*sin(x)] (2) disp('函数表达式'),disp(char(Y)) disp('内联对象的输入量'),disp(argnames(Y)) 函数表达式 [a^2;b*sin(x)] 内联对象的输入量 'a' 'b' 'x' (3) a=3;b=3;x=pi/3; disp('Y 值为'),disp(Y(a,b,x)) Y 值为 9.0000 2.5981 feval(Y,a,b,x) ans = 9.0000 2.5981 (4) Yv=vectorize(Y) Yv = Inline function: Yv(a,b,x) = [a.^2;b.*sin(x)] a=1:5;b=5:-1:1;x=(0.2:0.2:1)*pi; Yv1=Yv(a,b,x) Yv1 = 1.0000 4.0000 9.0000 16.0000 2.9389 3.8042 2.8532 1.1756 25.0000 0.0000 7.7 变量的使用域和跨内存交换 7.7.1 输入输出检测指令 18 7.7.2 “变长度”输入输出量 【例 7.7-1】变长度输入输出量的应用示例。 (1)编写函数文件 exm070701.m function varargout=exm070701(N,varargin) if ~any(nargout==[0,2,3]) error('输出量数目必须在集合{0,2,3}中') end if nargin<4 && nargout==3 %<5> error('想获得导函数数据,输入量数目必须大于等于 4') end flagplot=1; switch nargin case 0 N=2;a=2;nx=100;der1=0; case 1 a=2;nx=100;der1=0; case 2 a=varargin{1}; %<15> nx=100;der1=0; case 3 a=varargin{1}; nx=varargin{2}; der1=0; case {4,5} a=varargin{1}; nx=varargin{2}; der1=varargin{3}; if nargin==5 flagplot=varargin{4}; end end N1=N-1; x=linspace(-N,N,nx); dx=2*N/nx; b=-(N-2):2:(N-2); fsum=0; for ii=1:N1 fsum=fsum+2./(1+exp(-a*(x+b(ii)))); end y=fsum-N1; if der1==0 h0=plot(x,y,'-r',x,x,'-g'); set(h0(1),'LineWidth',2) axis([-N1,N1,-N1,N1]),axis equal,grid on xlabel('x'),ylabel('y') STR=' -level Sigmoid Function with a = '; title([num2str(N),STR,num2str(a)]) legend('Sigmoild','y=x','Location','east') elseif flagplot~=0 dy1=gradient(y)/dx; [ax,h1,h2]=plotyy(x,y,x,dy1); %<48> grid on set(ax(1),'YColor','r') 19 % <28> set(get(ax(1),'Ylabel'),'String','y') line(x,x,'Color','g') set(h1,'Color','r','LineWidth',2) set(h2,'LineWidth',2) set(get(ax(2),'Ylabel'),'String','dydx') xlabel('x') STR='-level Sigmoid Function and its 1st derivative with a = '; title([num2str(N),STR,num2str(a)]) legend('Sigmoid','y=x','dy1dx','Location','east') else dy1=gradient(y)/dx; end if nargout==2 varargout{1}=x; %<64> varargout{2}=y; elseif nargout==3 varargout{1}=x; varargout{2}=y; varargout{3}=dy1; end (2) exm070701 1 2 -level Sigmoid Function with a = 2 % <51> % <55> y 0.5 0 Sigmoild y=x -0.5 -1 -1 -0.5 0 0.5 1 x 图 7.7-1 二电平 Sigmoid 函数及参照线 (3) [x,y,dy1dx]=exm070701(4,5.5,200,1,1); 20 y dydx 4-level Sigmoid Function and its 1st derivative with a = 5.5 3 3 2 2.5 1 2 dSyig1mdxoid 0 Sy=igxmoid 1.5 yd=y1xdx -1 1 -2 0.5 -3 0 -4 -3 -2 -1 0 1 2 3 4 x 图 7.7-2 四电平 Sigmoid 函数、一阶导函数及参照线 7.7.3 1 局域变量、全域变量和持存变量 局域变量 2 全域变量 3 持存变量 7.7.4 跨内存计算及赋值 1 跨内存计算串表达式 【例 7.7-2】本例演示:编写绘制正多边形或圆的程序;子函数与(母)函数的关系;各种 不同的工作内存;evalin 运行机理与 eval 的异同。 (1) function y=exm070702(expr,sname) a=8; t=(0:a)/a*2*pi; y=subevalinzzy(expr,sname); %------------ function y=subevalinzzy(expr,sname) a=4; t=(0:a)/a*2*pi; switch sname case {'base','caller'} y=evalin(sname,expr); % <10> 21 case 'self' y=eval(expr); end %<12> (2) clear a=30; t=(0:a)/a*2*pi; expr='a*exp(i*t)'; sss={'base','caller','self'}; for k=1:3 y0=exm070702(expr,sss{k}); subplot(1,3,k) plot(real(y0),imag(y0),'r','LineWidth',3) axis square image title(sss{k}) end 图 7.7-3 利用不同内存中的变量计算出的 y=a*exp(i*t) 的图形 2 跨内存赋值 【例 7.7-3】assignin 运作机理示范。 (1) function y=exm070703(x) y=sqrt(x); t=x^2; assignin('base','yy',t) %把函数内存的t值赋给基空间内存的yy (2) clear x=4; y=exm070703(x); disp([blanks(5),'x',blanks(5),'y',blanks(4),'yy']) disp([x,y,yy]) %显示基空间中的变量值 x y yy 4 2 16 7.8 编辑调试器的应用深入 7.8.1 词串彩化和定界符匹配提示 22 1 词串彩化 2 定界符匹配提示 【例 7.8-1】本例采用专门设计的 exm070801.m,集中表现“词串彩化”、“定界符匹配指 示”、以及“M-Lint 检测信息的静态标志”等提示信息,以使读者能从具体实例中获得体 验。 (1) (2) 图 7.8-1 M 文件编辑器中多种查验信息的显示 23 (3) 7.8.2 1 2 M-Lint 代码分析器 检测信息的界面静态标识 详细检测信息的鼠标动态获取 【例 7.8-2】以 exm070801.m 为例,向读者展示鼠标法获取得的典型 M-Lint 详细检测信息。 (1) (2) 图 7.8-2 鼠标操作信息汇总彩色方块所获提示 (3) 图 7.8-3 鼠标操作信息彩色细条所获提示 7.8.3 1 2 M 文件调试器 直接调试法 交互式调试器的界面 24 图 7.8-4 M 文件编辑/调试器 3 调试器应用示例 【例 7.8-3】本例的目标:对于任意随机向量,画出鲜明标志该随机向量均值、标准差的频 数直方图(如图 7.8-5),或给出绘制这种图形的数据。 25 20 15 10 5 (1) 0 -2.5 -2 -1.5 -1 -0.5 0 0.5 1 1.5 2 2.5 图 7.8-5 带均值、标准差标志的频数直方图 function [nn,xx,xmu,xstd]=exm070803(x) %本函数文件专供实践调试器用 xmu=mean(x); xstd=std(x); [nn,xx]=hist(x); if nargout==0 exm070803_barzzy0(nn,xx,xmu,xstd) end % <7> 25 function exm070803_barzzy0(nn,xx,xmu,xstd) clf, bar(xx,nn);hold on Ylimit=get(gca,'YLim'); yy=0:Ylimit(2); xxmu=xmu*size(yy); xxL=xxmu/xmu*(xmu-xstd); xxR=xxmu/xmu*(xmu+xstd); plot(xxmu,yy,'r','Linewidth',3) plot(xxL,yy,'rx','MarkerSize',8) plot(xxR,yy,'rx','MarkerSize',8),hold off (2) rng(1,'v5normal') x=randn(1,100); exm070803(x); ??? Error using ==> plot Vectors must be the same lengths. Error in ==> exm070803_barzzy0 at 9 plot(xxmu,yy,'r','Linewidth',3) Error in ==> exm070803 at 6 exm070803_barzzy0(nn,xx,xmu,xstd) 25 % <11> % <11> % <7> 20 15 10 5 (3) (4) (5) rng(1,'v5normal') x=randn(1,100); exm070803(x); 0 -2.5 -2 -1.5 -1 -0.5 0 0.5 1 1.5 2 2.5 图 7.8-6 运行出错时所得的不完整图形 26 (6) (7) (8) (9) rng(1,'v5normal') x=randn(1,100); exm070803(x); 〖说明〗 图 7.8-7 进入调试状态的指令窗 图 7.8-8 变量值的鼠标观察法 27 第 8 章 Simulink 交互式仿真 Simulink 是一个进行动态系统建模、仿真和综合分析的集成软件包。它可以处理的系统 包括:线性、非线性系统;离散、连续及混合系统;单任务、多任务离散事件系统。 Simulink 有两大特征:一,建模借助鼠标交互实现;二,模型运作以时间流方式进行。 所以即使比较熟悉 MATLAB 工作环境和编程模式的读者,在初入 Simulink 领地时,也不免 感到生疏。为帮助读者亲身跨过 Simulink 门槛,本章第 2 节以算例形式对建模的数学基础、 基本器件、操作手法、工作平台进行了细节性的描述。就详细程度而言,尤以本章第一个 算例为最,初学者切莫跳过。 像 MATLAB 编程需要函数、子函数、条件分支、循环控制一样,Simulink 建模,尤其 是创建较复杂的模型,就必须有简装子系统、精装子系统、使能子系统、触发子系统、循 环子系统。本章的第 3、4、5 节就专门阐述这些子系统创建、工作机理、以及应用示例。 从时间角度分,Simulink 模型有连续和离散之分。本章除第 6 节用于专述纯离散系统和 采样离散系统建模外,其余章节所涉的内容对连续、离散两种系统都适用。 已建 Simulink 模型的运行、仿真分析,即可以通过鼠标手工操纵 ,也可以借助一组指 令自动操控。鼠标操纵法的特点是:该法只能在 Simulink 模型窗中实施,参数的设置必须 由“人”通过对话窗进行。而指令自动操控法可以摆脱 Simulink 模型窗,在执行过程中无 须人工参与。本章第 7 节的内容就是为 Simulink 模型的指令自动操控而设计的。 本章第 8 节是出于 Simulink 模型解算的数值问题而编写的。该节还给出了消减仿真模 型中“代数环困扰”的具体方法。 就像 MATLAB 编程中用户常常需要编写“供自己专用的模块化函数”那样,在 Simulink 建模中,用户也会需要创建一些“供自己专用的模块”,即 S 函数模块。有关 S 函数模块 的创建在本章的最后一节介绍。 在这引言结束之前,本书读者再次诚恳地建议读者:对待本章的算例,一定要“眼、 脑、手”并用,一定要在机器具体运作,切忌停留于“翻阅”。为读者参照需要,本章所 有算例中带 exm 前缀的 MDL 模型文件和相关的 M 文件都存放在随书光盘的 mfile 目录上。 8.1 引导 8.1.1 Simulink 模型本质和一般结构 (1)Simulink 块图模型的本质 (2) Simulink 模型的一般结构 8.1.2 (1) 创建块图模型的方法和基本环境 (2) (3) 1 图 8.1-2 Simulink 库浏览器的组成 (4) (5) 8.2 连续系统建模 8.2.1 微分方程建模和积分模块 1 微分方程块图模型的创建和操作细节 【例 8.2-1】在图 8.2-1 所示的系统中,已知质量 m  1 kg,阻尼 b  2 N.sec/m,弹簧系数 k  100 N/m,且质量块的初始位移 x(0)  0.05 m,其初始速度 x(0)  0 m/sec,要求创建 该系统的 Simulink 模型,并进行仿真运行。 2 (1) (2) (3) 图 8.2-1 弹簧—质量—阻尼系统 图 8.2-2 复制进建模所需的各种库模块后的模型编辑器 3 (4) (5) 图 8.2-3 常用模块子库的库藏 (6) (7) 图 8.2-4 经模型窗内模块再复制后的模型编辑器 4 (8) 图 8.2-5 经布局和增益模块方向反转的模型草图 图 8.2-6 完成前馈通路连接的模型草图 5 (9) 图 8.2-7 完成模块的输入输出口信号线的连接 图 8.2-8 改变模块的增益 图 8.2-9 完成连线和增益设置后的模型窗 6 (10) (11) (12) 图 8.2-10 实现初始位移 0.05 设置的设置窗 7 图 8.2-11 完全符合题给要求的系统仿真模型 (13) 图 8.2-12 默认设置下示波器显示的信号曲线 8 图 8.2-13 经纵轴范围自动调整后显示的信号曲线 2 创建微分方程的向量化块图模型 【例 8.2-2】利用模块的向量处理能力,建立例 8.2-1 系统的 Simulink 仿真模型。 (1) (2) 图 8.2-13 示波器参数设置对话框 (3) 图 8.2-14 上显示窗的纵坐标范围设置 9 (4) 图 8.2-15 利用库模块处理向量信号的能力构件的仿真模型 (5) (6) 图 8.2-16 exm080202.mdl 运行后显示的曲线 10 图 8.2-17 在仿真参数配置窗中把最大步长修改为 0.14 3 积分模块 (1) (2) (a) (b) 图 8.2-18 积分模块的默认外形和最多端口外形 8.2.2 状态空间建模 1 状态空间模块及其建模应用 图 8.2-19 状态空间库模块的图标 【 例 8.2-3 】 在 图 8.2-20 所 示 的 倒 立 摆 ( Inverted Pendulum) 系 统 中 , 定义状态变量 11 x1   , x2  , x3  x, x4  x ,输出量 y1   , y2  x 。输入量由 u  Kx 全状态反馈产 生,倒立摆系统的动态由式(8.2-9)的状态方程(State Equation)描述。试用 Simulnk 块图 模型研究该系统在 x(0)  0.1 0 0 0 T 初始条件下的动态响应。 图 8.2-20 倒立摆示意图 x  Ax  Bu y  Cx u  Kx (8.2-9) 0 1 0 0 其中,  A  20.601 0  0.4905 0 0 0 0 0 0 0 1 0 , 0 B     1 0 0.5 , C  1 0 0 0 0 1 0 0 , K   298.1504  60.6972 163.0989  73.3945。 (1) (2) 图 8.2-21 用状态空间模块构建的解题模型 12 (3) 图 8.2-22 状态空间模块参数设置对话窗 图 8.2-23 倒立摆的摆角和小车位移的动态曲线 2 模型内存和模型浏览器 (1) 13 (2) 图 8.2-24 模型浏览器和模型内存 【例 8.2-4】基于式(8.2-14),借助状态空间模块构建例 8.2-3 倒立摆系统的 解题模型(参见图 8.2-21)。 (1) (2) (3) 图 8.2-25 据式(8.2-14)构造的解题模型 14 图 8.2-26 选中“模型内存”节点形成的操控区 (4) 8.2.3 传递函数建模及模型内存的操控 1 单位脉冲信号的近似实现 (1)近似单位脉冲的设计准则 (2)借助阶跃函数合成近似单位脉冲 (3)借助脉冲发生器生成近似单位脉冲 2 传递函数模块和非零初始系统建模 图 8.2-27 传递函数库模块的图标 【例 8.2-5】已知图 8.2-1 所示弹簧—质量—阻尼系统中,质量 m  1 kg,阻尼 b  2 N.sec/m, 弹簧系数 k  100 N/m,质量块的初始位移 x(0)  0.05 m,初始速度 x(0)  0.5 m/sec,方 向与位移一致的外力 f (t)  fau(t)  10u(t) , u(t) 是单位阶跃函数。要求创建该系统的 Simulink 模型,并进行仿真运行。 15 图 8.2-28 借助传递函数模块构建的模型 (1)根据物理规律建立理论传递函数模型 (2)构建图 8.2-28 所示 Simulink 传递函数模型的关键步骤 (3)仿真运行 图 8.2-29 在外力作用下质量块的位移曲线 8.3 子系统和分层模型 8.3.1 创建简装子系统的套装法 【例 8.3-1】图 8.3-1 所示的硬盘(Hard Disks)是电脑中最重要的存储设备之一。工作时, 读写头(Read-Write Head)在(104 圈/分)高速旋转的磁盘(Disk)上飞行(Fly),读写 头与磁盘的距离在102 纳米数量级。读写头装在读写臂(Arm)上。读写臂由两部分组成: 根部由刚性材料制成,而顶部则由弹性簿片构造。读写臂由音圈电机(Voice Coil Motor) 驱动。音圈电机是永磁电机,其力矩采用电枢控制(Armature-Controlled)。读写头从磁道 a 运动到磁道 b 的时间在101 ~102 毫秒数量级,且定位精度要小于 1 微米。为使驱动装置 满足以上性能要求,采用如图 8.3-2 所示的闭环控制系统。 16 图 8.3-1 硬盘驱动结构示意 (1) (2) 图 8.3-2 硬盘驱动闭环控制系统示意 17 (3) (4) (5) 图 8.3-3 驱动闭环控制系统仿真模型 exm080301.mdl 图 8.3-4 读写头的响应曲线 【例 8.3-2】以 exm080301.mdl 为基础,为“硬盘驱动器闭环控制系统”构建一个如图 8.3-7 所示的分层仿真模型。 (1) (2) 18 (3) 图 8.3-5 第一个子系统生成后的中间模型 (4) 图 8.3-6 由三个子系统构成的驱动控制系统分层仿真模型 (5) 图 8.3-7 经重新布局和标识后的顶层模型 exm080302_1.mdl 19 (6) 图 8.3-8 经整理和重新标识后的子系统 图 8.3-9 模块名称重新标识后的子系统 图 8.3-10 模块名称重新标识后的子系统 (7)保存模型并运行仿真 8.3.2 创建简装子系统的容器法 【例 8.3-3】问题目标与例 8.3-2 相同,即为“硬盘驱动器闭环控制系统”建立一个与 exm080302_1.mdl 完全相同的 Simulink 分层模型(参见图 8.3-7)。 (1) 20 (2) 图 8.3-11 硬盘驱动系统不同功能块概念性框图 图 8.3-12 新建顶层模型中的库模块布置 (3)“装入”PID 控制器 (4)“装入”音圈电机模型 (5)装入读写臂转动模型 (6) (7) (8) 8.3.3 精装子系统和装帧编辑器 (1) (2) 【例 8.3-4】以例 8.3-3 的 exm080303.mdl 模型为基础,制作如图 8.3-13 所示的闭环控制模型。 在该块图模型有以下特点: 图 8.3-13 含精装硬盘驱动子系统的闭环控制模型 21 图 8.3-14 精装子系统的参数设置对话窗 (1) (2) 图 8.3-15 在 MATLAB 帮助浏览器中显示的模块信息 22 图 8.3-16 框选需要整合的组件 图 8.3-17 新整合成的简装子系统 图 8.3-18 模块名和输入输出口名修改后的简装子系统 (3)     tr=str2num(get_param(gcb,'Ra')); if or(tr<0.7, tr>15) error('The value of an armature resistance should be in [0.7, 15].') end ti=str2num(get_param(gcb,'La')); if or(ti<=0,ti>=0.05) error('The value of an armature inductance should be in (0,0.05).') end 23 图 8.3-19 新开启的装帧编辑器界面 24 图 8.3-20 装帧编辑器的参数页界面 (3) (4) 图 8.3-21 导致警告的初建参数对话窗 25 (5) 图 8.3-22 制作对话窗说明文档的装帧编辑器界面 26 (6) 图 8.3-23 用图像作为块标的绘制指令 表 8.3-1 模块对话窗中设置不同参数值时的闭环系统响应 参数值 (1)Ra=1,La=0.001 (2)Ra=10,La=0.001 响应 说明 参数值 模型取默认参数; 跟踪速度快;超调小 (3)Ra=1,La=0.01 电枢电阻增大; 跟踪速度变慢 (4)Ra=0.7,La=0.01 27 响应 说明 电机的电感增大; 超调大,振荡加剧 8.4 使能触发子系统 8.4.1 使能子系统 1 子系统结构和工作原理 电枢电阻减小,电感增大; 超调很大,振荡急剧 (a) (b) 图 8.4-1 库模块外形和内部结构 (1)使能子系统的来源: (2)使能子系统库模块结构 (3)使能子系统的工作原理 (4)使能子系统输出信号形态 2 子系统非状态输出的两种形态 【例 8.4-1】构造图 8.4-2 所示模型 exm080401.mdl:该模型包含四个使能子系统;每个子系 统都采用库模块结构,各子系统不包含状态量;每个子系统的使能模块和输出模块的设置 不同。 28 (1) (2) (3) 图 8.4-2 揭示使能子系统工作特性的模型 图 8.4-3 使能子系统输出模块设置对子系统非状态信号的影响 29 (4) clf plot(ScopeData.time,ScopeData.signals(1,1).values(:,1),'y--','LineWidth',5) hold on plot(ScopeData.time,ScopeData.signals(1,1).values(:,2),'r') hold off, grid on axis([0,10,-2.5,2.5]) legend('hh_y 或 rh_y','hr_r 或 rr_r') xlabel('t'),ylabel('Output of Subsystems') title('No.1 and No.2 Styles of Enabled Subsystems') 图 8.4-4 子系统非状态信号的两种形态 30 图 8.4-5 本例中模块的对话窗 图 8.4-6 输入自制波形数据的对话窗 3 子系统状态输出的四种形态 【例 8.4-2】本例模型 exm080402.mdl 构造与图 8.4-2 相似,但子系统结构不同。本例模型 exm080402.mdl 的所有子系统的结构如图 8.4-7 所示;子系统中都包含一个积分模块,用以 产生状态信号。 (1) 图 8.4-7 exm080402 的使能子系统结构 图 8.4-8 由使能三要素不同取值所生成的子系统状态信号的四种形态 (2) clf plot(ScopeData.time,ScopeData.signals(1,1).values(:,1),'y-','LineWidth',8), hold on 31 plot(ScopeData.time,ScopeData.signals(1,1).values(:,2),'c--','LineWidth',6) plot(ScopeData.time,ScopeData.signals(1,3).values(:,1),'m','LineWidth',4) plot(ScopeData.time,ScopeData.signals(1,3).values(:,2),'k:') hold off axis([0,10,-2.5,2.5]) legend('No.3(hh_y)','No.4(hr_r)','No.5(rh_y)','No.6(rr_r)','Location','SouthWest') xlabel('t'),ylabel('Output of Subsystems') title('Styles of State-Outputs of Enabled Subsystems') 图 8.4-9 子系统状态信号的四种形态 8.4.2 触发子系统 1 子系统的结构和工作原理 (1) (a) (b) 图 8.4-10 库模块外形和内部结构 (2) (3) 2 子系统的三种触发方式 【例 8.4-3】借助 exm080403.mdl 模型演示:触发子系统的工作原理。 32 (1) (2) (3) (4) 图 8.4-11 用于演示三种触发方式的 exm080403.mdl 33 图 8.4-12 三种触发类型及相应子系统的输出波形 8.5 Simulink 的控制流 8.5.1 For 环 【例 8.5-1】采用 For 环模块构造求 C=pascal(5)矩阵各列向量 2-范数的 Simulink 块图模型。 (1) 图 8.5-1 利用 For 环模块求矩阵各列范数的 exm080501 模型 34 C=pascal(5) n_col=size(C,2); %<2> for idx = 1:n_col %<3> w=C(:,idx)'*C(:,idx);%<4> y(idx)=sqrt(w); %<5> end %<6> y C= 1 1 1 1 1 1 2 3 4 5 1 3 6 10 15 1 4 10 20 35 1 5 15 35 70 y= 2.2361 7.4162 19.2614 (2) 41.7373 79.8499 图 8.5-2 For 环子系统库模块的默认结构 图 8.5-3 经修改后的子系统模块结构 图 8.5-4 完成参数设置和信号线连接的 For 环子系统 (3)图 8.5-4 所示子系统的构建 (4)顶层模型的内存设置和仿真参数配置 (5)保存和运行模型 35 图 8.5-5 运行后的解题模型 〖说明〗 8.5.2 While 环 【例 8.5-2】构造如图 8.5-6 所示的块图模型 exm080502.mdl,用以确定“使从 1 开始的正整 数之和大于 1000 的第一个正整数”,并显示相应的“和值”。 (1)解题分析 (2) n=0; Sn=0; n_max=1000; while 1000>Sn n=n+1; Sn=Sn+n; if n>n_max break; end end Nx=n Sx=Sn Nx = 45 Sx = 1035 (3) 图 8.5-6 包含 While 环的解题模型 exm080502.mdl 36 % <4> % <7> % <9> %<10> 图 8.5-7 While Iterator Subsystem 子系统的默认结构 (3) 图 8.5-8 经修改后的 While Iterator Subsystem 子系统结构 图 8.5-9 完成参数设置和连接的 While 环子系统 (4) 〖说明〗 8.5.3 If-else 条件转向和信号合成 【例 8.5-3】采用“条件转向子系统”模块构造满足(8.5-3)式的 Simulink 模型。 t y    t3 e t 1 t  1 1 t 1 1 t 3t 3 (8.5-3) 37 y 1 0.5 0 -0.5 -1 -1.5 -2 -2.5 -3 -3 -2 -1 0 1 2 3 t 图 8.5-10 运行 M 码所绘出的函数曲线 (1) (2) 图 8.5-11 经拖入库模块及复制操作后的模型初样 38 图 8.5-12 完成连接的顶层模型 exm080503.mdl (2) (a) (b) (c) 图 8.5-13 构建完成的三个条件执行子系统 (3) (4)保存和运行模型 39 图 8.5-14 Simulink 模型给出的函数曲线 8.6 离散时间系统和混合系统 8.6.1 单位延迟模块和差分方程建模 1 单位延迟模块 图 8.6-1 单位延迟模块 2 差分方程的标量法建模 【例 8.6-1】设购房时贷款 45 万,年利率为 6% ,每月(即每期)等额本息还贷 2500 元, 问:还贷后第 60 期的欠款是多少?还款总期数是多少?最后一期该还多少? 40 图 8.6-2 以单位延迟模块为核心构成的块图解题模型 (1) (2) (3) (4)保存模型和仿真运行 〖说明〗 图 8.6-3 欠贷曲线 3 差分方程组的向量建模法 【例 8.6-2】采用图 8.6-4 所示的块图模型 exm080602.mdl 求如下差分方程的输出 y(k)  x1 (k   x2 (k  1)   1)    1 0.05 0.1  0.094    x1 x2 (k) (k )  10u (k ) (8.6-5) y(k)  1 0    x1 x2 (k) (k ) (8.6-6) 41 u(k)  3 0.75  1 0  x1(k)   x2 (k )   30.75  y(k) 方程的初始条件是: x1(0)  0, x2 (0)  0 。 (8.6-7) 图 8.6-4 由向量法建立的求解差分方程组的块图模型 (1)模型 exm080602 所用模块和仿真参数配置 (2)保存和运行模型 〖说明〗 图 8.6-5 exm080602 块图模型的输出 8.6.2 离散积分模块和混合系统 1 离散时间积分模块 图 8.6-6 离散时间积分模块的默认图标 2 混合系统的 s 变量替换法 【例 8.6-3】在图 8.6-7 中,有两个闭环系统:下方的系统采用“连续超前-滞后校正器 Gcc ”; 上方的则采用通过“Tustin 近似”的“离散校正器”。在此 Gcc (s)  190s2  969s  95 s2  6.51s  0.065 。 42 图 8.6-7 超前滞后校正器及其等价离散近似校正期间的比较模型 (1)本例的解题步骤 (2)关于图 8.6-7 块图模型的说明 (3) Gcc=tf([190,969,95],[1,6.51,0.065]); Ts=0.08; Gdc=c2d(Gcc,Ts,'Tustin') [num,den]=tfdata(Gdc); GdcNum=num{1}; GdcDen=den{1}; (3)仿真比较 图 8.6-8 模型内存操控区 图 8.6-9 采用不同校正器的系统阶跃响应比较 43 8.6.3 多速率系统的色彩标识 【例 8.6-4】利用图 8.6-10 所示 exm080604.mdl 模型演示:不同速率的着色;零阶保持模块 的使用。 (1) (2) (3) 图 8.6-10 用色彩和文字标识不同速率 (4)保存和运行模型 图 8.6-11 被着色模型的色标图例 图 8.6-12 经零阶保持后两系统响应的比较 44 8.7 Simulink 的分析工具 8.7.1 模型和模块信息的获取 1 模型状态及输入输出特征的获取 【例 8.7-1】观察图 8.7-1 所示 exm080701.mdl 模型的特征参数。 (1) 图 8.7-1 具有三种采样速率的混合系统 图 8.7-2 (2) [SZ,X0,StateCell]=exm080701 SZ = 2 1 0 0 0 0 3 X0 = 0 0 -0.5000 StateCell = 'exm080701/Transfer Fcn' 'exm080701/Transfer Fcn' [1x34 char] %获得模型信息 StateCell{3} ans = exm080701/Discrete-Time Integrator 45 (3) 图 8.7-3 2 模型/模块参数的指令获知和设置 【例 8.7-2】以 exm080701.mdl 为例,演示:如何得知模型中各模块和可设置参数的具体准 确名称;如何通过指令获取和设置模型中指定模块对话窗中的参数;如何得知“仿真参数 配置框”中的可设置参数准确名称;又如何通过指令获取和设置这些模型仿真参数。 (1) BN=find_system('exm080701') BN = 'exm080701' 'exm080701/Add' 'exm080701/Add1' [1x34 char] 'exm080701/Gain' 'exm080701/Mux' 'exm080701/Scope' 'exm080701/Step' 'exm080701/Transfer Fcn' (2) 46 图 8.7-4 运用关键词搜索到的模块分类参数节点 Gv0=get_param(BN{5},'Gain') set_param(BN{5},'Gain', '1.11') Gv=get_param(BN{5},'Gain') set_param(BN{5},'Gain', '1.4') Gv0 = 1.4 Gv = 1.11 (3) Ci0=get_param('exm080701','InitialState') set_param('exm080701','InitialState','[0;0;-0.5]') Ci=get_param('exm080701','InitialState') set_param('exm080701','InitialState',Ci0) Ci0 = '[0; 0; 0.5]' Ci = [0;0;-0.5] 8.7.2 用 Sim 指令运行 Simulink 模型 1 运行块图模型的 sim 指令 (1) [t, x, y]=sim('model', timespan, opts, ut) 利用输入参数进行仿真,返回逐个输出(最早格式,沿用至今) (2) simOut=sim('model', 'PName1',Value1,'PName2', Value2...) 采用“参数名/值设置法”运行 model 指定的块图模型 simOut=sim('model', PStruct) 47 采用“构架设置法”运行 model 指定的块图模型 2 sim 指令的参数名/值设置法 【例 8.7-3】采用 sim 指令的“参数名/值设置法”运行如图 8.7-5 所示的 exm080703.mdl 块 图模型(文件在随书光盘上)。 图 8.7-5 sim 指令操作的块图模型 exm080703 (1)关于图 8.7-5 所示 exm080703.mdl 的说明 (2) %exm080703m.m YSIM=sim('exm080703','SaveOutput','on','OutputSaveName','y0','SaveFormat','Array'); %<2> yy0=YSIM.get('y0'); %<3> tt0=YSIM.get('tout'); %<4> simplot(tt0,yy0) xlabel('tt0'),ylabel('yy0') 图 8.7-6 simplot 绘制出示波窗模式的响应曲线 〖说明〗 3 sim 指令的参数构架设置法 【例 8.7-4】利用 sim 指令的构架设置法对 exm080703.mdl 进行操作,以产生 模块取不同初始值时的系统响应曲线(参见图 8.7-7)。 (1) [SZ,X0,SC]=exm080703; disp([num2cell(X0),SC]) [0] 'exm080703/Transfer Fcn' [0] 'exm080703/Transfer Fcn' [0] 'exm080703/Integrator' 48 (2) % exm080704m.m clear x0=[0, 1, 0; 0, 0, 0.05; 0, 0, 0]; P.LoadInitialState='on'; P.SolverType='Fixed-step'; P.FixedStep='0.04'; P.SaveOutput='on'; P.OutputSaveName='y0'; P.SaveFormat='Array'; for ii=1:3 xm0=x0(:,ii); P.InitialState='xm0'; YSIM=sim('exm080803',P); y(:,ii)=YSIM.get('y0'); end t=YSIM.get('tout'); simplot(t,y), legend('x0(:,1)','x0(:,2)','x0(:,3)') hh=get(gca,'Children'); set(hh(1),'Marker','o') set(hh(2),'Marker','+') title('不同初值的系统响应') xlabel('t'),ylabel('y') shg %<7> %<8> 图 8.7-7 sim 指令构架设置法展现不同初值响应 8.7.3 模型的线性化问题 1 线性化的数学描述 49 2 模型线性化 【例 8.7-5】求图 8.7-8 所示 exm080705.mdl 的传递函数 G(s)  Y (s) 。 U (s) 图 8.7-8 多环控制系统 (1) (2) [A,B,C,D]=linmod2('exm080705'); STF=tf(minreal(ss(A,B,C,D))) 2 states removed. Transfer function: 100 s^2 + 300 s + 200 ----------------------------------------------s^5 + 21 s^4 + 157 s^3 + 663 s^2 + 1301 s + 910 【例 8.7-6】求图 8.7-9 所示的块图模型 exm080706_1.mdl 在状态空间原点的线性化模型。 (1) 图 8.7-9 待线性化的块图模型 50 图 8.7-10 含饱和限制积分模块系统的输出波形 (2) Ts=0.03; [A,B,C,D]=dlinmod('exm080706_1',Ts) A= 0.6204 -2.7398 0.0241 0.0241 0.9557 0.0004 0 -11.3400 1.0000 B= 0.0368 0.0006 0.2520 C= 0 45.0000 0 0 -5.6700 1.0000 D= 0 0.1260 (3) 图 8.7-11 等价近似的线性化块图模型 (4) clear Ts=0.03; [A,B,C,D]=dlinmod('exm080706_1',Ts); sim('exm080706_1') sim('exm080706_2') tn10=tn;yn10=yn(:,1); %<6> tl10=tl;yl10=yl(:,1); %<7> uf1=get_param('exm080706_1/Step','After'); %<8> uf2=get_param('exm080706_2/Step','After'); 51 %<9> set_param('exm080706_1/Step','After','0.5') set_param('exm080706_2/Step','After','0.5') sim('exm080706_1') sim('exm080706_2') tn05=tn;yn05=yn(:,1); %<14> tl05=tl;yl05=yl(:,1); %<15> set_param('exm080706_1/Step','After',uf1) %<16> set_param('exm080706_2/Step','After',uf2) %<17> subplot(1,2,1),plot(tn10,yn10,'r.',tl10,yl10,'b-') legend('Original','Linearization','Location','Best') title('单位阶跃输入下的响应比较') subplot(1,2,2),plot(tn05,yn05,'r.',tl05,yl05,'b-') legend('Original','Linearization','Location','Best') title('0.5 阶跃输入下的响应比较') 单位阶跃输入下的响应比较 0.5阶 跃 输 入 下 的 响 应 比 较 1.4 0.7 1.2 0.6 1 0.5 0.8 0.4 0.6 0.3 0.4 0.2 0.2 0 0 Original Linearization 0.5 1 1.5 2 0.1 0 0 Original Linearization 0.5 1 1.5 2 图 8.7-12 不同输入下两模型的输出响应比较 8.7.4 系统平衡点和普通状态轨线图 【例 8.7-7】求图 8.7-13 所示两个模型的平衡点。模型(b)输入端比模型(a)多一个输入口。    x 1 x2   x12  x22 2x1  x2  4    x 1 x2   x12  x2 2 2x1  x2  (u  4) exm080707_1.mdl exm080707_2.mdl (a) (b) 图 8.7-13 待求平衡点的非线性系统块图模型 52 (1) (2) xa=trim('exm080707_1',[-0.1;-0.3]) xb=trim('exm080707_1',[0;1]) xa = -0.8944 -1.7889 xb = 0.8944 1.7889 %<1> %<2> (4) Axa=linmod2('exm080707_1',xa); eig_Axa=(eig(Axa))' Axb=linmod2('exm080707_1',xb); eig_Axb=(eig(Axb))' eig_Axa = -1.3944 - 2.6457i -1.3944 + 2.6457i eig_Axb = 3.4110 -2.6222 (6) [xa2,ua]=trim('exm080707_2',[-0.1;-0.3],0)%<3> [xb2,ub]=trim('exm080707_2',[0;1],1) %<4> xa2 = -0.7487 -1.4974 ua = 1.1974 xb2 = 0.6810 1.3620 ub = 1.6810 (2) % exm080707_1m.m clf; xx=[-2,-1, 0, 1, 1, 1, 1 1, 1, 1, 1, 0,-1,-2]; set_param('exm080707_1','InitInArrayFormatMsg', 'None') nxx=size(xx,2); for k=1:nxx opts=simset('initialstate',xx(:,k)); %<5> [t,x]=sim('exm080707_1',10,opts); %<6> plot(x(:,1),x(:,2)); hold on end grid on,hold off xlabel('x1');ylabel('x2') title('普通状态轨线') 53 图 8.7-14 多初始点出发的状态轨线和平衡点 8.7.5 M 码和 Simulink 模型的综合运用 1 单步仿真和精良状态轨线图 【例 8.7-8】绘制非线性系统 xx12   x12  x2 2 2x1  x2  4 块图模型的精良状态变化轨线。 (1) function [DX1,DX2,DP]=exm080708_zzy(x1,x2,h) opts=simset('solver','ode5','fixedstep',h); %<2> n=length(x1); DX1=zeros(n,n);DX2=DX1;DP=DX1; disp('正在逐点计算,请稍等!') for ii=1:n; for jj=1:n; opts=simset(opts,'initialstate',[x1(ii); x2(jj)]); %<8> [~,x]=sim('exm080707_1',h,opts); %<9> dx1=x(2,1)-x1(ii); dx2=x(2,2)-x2(jj); L=sqrt(dx1^2+dx2^2); DP(jj,ii)=L/h; if L>1.e-10 DX1(jj,ii)=dx1;DX2(jj,ii)=dx2; %<15> end end end disp('计算结束') 54 (2) %exm080708m.m h=0.01; x1=(-2.5:0.25:2.5)';x2=x1; k=3.5; set_param('exm080707_1','InitInArrayFormatMsg', 'None') xs=trim('exm080707_1',[-0.1;-0.3]); xus=trim('exm080707_1',[0;1]); [DX1,DX2,DL]=exm080708_zzy(x1,x2,h); pcolor(x1,x2,DL) shading interp alpha(0.5) colorbar hold on quiver(x1,x2,k*DX1,k*DX2,0) plot(xs(1),xs(2),'bo',xs(1),xs(2),'+','MarkerSize',10) plot(xus(1),xus(2),'bo',xus(1),xus(2),'.','MarkerSize',10) grid off hold off xlabel('x1'),ylabel('x2') title('精良状态轨线斜率图') shg 图 8.7-15 精良状态轨线迹斜率图 2 仿真模型和优化指令的协调 【例 8.7-9】题目背景:在迄今的自动控制教材中,凡讨论积分性能指标时,几乎总会提到 所谓的 ITAE 传递函数标准型,并列出相应的分母多项式系数表。但值得指出的是:这些数 55 据是 20 世纪 50 年代初期,用模拟计算机仿真得到的。因此,这些数据的准确性带有明显   的时代缺陷。与 J (ISE)   e2 (t)dt 不同,ITAE 性能函数 J (ITAE)   t e(t)dt 无 0 0 法解析计算,而只能通过数值计算进行。 图 8.7-16 计算 J (ITAE) 的块图模型 (1)问题的形成 (2) (3) %exm080709m.m global a Jc amin=min(a0); na=length(a0); nd=na+2; opts=optimset('MaxFunEvals',300*na); CF=zeros(Kr,nd);Jk=zeros(1,Kr); for kk=1:Kr ar=a0+2*amin*(rand(1,na)-0.5); %<8> a=fminsearch(@exm080709_itae,ar, opts); cf=[1,a,1]; CF(kk,:)=cf; Jk(kk)=Jc; end [Jmin,kmin]=min(Jk); cfmin=CF(kmin,:); % exm080709_itae.m function Jc=exm080709_itae(aa) global a Jc a=aa; Tspan=[0,0.1,20]; %<4> opts=simset('RelTol',0.0001); [~,~,Jt]=sim('exm080709',Tspan,opts); %<6> Jc=Jt(end); (4) clear Kr=5; a0=[3.25,6.60,8.60,7.45,3.95]; exm080709m Jmin,cfmin Jmin = 8.3338 cfmin = Columns 1 through 6 1.0000 2.1519 5.6290 Column 7 1.0000 6.9338 6.7925 3.7398 56 (5) old=tf(1,[1,a0,1]); new=tf(1,cfmin); [yold,told]=step(old,50); [ynew,tnew]=step(new,50); plot(told,yold,'b','LineWidth',1) axis([0,18,0,1.1]) hold on,plot(tnew,ynew,'r','LineWidth',3),hold off xlabel('t') title('ITAE 6 阶新老标准型的阶跃响应比较') legend('Old','New',4),grid on ITAE 6阶 新 老 标 准 型 的 阶 跃 响 应 比 较 1 0.8 0.6 0.4 0.2 Old New 0 0 2 4 6 8 10 12 14 16 18 t 图 8.7-17 新老标准型的阶跃响应局部放大比较图 表 8.7-2 ITAE 标准型新系数(黑体)和老“经典”系数(细体)对照 阶次 ITAE 值 传递函数分母多项式系数 2 1.99 1 1.4 1 1.9519 1 1.5049 1 3 3.144 3.1383 4 4.626 4.5913 1 1.75 2.15 1 1 1.7828 2.1715 1 1 2.10 3.40 2.75 1 1 1.9521 3.3458 2.6473 1 5 7.155 1 2.80 5.00 5.50 3.40 1 6.3215 1 2.0667 4.4976 4.6730 3.2568 1 6 9.656 1 3.25 6.60 8.60 7.45 3.95 1 8.3338 1 2.1519 5.6290 6.9338 6.7925 3.7398 1 7 15.003 1 4.48 10.42 15.05 15.54 10.64 4.580 1 10.6290 1 2.2169 6.7433 9.3469 11.577 8.6778 4.3226 1 8 18.680 1 5.20 12.80 21.60 25.75 22.20 13.30 5.15 1 13.2051 1 2.2681 7.8313 11.8472 17.5325 16.0645 11.3094 4.8069 1  研究表明:ITAE 函数搜索空间的形状非常复杂,凹凸不平,小谷很多,许多地方 深谷高峰相邻。要找到真正最小值点决非易事。虽可以肯定:单点标准型的新系 数比老系数具有更小的 ITAE 值;但不能断言这新系数一定指示着最小值点。 8.8 数值计算方面的考虑 57 8.8.1 微分方程解算器 Solver 1 ode45 和 ode23 运作机理简要 2 ode113 运作机理简要 3 ode15s 和 ode23s 运作机理简要 4 不同解算器解 Stiff 方程的表现 【例 8.8-1】求微分方程 x 100x  0.9999x  0 在 x(0)  1, x(0)  0 时的解。 图 8.8-1 微分方程的块图模型 exm080801 (1)关于 exm080901.mdl 的说明 (2) syms t x xd xs=dsolve('D2x+100*Dx+0.9999*x=0','x(0)=1,Dx(0)=0','t') xsd=diff(xs,'t') HL2=ezplot(xd-xsd,[0,10,-0.012,0]); set(HL2,'LineWidth',3) title(['x''=',char(xsd)]) xs = 9999/(9998*exp(t/100)) - 1/(9998*exp((9999*t)/100)) xsd = 9999/(999800*exp((9999*t)/100)) - 9999/(999800*exp(t/100)) x'=9999/(999800*exp((9999*t)/100)) - 9999/(999800*exp(t/100)) 0 -0.002 -0.004 xd -0.006 -0.008 -0.01 -0.012 0 1 2 3 4 5 6 7 8 9 10 t 图 8.8-2 微分方程的解 x 和它的导数 dx/dt 58 (3) tt=(0:4000)/10; xx0=subs(xsd,t,tt); Tspan=600; opts=simset('Solver','ode45'); [tt1,xx1,s]=sim('exm080801',Tspan,opts); opts=simset('Solver','ode15s'); [tt2,xx2,s]=sim('exm080801',Tspan,opts); plot(tt,xx0,'k',tt1,xx1(:,2),'b:',tt2,xx2(:,2),'r-.') axis([246 247 -8.55e-4 -8.35e-4]) legend('Symbolic','ode45','ode15s',0) xlabel('t'),ylabel('dx/dt') title(' Stiff 方程的三种算法结果比较局部放大') ns1=length(xx1) ns2=length(xx2) ns1 = 18085 ns2 = 101 x 10-4 -8.35 Stiff 方 程 的 三 种 算 法 结 果 比 较 局 部 放 大 Symbolic ode45 -8.4 ode15s dx/dt -8.45 -8.5 -8.55 246 246.1 246.2 246.3 246.4 246.5 246.6 246.7 246.8 246.9 247 t 图 8.8-3 不同方法的解算结果比较 8.8.2 积分步长和容差 1 积分步长的选择 2 计算容差的选择 8.8.3 代数环问题 1 无惯性模块和代数环 2 消减代数环影响 【例 8.8-2】构建由方程(8.8-2)和(8.8-3)表述系统的 Simulink 块图模型,讨论代数环。 x  u  sin y (8.8-2) 59 y  3.5x  2.5x (8.8-3) 图 8.8-4 带隐式代数方程的块图模型 exm080802_1 (1)关于图 8.8-4 所示 exm080802_1.mdl 的说明 (2) (3) (4) 图 8.8-5 采用代数约束模块消减代数环影响的 exm080802_2 图 8.8-6 采用单位延迟模块消减代数环影响的 exm080802_3 (5) %exm080802m.m clear all bdclose('all') load_system('simulink') tic;sim('exm080802_1');T1=toc; tic;sim('exm080802_2');T2=toc; t2='0.2'; open_system('exm080802_3') %<2> %<3> 60 set_param('exm080802_3','MaxStep',t2) tic;sim('exm080802_3');T3=toc; t002='0.002'; set_param('exm080802_3','MaxStep',t002) tic;sim('exm080802_3');T4=toc; disp(' ') disp([blanks(31),'仿真绝对耗时',blanks(5),'仿真相对耗时']) disp(['带代数环原模型',blanks(20),num2str(T1),blanks(12),num2str(1)]) disp(['代数约束模块',blanks(22),num2str(T2),blanks(9),num2str(T2/T1)]) disp(['单位延迟阻断 ','MaxStep= ',t2,blanks(9),num2str(T3),blanks(8),num2str(T3/T1)]) disp(['单位延迟阻断 ','MaxStep= ',t002,blanks(7),num2str(T4),blanks(9),num2str(T4/T1)]) (a) 含代数环的原模型 相对耗时 1 (b) 采用代数约束模块的修改模型 相对耗时 0.25 (c) 采用单位延迟模块的修改模型 (d) 采用单位延迟模块的修改模型 最大步长取 0.2 最大步长取 0.002 相对耗时 0.18 相对耗时 0.34 图 8.8-7 采用代数约束模块的块图模型的输出曲线 8.9 S 函数模块的创建和应用 8.9.1 S 函数概述 8.9.2 S 函数模块及其运作机理 (1) (2) 61 图 8.9-2 1 开发 S 函数模块的一般步骤 8.9.3 M 码 S 函数 1 两个级别的 M 码 S 函数 2 对二级 M 码 S 函数模版的注释 function msfuntmpl_basic(block) %% msfuntempl_basic 是二级M码S函数模版的基本型。在大多数场合,该模版已够用。 %% 用户使用该模版编写自己S函数时,绝不要沿用msfuntempl_basic名称,而应另起函数名。 %% 更全面深入的模版是msfuntempl.m ,它也驻留在{toolbox/simulink/blocks}文件夹上。 %% 该主函数只包含如下一条指令,不得更改,不得添加。 setup(block); %endfunction %% ====设置Input ports、Output ports、Dialog parameters、Options等特性;必须有。 function setup(block) %%(1)设置输入输出口数目 block.NumInputPorts = 1; block.NumOutputPorts = 1; %%(2)调用“运行对象”的SetPreCompInpPortToDynamic和SetPreCompOutPortInfoToDynamic %%方法使模块的输入输出口继承信号的数据类型、维数、是否复数、采样模式 block.SetPreCompInpPortInfoToDynamic; block.SetPreCompOutPortInfoToDynamic; %%(3)若模块对输入口某些属性有特别要求,则进行必要的重定义;否则,以下省略。 %% 以下指令及其赋值仅是示例,用户应据需要改写。 block.InputPort(1).Dimensions = 1; block.InputPort(1).DatatypeID = 0; % double 62 block.InputPort(1).Complexity = 'Real'; block.InputPort(1).DirectFeedthrough = true; %% true有直通通路;false则无。 %%(4)若模块对输出口某些属性有特别要求,则进行必要的重定义;否则,以下省略。 %% 以下指令及其赋值仅是示例,用户应据需要改写。 block.OutputPort(1).Dimensions = 1; block.OutputPort(1).DatatypeID = 0; % double block.OutputPort(1).Complexity = 'Real'; %%(5)指定S函数模块的对话窗参数数目 %% 以下赋值仅是示例,用户应据需要改写。 block.NumDialogPrms = 0; %%(6)指定采样时间,可取格式: %% [0 offset],连续采样时间;[positive_num offset] ,离散采样时间; %% [-1, 0] ,继承采样时间;[-2, 0],可变采样时间 %% 以下赋值仅是示例,用户应据需要改写。 block.SampleTimes = [0 0]; %%表示无偏移的连续采样 %%(7)指定仿真状态的保存和创建方法,可取选项: %% 'UnknownSimState',先给出警告,然后采用默认设置; %% 'DefaultSimState',采用内建模块的方法保存和重建连续状态、工作向量等 %% 'HasNoSimState', 没有仿真状态要处理(如中模块不带输出口) %% 'CustomSimState',通告Simulink有 GetSimState 和 SetSimState 方法实施 %% 'DisallowSimState' ,不允许保存和重建,若保存和重建则报错 block.SimStateCompliance = 'DefaultSimState'; %%通常使用该指令及赋值。 %%(8)下面列出了块方法的最常用回调名(即单引号内的字符),它们是不可更改的。 %% 函数句柄(即@及其后的字符)可以由用户自己命名 ,但必须与子函数名一致。 %% 对于那些不需要的回调方法,用户应整行加以删除。 block.RegBlockMethod('PostPropagationSetup', @DoPostPropSetup); %% 设置Dwork向量的数目及其属性;仅含连续状态的S函数,不需要此回调。 block.RegBlockMethod('InitializeConditions', @InitializeConditions); %% 若仿真开始前及仿真过程中需要多次初始化,则使用该回调. %% 该回调对连续状态ContStates和/或Dwork向量赋初始值、配置内存等。 block.RegBlockMethod('Start', @Start); %% 若仅在仿真开始前需要初始化,则使用该回调。 block.RegBlockMethod('Outputs', @Outputs); % Required %% 任何S函数都必需该回调。该回调计算S函数的输出,并存放于输出信号数组。 block.RegBlockMethod('Update', @Update); %% 若S函数有离散状态,或无直通通路,则需要该回调。 block.RegBlockMethod('Derivatives', @Derivatives); %% 若有连续状态,则需要该回调。 block.RegBlockMethod('Terminate', @Terminate); %% 二级M码S函数不必使用此回调。 %end setup %%==== 后向传递设置:S函数含离散状态,或无直通通路时写该子函数。 function DoPostPropSetup(block) %% 以下指令及其赋值仅是示例,用户应据需要改写。 block.NumDworks = 1; block.Dwork(1).Name = 'x1'; block.Dwork(1).Dimensions = 1; block.Dwork(1).DatatypeID = 0; % double block.Dwork(1).Complexity = 'Real'; % real block.Dwork(1).UsedAsDiscState = true; %end DoPostPropSetup %%==== 初始化条件:当S函数需多次初始化时,才写该子函数 63 function InitializeConditions(block) %%(以下填写适当指令) %end InitializeConditions %%==== 启动:当S函数仅需初始化一次,则应编写该子函数 function Start(block) %% 以下指令行,仅是示例,用户应据需要编写。 block.Dwork(1).Data = 0; %endfunction %%==== 输出:任何S函数都必有该子函数 function Outputs(block) %% 以下指令行,仅是示例,用户应据需要编写。 block.OutputPort(1).Data = block.Dwork(1).Data + block.InputPort(1).Data; %end Outputs %%==== 更新:若S函数有离散状态,或无直通通路,则需要编写此子函数。 function Update(block) %% 以下指令行,仅是示例,用户应据需要编写。 block.Dwork(1).Data = block.InputPort(1).Data; %end Update %%==== 导数计算:连续时间状态更新 function Derivatives(block) %% 以下填写适当指令 %end Derivatives %%==== 终止:对C MEX S函数必需,但对二级M码S函数则不必。 function Terminate(block) %end Terminate 3 二级 M 码 S 函数模块设计示例 【例 8.9-1】为图 8.9-3 所示单摆设计一个 M 码 S 函数模块,并进而利用该模块构建一个在 “周期方波力”作用下,单摆的摆动块图模型。该模块以外力 Fm 为输入,摆角 为输出, 等效摩擦系数、等效重力系数以及摆的初始条件都以 S 函数模块的对话窗参数出现。 (1) (3) 图 8.9-3 单摆示意图 64 function exm080901_simpend(block) % exm080901_simpend is a M-file S-function rewritten from template msfuntmpl_basic.m. % % Produced by zzy. % The setup method is used to set up the basic attributes. setup(block); % end simpendzzy2 function setup(block) % (1)Register number of input and output ports block.NumInputPorts = 1; block.NumOutputPorts = 1; % (2)Setup port properties to dynamically inherited block.SetPreCompInpPortInfoToDynamic; block.SetPreCompOutPortInfoToDynamic; % (5)Register parameters block.NumDialogPrms = 3; % Set up the continuous states block.NumContStates = 2; % (6)Set block to Continuous sample time block.SampleTimes = [0 0]; % (7)Set the block simStateCompliance to default block.SimStateCompliance = 'DefaultSimState'; % (8)Use an internal registry for block methods. block.RegBlockMethod('Start', @Start); block.RegBlockMethod('Outputs', @Outputs); block.RegBlockMethod('Derivatives', @Derivatives); % end setup function Start(block) block.ContStates.Data = block.DialogPrm(3).data; % end Start function Outputs(block) block.OutputPort(1).Data =block.ContStates.Data(2); % end Outputs function Derivatives(block) dampzzy=block.DialogPrm(1).Data; gravzzy=block.DialogPrm(2).Data; x=block.ContStates.Data; u=block.InputPort(1).Data; block.Derivatives.Data(1)=-dampzzy*x(1)-gravzzy*sin(x(2))+u; block.Derivatives.Data(2)=x(1); % end Derivatives (3) 65 (4) 图 8.9-4 M 码 S 函数模块的对话窗 (5) 图 8.9-5 利用 S 函数模块构造的块图模型 (6) 图 8.9-6 在外力 fm 作用下的摆角变化曲线 66 (7) 图 8.9-7 设计数学块标的装帧编辑器 图 8.9-8 采用动画模块的块图模型 exm080901_2 图 8.9-9 块图模型 exm080901_2.mdl 的单摆动画画面 67 第 9 章 图形用户界面 GUI 图形用户界面(Graphical User Interfaces ,GUI)是由窗、轴、按键、菜单、工具图标、 文字说明等对象(Objects)构成的一个用户界面。用户通过鼠标或键盘选择、激活这些图 形对象,实现计算、绘制图表和产生动画等。 图形用户界面不仅形象生动、界面友善、操控灵活,而且为人们提供了定性定量结合、 局域全域结合、时域频域结合、模拟数字结合的数据探索、科学分析的仿真平台。图形用 户界面的出现,使过往视为经典的一些方法和技巧逐趋暗淡失色,而新的方法和技巧则日 渐彩华升腾,人们的研发理念和思维方式已经和正在发生深刻的变化。 本书作者正是出于这种认识组织本章内容的。图形用户界面开发工具(Graphical User Interface Development Environment,GUIDE),简称界面开发工具,是一种程式性的设计工 具。使用 GUIDE 设计界面遵循一定的设计步骤,而较少依赖技巧。MATLAB 新版本倡导 使用 GUIDE 开发图形用户界面。为此,本章以四个节次五个算例介绍了 GUIDE 的功能和 用法、界面控件的机理和属性、各种控件、菜单、图标的详细制作步骤。与此同时,本章 还有少量篇幅用以介绍“图形用户界面的手工设计法”。编写这部分内容的目的在于:一, 其本身简明;二,它能帮助读者更好地理解用户界面的工作机理。 本章所有算例界面都是彩色的,请读者从随书光盘 mbook 目录上的“ch09_图形用户界 面.doc”文件中查看;而实现界面所需的带 exm 前缀文件名的 M 文件和 FIG 文件则都存放 在随书光盘 mfile 目录上。 9.1 设计原则和一般步骤 9.1.1 设计原则 9.1.2 一般制作步骤 9.2 借助 GUIDE 创建 GUI 9.2.1 GUIDE 通览 1 GUIDE 的启动 1 图 9.2-1 显示模板预览的 GUIDE Quick Start 对话窗 2 Preferences 设置对版面编辑器的影响 图 9.2-2 带空白模板的 GUIDE 2 3 GUIDE 的功能分区 (1)版面设计区 (2)工具条和菜单条 4 待设计用户界面的性状预设 图 9.2-3 未来界面窗性状设置对话窗 (1)未来界面窗的缩放性 (2)未来界面窗的访问权限 (3)涉及界面窗的其他设置 5 设计区的坐标参照和位置编排器 (1)版面设计区的坐标参照系 图 9.2-4 “格尺”对话框(默认状态) 3 (2)组件位置编排器 图 9.2-5 设计辅助工具和功能 图 9.2-6 编排器对三个组件进行对中处理 6 控件组件属性值的初始设置 4 (1)控件或组件属性值初始设置的必要性 (2)在 GUIDE 中设置控件或组件属性值的方式 (3)对象属性观察器的引出 (4)属性观察器简介(图 9.2-7) 图 9.2-7 属性观察器示例 7 创建界面的文件保存和再命名 (1)对应 GUIDE 创建界面的两个伴生文件 (2)GUIDE 所创建界面的保存操作 图 9.2-8 激活保存操作提示对话框 (3)GUIDE 自动生成文件的再命名 9.2.2 控件的运作机理及创建 用于构建用户界面的组件(Components)中,有一类可专称为控件(Controls)。其原 因在于:它们都是借助 uicontrol 用户界面控件指令(User Interface Controls)制作而成的。 它们的特征都是由 Style 等属性被赋予不同“值”后形成的。这些控件的模板被排列在 GUIDE 左侧的模板区内,参见图 9.2-5。 5 为帮助读者更好地掌握和运用控件,本节将分三小节展开。第一小节,通过对各控件 关键属性、操作方法、触发回调、回调子函数程式和控件外形变化的关联性阐述,深入浅 出地剖析控件的运作机理和使用要领。第二小节,介绍常需读者动手设置的若干通用属性。 第三小节,提供典型算例,供读者体验和参考。 1 各控件的运作机理 2 常需设置的控件通用属性 9.2.3 GUI 界面的创建示例 1 二阶系统阶跃响应演示界面 【例 9.2-1】为归一化二阶系统 G(s)  s2  1 2s 单位阶跃响应制作制作如图 1 9.2-9 所示 的用户界面。要求:(1)通过编辑框和滑键都能输入阻尼比。(2)刚启动的界面初始形 态如图 9.2-9 所示。(3)在刚启动的初始界面上,响应曲线用红线绘制;而一旦界面被操 作,则响应曲线将用蓝线绘制。(4)在列表框中的三个选项可以任意组合。 (1)GUIDE 的开启 图 9.2-9 用户界面的初始状态 6 图 9.2-10 设计本例用户界面的 GUIDE (2)对未来界面窗属性设置 图 9.2-11 窗属性编辑器 (3)辅助设计功能的引入 (4)根据题目要求进行界面构建 7 图 9.2-12 执行文件尚未填写时的生成界面 (5)由 GUIDE 自动产生的 exm090201.m 文件结构 (6)编写界面开启程序 function exm090201_OpeningFcn(hObject, eventdata, handles, varargin) % This function has no output args, see OutputFcn. % hObject handle to figure % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) % varargin command line arguments to exm090201 (see VARARGIN) %U_Start --------U Start zeta=0.3; set(handles.edit1,'String',num2str(zeta)) set(handles.slider1,'Value',zeta) set(handles.gridon,'Value',0) set(handles.gridoff,'Value',1) set(handles.listbox1,'Value',1) handles.t=0:0.05:15; %<14> handles.Color='Red'; %<15> handles.zeta=zeta; %<16> handles.flag=0; handles=surfplot(handles); %<18> handles.flag=1; %<19> handles.Color='Blue'; %<20> %U_End -----------------------------------------------------------------------------------U End handles.output = hObject; %<21> guidata(hObject, handles); 8 (7)可编辑框的回调子函数 function edit1_Callback(hObject, eventdata, handles) % hObject % eventdata reserved - to be defined in a future version of MATLAB % handles %U_Start-----------------------------------------------------U_Start sz=get(hObject,'String'); %<6> zeta=str2double(sz); %<7> set(handles.slider1,'Value',zeta) handles.zeta=zeta; %<9> handles=surfplot(handles); guidata(hObject, handles); %<11> %U_End-------------------------------------------------------U_End (8)滑键回调子函数 function slider1_Callback(hObject, eventdata, handles) %U_Start-----------------------------------------------------U_Start zeta=get(hObject,'Value'); %<3> set(handles.edit1,'String',num2str(zeta)) %<4> handles.zeta=zeta; %<5> handles=surfplot(handles); %<6> guidata(hObject, handles); %<7> %U_End-------------------------------------------------------U_End (9)无线电按键回调子函数 function gridon_Callback(hObject, eventdata, handles) %U_Start-----------------------------------------------------U_Start set(handles.gridoff,'Value',0) grid on %U_End-------------------------------------------------------U_End function gridoff_Callback(hObject, eventdata, handles) %U_Start------------------------------------------------------U_Start set(handles.gridon,'Value',0) grid off %U_End-------------------------------------------------------U_End (10)列表框回调子函数 function listbox1_Callback(hObject, eventdata, handles) %U_Start-----------------------------------------------------U_Start listindex=get(hObject,'Value'); %<3> if any(listindex==1) set(handles.listbox1,'Value',1) end handles.flag=0; %<7> handles=surfplot(handles); handles.flag=1; %<9> guidata(hObject, handles); %<10> %U_End-------------------------------------------------------U_End (11)绘图子函数 function handles=surfplot(handles) % handles=surfplot(handles) % handles 9 zeta=handles.zeta; t=handles.t; listindex=get(handles.listbox1,'Value'); Nt=length(t); if handles.flag==0 cla zmin=get(handles.slider1,'Min'); zmax=get(handles.slider1,'Max'); zt=zmin:0.05:zmax; Nz=length(zt); [ZT,T]=meshgrid(zt,t); Y=zeros(Nt,Nz); for k=1:Nz Y(:,k)=step(tf(1,[1,2*zt(k),1]),t); end surface(ZT,T,Y) shading flat else delete(handles.g1) delete(handles.rline) end xz=ones(1,Nt)*zeta; y1=ones(1,Nt)*1; y=step(tf(1,[1,2*zeta,1]),t); gz=[zeta,zeta,xz,zeta,zeta,xz]; gt=[t(1),t(1),t,t(end),t(end),fliplr(t)]; gy=[0,1,y1,1,0,0*y1]; handles.g1=line(gz,gt,gy,'Color','g','LineWidth',1); % <33> handles.rline=line(xz,t,y,'Color',handles.Color,'LineWidth',2); K=length(get(handles.listbox1,'Value')); for jj=1:K switch listindex(jj) %<37> case 1 case 2 k95=min(find(y>0.95));k952=[(k95-1),k95]; t95=interp1(y(k952),t(k952),0.95); line(zeta,t95,0.95,'marker','+','markeredgecolor','k','markersize',6); case 3 [ym,km]=max(y); if km0 line(zeta,t(km),ym,'marker','.','markeredgecolor','k','markersize',5); end case 4 ii=max(find(abs(y-1)>0.05)); if ii Nch=size(CH,1); for n=1:Nch eval(CH{n}); % <7> % end % <9> ic=get(handles.popupmenu1,'Value'); % <10> clm=get(handles.popupmenu1,'String'); % <11> colormap(clm{ic}) % <12> set(handles.togglebutton1,'Value',1) set(handles.togglebutton1,'String','Axis off') %U_End---------------------------------------------U_End handles.output = hObject; guidata(hObject, handles); function edit1_Callback(hObject, eventdata, handles) %U_Start-------------------------------------------U_Start CH=get(hObject,'String'); %<3> Nch=size(CH,1); %<4> for n=1:Nch eval(CH{n}); %<6> end %U_End---------------------------------------------U_End function popupmenu1_Callback(hObject, eventdata, handles) %U_Start-------------------------------------------U_Start ic=get(hObject,'Value'); % <3> clm=get(hObject,'String'); % <4> colormap(clm{ic}) % <5> %U_End---------------------------------------------U_End function checkbox1_Callback(hObject, eventdata, handles) %U_Start-------------------------------------------U_Start if get(hObject,'Value') grid on else grid off end %U_End---------------------------------------------U_End function checkbox2_Callback(hObject, eventdata, handles) %U_Start-------------------------------------------U_Start if get(hObject,'Value') box on else box off end %U_End---------------------------------------------U_End function togglebutton1_Callback(hObject, eventdata, handles) 13 %U_Start-------------------------------------------U_Start VTB=get(hObject,'Value'); %<3> if VTB %<4> axis off set(hObject,'String','Axis on') set(handles.checkbox1,'Enable','off') set(handles.checkbox2,'Enable','off') else %<7> axis on set(hObject,'String','Axis off') set(handles.checkbox1,'Enable','on') set(handles.checkbox2,'Enable','on') end %U_End---------------------------------------------U_End  按键回调子函数 function pushbutton1_Callback(hObject, eventdata, handles) %U_Start-------------------------------------------U_Start close(handles.figure1) %U_End---------------------------------------------U_End (3)完成界面的创建 9.2.4 界面菜单和工具图标的创建 1 标准菜单条和工具条的配置 【例 9.2-3】在例 9.2-1 产生的界面上,配置 MATLAB 标准图形窗菜单,并对曲面上的特征 点轨迹给以注释,如图 9.2-16。本例演示:如何利用已有界面制作新界面;通过对界面窗 “MenuBar”和“ToolBar”属性的设置,产生标准菜单条和工具条;“静态文本框”内容 的动态变化。 14 图 9.2-16 带标准菜单和文字注释的图形用户界面 (1)利用已有界面制作新界面 (2)利用属性编辑器为界面配置标准菜单条和工具条 (3)按本题要求修改原界面 (4)修改 exm090203.m 文件 function edit1_Callback(hObject, eventdata, handles) % hObject % eventdata reserved - to be defined in a future version of MATLAB % handles %U_Start-----------------------------------------------------U_Start listindex=get(handles.listbox1,'value'); sz=get(hObject,'String'); %<6> zeta=str2double(sz); %<7> set(handles.slider1,'Value',zeta) handles.zeta=zeta; %<9> handles=surfplot(handles); guidata(hObject, handles); %<11> %U_End-------------------------------------------------------U_End 表 9.2-13 surfplot 子函数修改前后的对照 原 surfplot 子函数的最后五条指令 15 xlabel('{\zeta}') ylabel('t') zlabel('y') alpha(0.7) view(75,44) 修改后 surfplot 的最后七条指令 annotation={' ';'!! 黑十字线是“上升时间点”的轨迹';'!! 小黑点线是“最大峰值点”轨迹';'!! 小 红圈线是“镇定时间点”轨迹'}; set(handles.mark,'String',annotation(listindex)) xlabel('{\zeta}') ylabel('t') zlabel('y') alpha(0.7) view(75,44) (4)本例界面与例 9.2-1 界面的不同 2 定制菜单的创建和变量 handles 的观察 【例 9.2-4】以例 9.2-3 制作的界面为基础,进行修改,创建定制菜单。本例有两个目的:为 用户界面配置定制菜单;用来控制界面上坐标框是否封闭,参见图 9.2-17。本例演示:定制 菜单的制作步骤;菜单编辑器的使用及其回调子函数的编写;实现子函数间参数传递的 handles 变量的观察。 图 9.2-17 带定制菜单的用户界面 16 (1)以 exm090203 用户界面为基础制作新界面 (2)定制菜单在菜单编辑器中的创建 图 9.2-18 菜单编辑器的外形和功能分区 (3)定制菜单项回调子函数的编写 function boxon_Callback(hObject, eventdata, handles) %U_Start-----------------------------------------U_Start box on set(handles.boxon,'Enable','off') set(handles.boxoff,'Enable','on') %U_End-------------------------------------------U_End function boxoff_Callback(hObject, eventdata, handles) %U_Start-----------------------------------------U_Start box off set(handles.boxoff,'Enable','off') set(handles.boxon,'Enable','on') %U_End-------------------------------------------U_End (4)保存 M 文件,完成创建 17 图 9.2-19 handles 的结构和保存内容 3 现场菜单创建和 Tag 属性应用 【例 9.2-5】在例 9.2-4 产生的界面 exm090204 为基础,制作一个与坐标相关联的现场菜单, 对响应曲线的颜色进行设置。本例要求的界面见图 9.2-20。本例演示:借助 GUIDE 创建现 场菜单的步骤;菜单编辑器的使用及其回调子函数的编写;借助 GUI 数据,管理和共享色 彩数据;图形对象专用名属性 Tag 的应用。 18 图 9.2-20 带现场菜单和预定义工具图标的图形用户界面 (1)以 exm090204 用户界面为基础制作新界面 (2)现场菜单在菜单编辑器中的创建 19 图 9.2-21 创建现场菜单及其菜单项的菜单编辑器 (3)使现场菜单与界面上的轴对象相关联 (4)编写各现场菜单项的回调子函数 function cyan_line_Callback(hObject, eventdata, handles) %U_Start-----------------------------------------U_Start set(handles.rline,'Color','Cyan') %<8> set(handles.cyan_line,'Checked','on') set(handles.magenta_line,'Checked','off') set(handles.black_line,'Checked','off') set(handles.blue_line,'Checked','off') handles.Color='Cyan'; %<14> guidata(hObject, handles); %<15> %U_End-------------------------------------------U_End function magenta_line_Callback(hObject, eventdata, handles) %U_Start-----------------------------------------U_Start set(handles.rline,'Color','Magenta') set(handles.cyan_line,'Checked','off') set(handles.magenta_line,'Checked','on') set(handles.black_line,'Checked','off') set(handles.blue_line,'Checked','off') handles.Color='Magenta'; guidata(hObject, handles); %U_End-------------------------------------------U_End 20 function black_line_Callback(hObject, eventdata, handles) %U_Start-----------------------------------------U_Start set(handles.rline,'Color','Black') set(handles.cyan_line,'Checked','off') set(handles.magenta_line,'Checked','off') set(handles.black_line,'Checked','on') set(handles.blue_line,'Checked','off') handles.Color='Black'; guidata(hObject, handles); %U_End-------------------------------------------U_End function blue_line_Callback(hObject, eventdata, handles) %U_Start-----------------------------------------U_Start set(handles.rline,'Color','Blue') set(handles.cyan_line,'Checked','off') set(handles.magenta_line,'Checked','off') set(handles.black_line,'Checked','off') set(handles.blue_line,'Checked','on') handles.Color='Blue'; guidata(hObject, handles); %U_End-------------------------------------------U_End (5)实现响应曲线的多色彩选择时 M 文件的工作机理 9.3 全手工编程创建 GUI 在 GUIDE 辅助下得到的界面由两个伴生文件体现。界面及其组件的生成参数在 FIG 文 件中,其码不可读;体现界面及其组件所发生的“事件”的程序在 M 文件中,它可读。由 于这个原因,读者无法从 GUIDE 辅助产生的文件中看到“体现界面的码的全貌”,从而阻 碍了读者对界面生成机理的洞悉。 全手工编写的程序包含了生成界面的全部信息,如组件的几何属性、标识属性、回调 属性等。文件源码透明,界面生成文件简洁,界面工作机理勾画清晰。基于此,本书作者 建议读者不要轻易放过本节内容。 不论是 GUIDE 辅助编程,还是全手工编程,用户界面的创建过程还是大抵相同的:先 在纸上进行界面几何布局设计;然后在 MATLAB 环境中编写生成界面组件布置的程序;再 编写各控件的回调函数;最后进行检验确认。 本节内容着重于程序的编写,请读者阅读时,特别注意注释。本节有两小节:第一小 节介绍创建界面的 M 脚本文件的编写;第二小节介绍内容创建界面的嵌套函数的编写。 9.3.1 采用 M 脚本文件创建用户界面 【例 9.3-1】采用手工编写的 M 脚本文件创建一个与例 9.2-2 功能相同的用户界面(见图 9.2-14),并且以“exm090301——由全手工编写的脚本 M 文件所创建的用户界面”作为该 界面的名称。本例演示:如何通过指令直接描述界面及其控件的类型、位置、颜色、名称 等;如何编写 Callback 属性的回调函数。 (1)界面轮廓设计 (2)根据草图编写 % exm090301_1.m close titlestr='exm090301——由全手工编写的脚本 M 文件所创建的用户界面'; handles.figure=figure('unit','normalized','position',[0.3,0.3,0.428,0.540],... 'Color',[0.836,0.816,0.784],... %<3> 21 'menubar','none',... 'numbertitle','off',... 'defaultuicontrolunits','normalized',... 'defaultuicontrolhorizontal','left',... 'name',titlestr); handles.axes=axes('Units','normalized','position',[0.07,0.372,0.645,0.554],... 'FontUnits','normalized','FontSize',0.055,'visible','on'); handles.edit=uicontrol('Style','edit',... 'position',[0.141,0.043,0.502,0.230],... 'BackgroundColor',[1,1,1]); handles.pop=uicontrol('style','popup',... 'position',[0.766,0.852,0.18,0.074],... 'BackgroundColor',[1,1,1],… 'string',{'spring';'summer';'autumn';'winter'},... 'FontUnits','normalized','FontSize',0.43); handles.check1=uicontrol('Style','checkbox',... 'position',[0.784,0.593,0.145,0.074],... 'string','Grid on',… 'FontUnits','normalized','FontSize',0.43); handles.check2=uicontrol('Style','checkbox',... 'position',[0.784,0.498,0.145,0.074],... 'string','Box on',… 'FontUnits','normalized','FontSize',0.43); handles.toggle=uicontrol('Style','togglebutton',... 'position',[0.766,0.352,0.18,0.074],... 'string','Axes off',… 'FontUnits','normalized','FontSize',0.43); handles.push=uicontrol('Style','pushbutton',... 'position',[0.766,0.117,0.18,0.074],... 'string','Close',… 'FontUnits','normalized','FontSize',0.43); 22 图 9.3-1 手工编写程序生成的静态界面 (3)编写反映状态和回调动作的 M 码 % exm090301_2.m close titlestr='exm090301——由全手工编写的脚本M文件所创建的用户界面'; handles.figure=figure('unit','normalized','position',[0.3,0.3,0.428,0.540],... 'Color',[0.836,0.816,0.784],... 'menubar','none',... 'numbertitle','off',... 'defaultuicontrolunits','normalized',... 'defaultuicontrolhorizontal','left',... 'name',titlestr); handles.axes=axes('Units','normalized','position',[0.07,0.372,0.645,0.554],... 'FontUnits','normalized','FontSize',0.055,'visible','on'); edit_str={'% 所示界面是运行下列指令的结果';... % 'ezsurf(''x^2*exp(-x^2-y^2)'')';... 'shading interp,light,lighting gouraud';... 'grid off,box off,axis on';... '% 可清除以上指令;再输入所需的指令';... '% 想使输入指令执行,请按Ctrl+Enter键。'}; % handles.edit=uicontrol('Style','edit',... 'position',[0.141,0.043,0.502,0.230],... 'BackgroundColor',[1,1,1],… 'Max',2,... 'String',edit_str,… % 'FontUnits','normalized','FontSize',0.1465,... <12> <17> <22> 23 'callback','exm090301_2_callEPT(handles)'); % handles.pop=uicontrol('style','popup','position',[0.766,0.852,0.18,0.074],... 'BackgroundColor',[1,1,1],… 'string',{'spring';'summer';'autumn';'winter'},… 'FontUnits','normalized','FontSize',0.43,... 'Value',1,... 'callback','exm090301_2_callEPT(handles)'); % handles.check1=uicontrol('Style','checkbox',… 'position',[0.784,0.593,0.145,0.074],... 'string','Grid on',… 'FontUnits','normalized','FontSize',0.43,... 'Value',0,… 'callback','exm090301_2_callEPT(handles)'); % handles.check2=uicontrol('Style','checkbox',… 'position',[0.784,0.498,0.145,0.074],... 'string','Box on',… 'FontUnits','normalized','FontSize',0.43,... 'Value',0,… 'callback','exm090301_2_callEPT(handles)'); % handles.toggle=uicontrol('Style','togglebutton',… 'position',[0.766,0.352,0.18,0.074],... 'string','Axes off',… 'FontUnits','normalized','FontSize',0.43,... 'Value',0,… 'callback','exm090301_2_callEPT(handles)'); % handles.push=uicontrol('Style','pushbutton',… 'position',[0.766,0.117,0.18,0.074],... 'string','Close',… 'FontUnits','normalized','FontSize',0.43,… 'callback','close'); %<53> NS=size(edit_str,1); %<54> for kk=1:NS eval(edit_str{kk,:}) %<56> end %<57> (4)执行回调动作的函数exm090301_2_callEPT function exm090301_2_callEPT(handles) Sedit=get(handles.edit,'string'); Vpop=get(handles.pop,'value'); NS=size(Sedit,1); for k=1:NS eval(Sedit{k,:}) %<6> end popstr=get(handles.pop,'String'); colormap(eval(popstr{Vpop})) if get(handles.toggle,'Value') axis off set(handles.toggle,'String','Axis on') set(handles.check1,'Enable','off') set(handles.check2,'Enable','off') else axis on set(handles.toggle,'String','Axis off') 24 <24> <30> <36> <42> <48> set(handles.check1,'Enable','on') set(handles.check2,'Enable','on') if get(handles.check1,'Value'),grid on,else grid off,end if get(handles.check2,'Value'),box on,else box off,end end 9.3.2 采用嵌套函数创建用户界面 【例 9.3-2】采用嵌套函数制作例 9.3-1 用户界面(参见图 9.2-14)。。本例演示:Callback 的函数句柄调用法;内嵌函数的使用;与 GUDE 自动生成文件十分相似的全手编程序。 function exm090302 close titlestr='exm090302——由全手工编写的内嵌函数所创建的用户界面'; handles.figure=figure('unit','normalized','position',[0.3,0.3,0.428,0.540],... 'Color',[0.836,0.816,0.784],... 'menubar','none',... 'numbertitle','off',... 'defaultuicontrolunits','normalized',... 'defaultuicontrolhorizontal','left',... 'name',titlestr); handles.axes=axes('Units','normalized','position',[0.07,0.352,0.645,0.574],... 'FontUnits','normalized','FontSize',0.055,'visible','on'); edit_str={'% 所示界面是运行下列指令的结果';... 'ezsurf(''x^2*exp(-x^2-y^2)'')';... 'shading interp,light,lighting gouraud';... 'grid off,box off,axis on';... '% 可清除以上指令;再输入所需的指令';... '% 想使输入指令执行,请按Ctrl+Enter键。'}; handles.edit=uicontrol('Style','edit',... 'position',[0.141,0.043,0.502,0.230],... 'BackgroundColor',[1,1,1],... 'Max',2,... 'String',edit_str,... 'FontUnits','normalized','FontSize',0.125,... 'callback',@CallbackEdit); % <25> handles.pop=uicontrol('style','popup',... 'position',[0.766,0.852,0.18,0.074],... 'BackgroundColor',[1,1,1],... 'string',{'spring';'summer';'autumn';'winter'},... 'FontUnits','normalized','FontSize',0.43,... 'Value',1,... 'callback',@CallbackPop); % <32> handles.check1=uicontrol('Style','checkbox',... 'position',[0.784,0.593,0.145,0.074],... 'string','Grid on',... 'FontUnits','normalized','FontSize',0.43,... 'Value',0,... 'callback',@CallbackCheck1); % <38> handles.check2=uicontrol('Style','checkbox',... 'position',[0.784,0.498,0.145,0.074],... 'string','Box on',... 'FontUnits','normalized','FontSize',0.43,... 'Value',0,... 'callback',@CallbackCheck2); % <44> 25 handles.toggle=uicontrol('Style','togglebutton',... 'position',[0.766,0.352,0.18,0.074],... 'string','Axes off','FontUnits','normalized','FontSize',0.43,... 'Value',0,... 'callback',@CallbackToggle); % handles.push=uicontrol('Style','pushbutton',... 'position',[0.766,0.117,0.18,0.074],... 'string','Close',... 'FontUnits','normalized','FontSize',0.43,... 'callback','close'); NS=size(edit_str,1); for kk=1:NS eval(edit_str{kk,:}) end function CallbackEdit(hObject,eventdata) % <59> Sedit=get(hObject,'string'); NS=size(Sedit,1); for k=1:NS eval(Sedit{k,:}) end end %<65> function CallbackPop(hObject,eventdata) %<66> Vpop=get(hObject,'value'); popstr={'spring';'summer';'autumn';'winter'}; colormap(eval(popstr{Vpop})) end %<70> function CallbackCheck1(hObject,eventdata) %<71> if get(hObject,'Value') grid on else grid off end end %<77> function CallbackCheck2(hObject,eventdata) %<78> if get(hObject,'Value') box on else box off end end %<84> function CallbackToggle(hObject,eventdata) %<85> if get(hObject,'Value') axis off set(hObject,'String','Axis on') set(handles.check1,'Enable','off') set(handles.check2,'Enable','off') else axis on set(hObject,'String','Axis off') set(handles.check1,'Enable','on') set(handles.check2,'Enable','on') end end %<97> end %<98> 26 <49> 附录A: Notebook Notebook 的功能在于:使用户能在 Word 环境中“随心所欲地享用”MATLAB 的浩瀚 科技资源,为用户营造融文字处理、科学计算、工程设计于一体的完美工作环境。 MATLAB Notebook 制作的 M-book 文档不仅拥有 MS-Word 的全部文字处理功能,而且 具备 MATLAB 无与伦比的数学解算能力和灵活自如的计算结果可视化能力。它既可以看作 解决各种计算问题的字处理软件,也可以看作具备完善文字编辑功能的科技应用软件。 M-book 文档最显著的特点是它的“活”性:  它为论文、科技报告、讲义教材、学生作业的撰写营造了文字语言思维和科学计算思 维的和谐环境。  用 M-book 写成的电子著作、电子文稿、讲义教材不仅图文并茂,而且动静结合。那些 由 MATLAB 指令构成的例题、演示,都可供读者亲自操作,举一反三,从而在“手脑 并用”的环境中由此及彼、由浅入深。 A.1 Notebook 的配置和启动 A.1.1 Notebook 的配置 (1)与 MATLAB 适配的 Word (2)Notebook 的配置 A.1.2 Notebook 的启动 1 创建新的 M-book 文件 (1)在 MATLAB 中创建新的 M-book 文件 (2)在 Word 默认窗口(即 Normal.dot)下创建新的 M-book 文档 1 图 A.1-1 在普通 Word 空白文档中出现的操作界面 图 A.1-2 模板选择窗 2 打开已有的 M-book 文件 (1)在 Word 默认窗口下打开已有的 M-book 文件 (2)在资源管理器中打开已有的 M-book 文件 2 (3)在 MATLAB 当前目录窗中打开已有的 M-book 文件 (4)在 MATLAB 指令窗中开启已有的 M-book 文件 A.2 M-book 模板的使用 图 A.2-1 {Notebook} 下拉菜单的常用功能项 A.2.1 输入细胞(群)的创建和运行 1 细胞(群) 2 基本操作 3 输入细胞(群)操作示例 【例 A.2-1】演示:创建并运行输入细胞的基本操作方法。 (1) xx=(1:5)/5*pi;yy=sin(xx).*exp(xx) (2) x=(1:4)/4*pi;y=sin(x).*exp(x) y= 1.5509 4.8105 7.4605 0.0000 【例 A.2-2】演示:生成完整图形的所有指令必须定义在同一细胞(群)中。 t=0:0.1:10;y=1-cos(t).*exp(-t); tt=[0,10,10,0]; %<1> 3 yy=[0.95,0.95,1.05,1.05]; fill(tt,yy,'g'),axis([0,10,0,1.2]),xlabel('t'),ylabel('y') hold on plot(t,y,'k','LineWidth',4) hold off ymax=max(y) ymax = 1.0669 %<4> %<5> %<6> %<7> %<8> y 1 0.8 0.6 0.4 0.2 0 0 1 2 3 4 5 6 7 8 9 10 t 图 A.2-2 细胞群产生的完整图形 4 A.2.2 Notebook 菜单的其他选项 1 自初始化细胞及其应用 2 整个 M-book 文件的运行 3 删去 M-book 文件所有输出细胞 A.2.3 输出细胞的格式控制 图 A.2-3 控制输出细胞格式的对话框 1 数据输出的表示形式控制 2 图形的嵌入控制 【例 A.2-3】在同一细胞群中虽然包含绘制两幅图形的指令,但实际上只能把最后一个绘制 的图形镶嵌进 M-book。 surf(peaks) colormap(hot) t=(0:50)/50*pi;y=sin(t); plot(t,y) 5 1 0.8 0.6 0.4 0.2 0 0 0.5 1 1.5 2 2.5 3 3.5 图 A.2-4 同一细胞群中最后一幅绘制的曲线图 3 嵌入图形大小的控制 4 嵌入图形的背景色问题 A.3 使用 M-book 模板的若干注意事项 6 附录 B: B.1 光盘文件的结构 光盘使用说明 图 B.1-1 光盘上的目录结构与文件存放示意图 B.2 关于光盘第一级目录和文件的说明  {ForMATLAB6.5}  保存《精通 MATLAB6.5》电子文档的压缩文件,供读者不时之需。  文 档 释 放 后 , 也 包 含 Mbook 和 mfile 两 个 目 录 。 它 们 对 应 原 《 精 通 MATLAB6.5》纸质印刷版。  注意:MATLAB6.5 的符号计算能力是由 Maple 引擎提供的。  {ForMATLAB2011a}  该目录存放的文件完全适配于本书纸质印刷版。  关于该目录下文件的用法,将由本附录的 B.3~B.6 详细解释。  readme.doc 文档 在本书印刷版发行后,光盘内容的任何更改和修订将通过此 readme 文件作概述性 说明。 1 B.3 光盘对软件环境的要求  需要 Windows, Offiece 和 MATLAB R2011a 支持。  假如要完好运行 mbook 文件夹上的 DOC 文件,则需要 Notebook 环境。(关于 Notebook 环境的设置参见附录 A:Notebook) B.4 光盘文件的操作准备 在运行光盘文件之前,应首先把 \mfile 文件夹设置为当前目录或设置在 MATLAB 的搜 索路径上(具体方法详细参见第 1.6 节)。 B.5 mbook 目录上 DOC 文件的使用 光盘 DOC 文件在 MATLAB R2011a 的 Notebook 环境中生成,DOC 文件各章节的编 号、名称与纸质印刷版完全一致。 (1)光盘 DOC 文件的功用  弥补了黑白印刷版丢失的色彩信息 在 MATLAB 中,用 M 文件编辑器或 Notebook 编写的指令或文件运行的结果(尤 其图形)都采用不同的色彩鲜明地表现对象特征。但目前印刷版书籍出于价格和技术 原因,不得不牺牲色彩信息而采用“黑白”处理。读者借助本光盘可克服印刷版丢失 色彩信息的缺憾。  为教师制作 MATLAB 教材电子讲稿提供模板 据本人十多年 MATLAB 教学经验,作者建议:在 MATLAB 的课堂教学中,电子 讲稿最好使用 M-book 模板制作,而不宜采用 PowerPoint 制作。正是出于这样的考 虑,本书光盘提供了各章的 DOC 文件。它们包含完整的章节结构和名称,包含所有算 例的题解要求和完整的解题程序。 主讲这门课程的老师,可以根据自己经验和心得,针对具体教学对象,通过对本 光盘 DOC 文件进行适当的剪裁,增补数量不多但相当醒目的提示、警告和归纳性文 字,就可得到因人施教的电子讲稿。  为研发人员制作演讲稿、本科生研究生撰写毕业论文提供模板 因为光盘中任何一章 DOC 文档保存有完整的标题结构和 Notebook“活性”,所 以研发人员、本科生研究生只需根据自己需要修改标题,添加内容和指令,就可完成 规范的文稿。这种文稿的仿真实例便于现场修改参数,计算运行,显示数字结果或图 形曲线,强化演讲或文稿的说服力。  为读者提供了与印刷版对应的 Notebook 演练环境 本光盘中 DOC 文件的章节结构、算例编号与印刷版完全相同。因此在学习过程 中,读者可在本光盘启动的 Notebook 环境中,或直接运行算例,观察运行结果;或改 变若干指令,举一反三地观察运行结果的变化;或通过简单的复制操作,使相应指令 在 MATLAB 指令窗中运行,而避免自己键入的错误。 (2)DOC 文件的开启 所有 DOC 文档都是在(Word + MATLAB R2011a)构成的 Notebook 环境中生成的。 因此,在相同环境下开启是最佳选择。此时,文档具有“活性”。假如读者的 MATLAB 与 Word 联接正确,用鼠标双击光盘上的 DOC 文件,就能直接进入 Notebook 环境。 (3)光盘 DOC 文件的使用方法  作为演练环境使用 在正常打开的光盘 DOC 文件中,读者只要把光标放在绿色的输入细胞内,按组 合键 [Ctrl + Enter] ,就可使该输入细胞重新执行计算。在演练中,读者可以通过对指 令的修改、变化和重新运行,观察运算结果的变化,从而达到举一反三的效果。 2  作为样板使用 先打开光盘 DOC 文件,然后删去原光盘文件内容,再写入读者自己所需的内 容,最后通过菜单项的“另存为”操作保存为自己的文件。这样获得的文件能正常地 在 Notebook 环境下工作,也就是既可以输入文字、公式,又可以运行 MATLAB 指 令、嵌入数值或图形结果;既拥有 Word 的所有文字处理能力,又具备 MATLAB 的运 算、表现能力。 B.6 mfile 目录上的 M、MDL 文件的使用 (1)mfile 目录文件编号规则举例  图 B.1-1 中的 是 M 文件,专供算例 4.2-3 中的指令调用。  图 B.1-1 中的 是 Simulink 块图模型的 MDL 文件,供算例 4.2-7 使用。  图 B.1-1 中的 是 MAT 数据文件,专供算例 4.3-3 使用。 (2)M 文件的使用  文件所在目录 mfile 必须被设置为 MATLAB 当前目录,或被设置在 MATLAB 搜索路 径上。  本光盘提供的 M 文件中,有许多是很通用的,读者只要稍加修改,就可为己所用。 (3)MDL 文件的使用  文件所在目录 mfile 必须被设置为 MATLAB 当前目录,或被设置在 MATLAB 搜索路 径上。  该光盘上的 MDL 文件“真正可运作”的 Simulink 块图模型 由于 Simulink 工作特点的缘故,纸质印刷书籍不可能承载 Simulink 块图模型的代 码。这给读者带来许多困惑和麻烦:一,读者如想验证书中结论,那就不得不从建模 做起;二,仿真模块中的参数设置常使初学者顾此失彼,从而造成仿真失败。 本光盘上的 MDL 模型文件都可直接在 MATLAB 中运行,进行验证。用户也可以 在模型打开后,修改参数,观察变化。 3 附录 C: 索 引 〖使用说明〗  本“索引”列出了在本书叙述文字或算例中所涉及的所有符号、指令、模块和图形对 象属性的“关键符(词)”。  读者根据“关键符(词)”可从本“索引”找到本书对它的说明或使用算例。 C.1 MATLAB 的标点及符号 算术运算符 Arithmetic operators + 加 ;正号 1.3.3, 2.2.1, 4.3.1 - 减;负号 1.3.3, 2.2.1, 4.3.1 * 矩阵乘 1.3.3, 2.2.1, 4.3.1 .* 数组乘 1.3.3, 2.2.1, 4.3.1 \ 矩阵左除 1.3.3, 2.2.1, 4.5.1, 4.5.3, 5.6.2 / 矩阵右除 1.3.3, 2.2.1, 4.5.1 .\ 数组除 1.3.3, 2.2.1, ./ 数组除 1.3.3, 2.2.1, ^ 矩阵乘方 1.3.3, 2.2.1, 4.4.2 .^ 数组乘方 1.3.3, 2.2.1, ' 共轭转置 2.2.1, 4.3.1 .' 非共轭转置 2.2.1, 4.3.1 关系运算符 Relational operators == 等于 2.2.1, 2.5.1, 4.7.1, 5.1.3 ~= 不等于 2.2.1, 2.5.1, < 小于 2.2.1, 2.5.1, 4.2.3 > 大于 2.2.1, 2.5.1, 4.2.3 <= 小于等于 2.2.1, 2.5.1, 4.10.2 >= 大于等于 2.2.1, 2.5.1, 4.10.2 逻辑运算符 Logical operators & 逻辑与 2.5.2 | 逻辑或 2.5.2, 4.2.3, 4.10.2 ~ 逻辑非 2.5.2 && 先决逻辑与 || 先决逻辑或 1 特殊符号 Special characters , 逗号 ; 分号 空格 @ 创建函数句柄 . 小数点号、构架域号 : 冒号 ... 续行号 '' 单引号 共轭转置号 .' 转置号 = 赋值号 _ 下连符 ! 调用 DOS 操作指令号 () 圆括号 [] 方括号 [] 空阵 {} 花括号 % 注释号 1.4.2, 2.1.2 1.4.2, 2.1.2 1.4.2, 2.1.2 1.4.2, 4.2.3, 7.4.2, 7.5.2 1.4.2, 3.4.1 1.4.2, 2.1.1, 2.1.3 1.4.2, 1.4.2, 2.7.1, 2.7.1, 1.4.2 1.4.2 1.4.2 1.3.3, 1.4.2, 1.4.2, 2.1.2 2.1.4, 2.4.2 1.4.2, 3.3.1, 3.3.5, 7.7.4 1.4.2 C.2 MATLAB 的函数及指令 Functions and Commands Aa abs 绝对值、模、字符 ASCII 码值 accumarray 按制定规则累加 acos 反余弦 acot 反余切 acosh 反双曲余弦 acoth 反双曲余切 acsc 反余割 acsch 反双曲余割 alim 透明数据范围 all 所有元素非零为真 alpha 设置透明属性 AlphaData 图形对象透明度数据设置 AlphaDataMapping 透明度映射模式 alphamap 设置透明度表 angle 相角 ans 表达式计算结果的缺省变量名 any 所有元素非全零为真 area 面域图 argnames 函数 M 文件变量名 arrayfun 对指定数组或构架域实施运算 asec 反正割 asech 反双曲正割 asin 反正弦 1.3.3, 2.2.1, 3.1.2, 4.10, 4.10.2 2.2.3 2.2.1 2.2.1 2.2.1 2.2.1 2.2.1 2.2.1 6.3.4 2.5.3 4.12.4, 6.3.4, 6.4.2, 6.4.3, 8.7.5, 9.2.3 6.3.4 6.3.4 6.3.4, 6.4.2, 6.4.3 1.3.3, 4.10 1.3.2,1.4.3 2.5.3, 7.7.2 1.7.1, 6.6.1 7.6.3 2.2.3, 3.4.5, 3.4.6 2.2.1 2.2.1 2.2.1 2 asinh assignin atan atan2 atanh autumn axes axis 反双曲正弦 向变量赋值 反正切 四象限反正切 反双曲正切 红黄调秋色图阵 创建轴对象的低层指令 控制轴刻度和风格的高层指令 2.2.1 7.7.4 2.2.1 2.2.1 2.2.1 6.3.2, 7.2.2 6.8.2, 9.3.1, 9.3.2 4.11.1, 6.1.3, 6.2.1, 6.2.2, 6.6.3, 7.7.2 Bb BackgroundColor 图形对象控件底色 9.3.1, 9.3.2 bar 二维直方图 6.6.1 bar3 三维直方图 6.6.1 bar3h 三维水平直方图 6.6.1 barh 二维水平直方图 6.6.1 bdclose 清空内存中块图模型 8.8.3 binormal 二项分布随机数 4.6.1 blanks 创建空格串 3.2.4, 3.4.4, 4.2.1, 4.6.3 blkdiag 构造块对角阵 2.1.4 bone 蓝色调黑白色图阵 6.3.2 box 框状坐标轴 6.2.2, 6.8.2 break while 或 for 环中断指令 6.5.2, 7.2.1 brighten 亮度控制 6.4.2, 6.6.3 bvp4c 求微分方程边值问题的近似解 4.11.2 bvp5c 较高精度解边值问题 4.11.2 bvpinit 生成 bvp4c 调用指令所必须的“解猜测网” 4.11.2 bvpset 显示 bvp4c 指令“选项”的全部属性及其缺省设置4.11.2 bvpval 计算微分方程积分区间内任何一点的解值 Cc Callback cart2pol cat caxis cd cdf2rdf ceil cell cell2mat cell2struct celldisp cellfun cellplot cellstr char chol circshift clabel cla class clc 图形对象控件回调属性 9.3.1, 9.3.2 直角坐标变为极或柱坐标 4.10.5 串接成高维数组 2.1.4 色标尺刻度 6.4.1, 6.4.3 指定当前目录 1.4.3, 1.7.4, 复值对角阵转为实块对角阵 4.4.1 向正无穷取整 2.2.1 创建元胞数组 3.2.2, 3.3.6 把元胞数组变换为矩阵 3.3.4, 3.3.6 元胞数组转换为构架数组 3.3.6, 3.4.4, 3.4.6 显示元胞数组内容 3.3.1, 3.3.6 函数作用于每个胞元 3.3.5, 3.3.6 元胞数组内部结构图示 3.3.1, 3.3.6 生成字符串胞元数组 3.2.2, 3.3.6 转换为字符串 3.1.2, 3.2.2, 3.2.3, 3.2.4, 4.8.3, 5.2.1, 5.2.5, 5.9.1, 5.10.2, 7.6.3 Cholesky 分解 4.5.1 平移回绕 2.1.4 等位线标识 6.4.1 清除当前轴 9.2.3 获知对象类别或创建对象 3.2.2, 4.7.1, 5.1.3 清除指令窗 1.4.3, 7.2.1 3 clear 清除内存变量和函数 clf 清除图对象 close 关闭指定窗口 coeffs 获取多项式系数 collect 符号计算中同类项合并 Color 图形对象色彩 colorbar 色标尺 colorcube 三浓淡多彩交叉色图矩阵 colormap 色图 colspace 列空间的基 comet 彗星状轨迹图 comet3 三维彗星轨迹图 compass 射线图 cond 条件数 condeig 带条件数的特征值分解 condest 范 –1 条件数估计 conj 复数共轭 contour 等位线 contourf 填色等位线 contourslice 四维切片等位线图 continue 循环继续 conv 多项式乘、卷积 cool 青紫调冷色图 copper 古铜调色图 corrcoef 相关系数 cos 余弦 cosh 双曲余弦 cot 余切 coth 双曲余切 cplxpair 复数共轭成对排列 createOptimProblem 创建待解优化问题 cross 叉积 csc 余割 csch 双曲余割 cumprod 数组元素累乘 cumsum 元素累计和 cumtrapz 累计梯形积分 cylinder 创建圆柱 Dd datacursormode 激活数据探针 dblquad 二重数值积分 deal 分配宗量 deblank 删去串尾部的空格符 deconv 多项式除、解卷 delaunay Delaunay 德洛奈三角剖分 del2 离散 Laplacian 差分 delete 删除对象 det 行列式 deval 推算边值解区间中任点值 diag 矩阵对角元素提取、创建对角阵 1.4.3, 1.7.2, 5.1.4, 5.1.5, 5.9.2, 7.2.1, 7.3.2 1.4.3, 9.2.3, 9.3.2 5.2.2 5.2.2 6.2.1, 6.2.2, 6.5.2, 6.8.3, 9.2.3, 9.3.1, 9.3.2 4.12.5, 6.3.3, 6.4.1, 6.4.2, 8.7.5 6.3.2 4.2.3, 5.8.1, 6.1.3, 6.3.2, 6.6.1, 6.7.2, 9.2.3 5.6.1 6.5.1 6.5.1 6.6.2 4.3.2, 7.2.1 4.4.1 4.3.2 2.2.1 4.12.5, 6.4.1 6.4.1 6.4.3 7.2.1 4.7.1 6.3.2, 6.4.1, 6.6.1, 6.6.3 6.3.2, 6.3.5 4.6.1, 2.2.1 2.2.1 2.2.1 2.2.1 4.10 4.10.5 2.2.3 2.2.1 2.2.1 2.2.3 2.2.3, 6.6.1 4.2.3 6.8.3 4.2.3 3.3.1, 3.3.6, 3.4.2 3.2.4 4.7.1 6.6.3 6.4.2 9.2.3 4.3.1, 4.5.1, 5.6.1 4.11.2 2.1.2, 5.6.1 4 diary diff digits dir dirac disp dlinmod doc docsearch dot double drawnow dsolve Ee edit eig emlBlock Enable end eps EraseMode error errortrap erfc eval evalin exist exit exp expand expint expm expm1 expm2 expm3 exprand expstat eye ezcontour ezcontourf ezmesh ezmeshc ezplot ezplot3 ezpolar ezsurf ezsurfc Ff MATLAB 指令窗文本内容记录 数值差分、符号微分 符号计算中设置符号数值的精度 目录列表 符号单位脉冲 显示数组 离散系统的线性化模型 在帮助浏览器中显示帮助信息 对 HTML 帮助系统搜索 点积 把其他类型对象转换为双精度数值 强迫重画 符号计算解微分方程 1.4.3, 4.2.2, 4.9.4, 5.3.1, 8.8.1 5.2.1 1.4.3, 1.7.4, 5.5.2 4.6.3, 4.12.3, 7.2.4, 8.7.5, 8.8.3 8.7.3 1.4.3, 1.9.2, 5.1.5 1.9.2 2.2.3 3.2.3, 4.10.2, 5.2.1, 6.6.1 6.5.2 5.4.2, 5.4.3, 5.9.2, 8.8.1 启动 M 文件编辑器 1.4.3, 求特征值和特征向量 4.4.1, 5.6.1 符号式制作成 Simulink 块 5.9.1, 5.9.3 图形对象控件使能属性 9.2.2, 9.2.3, 9.3.1, 9.3.2 结构体结尾 7.4.3 数组每维最后元素下标 2.1.4, 4.2.2 浮点相对精度 1.3.3, 1.5.3, 4.1, 4.2.1 图形线对象擦除模式 6.5.2 显示出错信息并中断执行 4.10.2, 5.9.2, 7.2.5, 7.3.1, 7.4.1, 7.5.4, 7.7.2 错误发生后的双位开关 7.2.5 误差补函数 5.1.5 串演算指令 3.2.4, 5.9.1, 7.6.1, 7.6.2, 9.2.3, 9.3.1, 9.3.2 跨空间串演算指令 5.1.4, 5.1.5, 5.5.3, 5.6.3, 5.8.1, 5.9.1, 5.10.2, 7.7.4 检查变量或函数是否已定义 1.9.4, 退出 MATLAB 环境 1.4.3, 7.2.5 指数函数 2.2.1, 符号计算中的展开操作 5.2.2, 5.7.1 指数积分函数 5.10.1 常用矩阵指数函数 4.4.2, 5.6.1, 5.7.2, 5.9.2 Pade 法求矩阵指数 4.4.2 Taylor 法求矩阵指数 4.4.2 特征值分解法求矩阵指数 4.4.2 指数分布随机数 4.6.1, 4.6.3 指数分布理论均值和方差 4.6.3 单位阵 2.1.2 画等位线的简捷指令 5.8.1 画填色等位线的简捷指令 5.8.1 画网线图的简捷指令 5.8.1 画带等位线的网线图的简捷指令 5.8.1 画二维曲线的简捷指令 4.10.2, 4.10.3, 5.8.1, 6.6.5, 7.2.4 画三维曲线的简捷指令 5.8.1 画极坐标图的简捷指令 5.8.1 画表面图的简捷指令 5.8.1 画带等位线的表面图的简捷指令 5.8.1 5 FaceAlpha false factor feather feval fft fft2 fftn fftshift fieldnames figure fill fill3 filter find findstr find_system finverse fix flag fliplr flipud flipdim floor flow fminbnd fmincon fminunc fminsearch fnder fnint fnmin fnval fnplt fnzeros FontSize FontUnits for format fourier fplot fprintf fsolve function functions funm fzero 图形贴面透明模式 6.3.4 逻辑假 2.5.3 符号计算的因式分解 5.2.2 羽毛图 6.6.2 执行由串指定的函数 3.1.5, 4.9.4, 5.1.4, 5.6.3, 5.9.1, 5.10.2, 7.4.1, 7.4.2, 7.6.2 离散 Fourier 变换 4.10, 4.10.1, 4.10.2, 4.10.3 二维离散 Fourier 变换 4.10 高维离散 Fourier 变换 4.10 直流分量对中的谱 4.10, 4.10.2, 4.10.3 构架域名 3.4.2, 3.4.6 创建图形窗 5.7.1, 5.8.1, 6.1.3, 9.3.1 二维多边形填色图 6.6.3, 7.3.1 三维多边形填色图 6.6.3 滤波器 4.7.2, 6.2.2 寻找非零元素下标 2.4.1, 4.9.1, 5.5.1, 6.3.5, 9.2.3 寻找短串的起始字符下标 3.2.4 获知模型所用模块名称 8.7.1 符号计算中求反函数 5.8.2 向零取整 2.2.1, 红白蓝黑交错色图阵 6.3.2 矩阵的左右翻转 2.1.4, 9.2.3 矩阵的上下翻转 2.1.4, 4.8.2, 6.5.1, 6.6.1, 7.2.2 矩阵沿指定维翻转 2.1.4 向负无穷取整 2.2.1, 4.10.2 MATLAB 提供射流演示数据 6.4.3 求单变量函数极小 4.12.1, 4.12.2 带约束多变量函数极小 4.12.1, 4.12.4, 4.12.5 拟牛顿法求多变量函数极小值点 4.12.1 单纯形法求多变量函数极小值点 4.9.4, 4.12.1, 4.12.3, 8.7.5 对样条函数求导 4.9.3, 4.9.4 利用样条函数求积分 4.2.3, 4.9.3, 4.9.4 求样条函数最小 4.9.3, 4.9.4 计算样条函数区间内任意一点的值 4.9.3 绘制样条函数图形 4.9.4 求样条函数零点 4.9.3, 4.9.4 图形字对象大小 9.2.2, 9.2.3, 9.3.1, 9.3.2 图形字对象单位 9.2.2, 9.2.3, 9.3.1, 9.3.2 构成 for 环用 7.2.1 设置输出格式 1.4.1, 4.2.1, 4.3.1, 4.7.1, 5.2.3, 7.2.1 Fourier 变换 5.5.1 返函绘图指令 6.6.5 设置显示格式 3.2.3, 3.4.4, 4.12.3 求多元函数的零点 4.5.4 函数文件的头关键词 7.7.2, 8.9.3, 9.3.2 函数句柄内涵观察 7.5.2 计算一般矩阵函数 4.4.2 求单变量非线性函数的零点 4.5.4, 4.9.1, 4.9.4 Gg gallery gamma 特殊测试矩阵  函数 2.1.2, 4.4.1, 4.5.2, 4.5.3 5.3.3 6 gca 获得当前轴句柄 6.2.1, 6.2.2 gcbo 获得正执行“回调”的对象句柄 9.2.3 gcf 获得当前图对象句柄 6.3.2, 6.3.4, 6.4.1, 6.5.2 get 获知对象属性 4.6.1, 6.1.3, 6.2.3, 8.7.2, 9.2.3 getfield 获知构架数组的域 3.4.2, 3.4.6 getframe 获取影片的帧画面 6.5.1, 6.5.2 get_param 获取对象参数值 8.7.1, 8.7.3 ginput 从图形窗获取数据 4.5.4 global 定义全局变量 7.7.3, 8.7.5 GlobalSearch 创建全域优化对象 4.12.5 gradient 近似梯度 4.2.1, 6.4.2, 7.7.2 gray 黑白灰度 6.3.2, 6.7.1, 6.7.2 grid 画分格线 6.1.3, 6.2.2, 8.7.5 griddata 规则化数据和曲面拟合 4.9, guide 启动 GUI 辅助设计工具 9.2.1 guidata GUI 数据的存储和获取 9.2.1, 9.2.3, 9.3.2 Hh help 在线帮助 1.4.3, 1.9.2, 1.10.2, 5.1.5, 7.3.2 helpbrower 交互式在线帮助 1.9.3 helpdesk 打开超文本形式用户指南 1.9.3 heaviside 符号阶跃函数 4.10.2, 4.10.3, 5.5.1, 5.5.2 hidden 透视和消隐开关 6.3.5 hist 频数计算或频数直方图 4.6.1,4.6.2 histc 端点定位频数直方图 4.6.2 histfit 带正态拟合的频数直方图 4.6.1, 4.6.2 hold 当前图是否重画的切换 6.2.1, 6.2.3, 6.8.2, 8.7.5 horner 分解成嵌套形式 5.2.2 HorizontalAlignment 图形文字对象水平对齐方式 6.2.2, 9.2.2, 9.2.3 horzcat 水平排放数组 2.1.4 hot 黑红黄白色图 6.3.2, 6.3.5 hsv 饱和色图 6.3.2 Ii idivide if-else-elseif ifft ifft2 ifftn ifourier i, j ilaplace imag image imagesc imfinfo imread imwrite ind2sub inf inline 条件分支结构 离散 Fourier 反变换 二维离散 Fourier 反变换 高维离散 Fourier 反变换 Fourier反变换 缺省的“虚单元”变量 Laplace反变换 复数虚部 显示图象 显示亮度图象 获取图形文件信息 从文件读取图象 把图象写成文件 单下标转变为多下标 无穷大 构造内联函数对象 2.2.1 6.5.2, 7.2.2, 7.3.1, 7.7.2, 8.5.3 4.10, 4.10.1 4.10 4.10 5.5.1 1.3.3 5.5.2 1.3.3, 4.10.4, 5.7.1,7.7.4 6.5.2, 6.7.2 6.7.2 6.7.2 6.7.2 6.7.2 2.4.1 1.3.3, 4.1 2.2.3, 4.2.3, 7.6.3 7 inmem input inputname int int2str interp1 interp1q interp2 interp3 interpn interpft intmax intmin inv ipermute isa iscell ischar isempty isfinite isglobal ishandle isinf isletter islogical isnan isnumeric isprime isreal isspace iztrans 列出内存中的函数名 提示用户输入 输入宗量名 符号积分 把整数数组转换为串数组 一维插值 一维快速插值 二维插值 三维插值 N 维插值 利用 FFT 插值 可表达的最大正整数 可表达最小负整数 求矩阵逆 permute 逆操作 检测是否给定类的对象 若是元胞数组则为真 若是字符串则为真 若是空阵则为真 若全部元素都有限则为真 若是全局变量则为真 若是图形句柄则为真 若是无穷数据则为真 若是英文字母则为真 若是逻辑数组则为真 若是非数则为真 若是数值数组则为真 若是质数则为真 若是实数则为真 若是空格则为真 符号计算Z反变换 7.3.2 7.2.1, 7.2.5 7.7.1 4.10.2, 5.3.3 2.4.1, 3.2.3 4.9, 4.9.1, 9.2.3 4.9 4.9, 4.9.2 4.9 4.9 4.9 1.3.3 1.3.3 4.5.1, 4.5.2, 4.5.3, 4.8.2, 5.6.1 2.1.4, 2.3.3 2.5.3, 5.1.3 2.5.3, 2.5.3, 3.2.4 2.4.2, 4.10.2, 7.2.4 2.5.3 2.5.3 2.5.3 2.5.3 2.5.3, 3.2.4 2.5.3, 2.4.1, 2.5.3 2.4.2 2.5.3 2.5.3 2.5.3, 3.2.4 5.5.3 Jj,Kk jacobian jet jordan keyboard kron kurtosis Ll laplace lasterror lastwarn legend length light lighting limit 符号计算中求Jacobian 矩阵 蓝头红尾饱和色 符号计算中获得 Jordan标准型 键盘获得控制权 Kronecker 乘法规则产生的数组 统计峭度 5.3.1 6.3.2, 6.3.3, 6.3.4, 6.4.2, 6.4.3, 6.5.1,6.6.3 4.4.1, 5.6.1 7.2.5 2.2.3 4.6.3 Laplace变换 显示最新出错信息 显示最新警告信息 图形图例 数组长度 创建光对象 照明模式 符号法求极限 5.1.5, 5.5.2 7.2.4, 7.2.5 7.2.5 4.10.3, 5.8.1, 6.1.3, 6.2.2, 6.6.1, 6.6.3, 7.7.2 2.1.3, 4.10.3, 6.6.3, 9.2.3 4.2.3, 5.8.1, 6.1.3, 6.3.4 4.2.3, 6.3.4 4.2.1, 5.3.1 8 line lines LineStyle LineWidth linmod linmod2 linprog linsolve linspace load load_system Location log log10 log2 logical logm logspace lookfor lower lu 创建线对象 6.5.2, 7.7.2, 9.2.3 采用 plot 画线色 6.3.2 图形线对象的型式 6.2.1, 6.8.3 图形线对象宽度 6.2.1, 6.2.2, 6.5.2, 6.6.3, 7.7.2, 8.4.1, 9.2.3 获连续系统的线性化模型 8.7.3 获连续系统的线性化精良模型 8.7.3, 8.7.4 线性规划 4.12.1 指定算法解方程 4.5.1 线性等分向量 2.1.1 从 MAT 文件读取变量 1.7.4, 装载系统 8.8.3 图形轴对象方位 6.2.2, 6.3.3, 6.4.2, 6.6.1, 6.6.3,7.7.2, 8.4.1 自然对数 2.2.1, 常用对数 2.2.1, 4.6.2 底为 2 的对数 2.2.1 创建逻辑数组 2.5.3, 7.2.1 矩阵对数 4.4.2 对数分度向量 2.1.1,4.2.1 按关键字搜索 M 文件 1.10.1, 转换为小写字母 3.2.4 LU 分解 4.5.1 Mm magic 魔方阵 Marker 图形线对象点形 MarkerEdgeColor 图形线对象点边界色彩 MarkerFaceColor 图形线对象点域色彩 MarkerSize 图形线对象点大小 mat2cell 把矩阵 B 转换为元胞数组 mat2str 把数值数组转换成输入形态串数组 material 材料反射模式 matlabFunction 符号式产生数值 M 文件 Max 图形对象控件最大值属性 max 找向量中最大元素 mean 求向量元素的平均值 median 求中位数 Menubar 图形窗对象菜单条属性 mesh 网线图 meshgrid 产生“格点”矩阵 mfun 对MuPAD经典函数实施数值计算 Min 图形对象控件最小值属性 min 找向量中最小元素 minreal 状态方程最小实现 mkdir 创建目录 mod 模运算 moment 中心矩 more 指令窗中内容的分页显示 movie 放映影片动画 2.1.2, 4.3.1, 7.2.1 6.2.1, 6.5.2, 6.8.3, 9.2.3 6.2.1, 6.8.3, 9.2.3 6.2.1, 6.8.3 6.2.1, 6.2.2, 6.5.2, 9.2.3 3.2.4, 3.3.4, 3.3.6 2.4.1, 3.2.3, 4.8.3, 5.2.1 5.8.1, 6.1.3, 6.3.4, 6.3.5 5.9.1, 5.9.2, 5.9.3 9.2.2, 9.2.3, 9.3.1, 9.3.2 4.3.2, 6.4.1, 6.4.3, 9.2.3 4.6.3 4.6.3 9.2.4, 9.3.1, 9.3.2 4.11.1, 6.1.3, 6.3.2 2.2.3, 4.2.3, 4.9, 4.12.4, 6.1.3, 6.4.3, 9.2.3 5.1.5, 5.9.1, 5.10.1 9.2.2, 9.2.3 4.9.1, 6.4.1, 6.4.3, 8.7.5, 9.2.3 8.7.3 1.7.4, 2.2.1, 7.2.1 4.6.3 1.4.3 6.5.1 9 Nn Name 图形窗对象名称 9.3.1 NaN 非数(预定义)变量 1.3.3, 2.4.1, 2.5.1, 4.1 nargin 函数输入宗量数 1.3.3, 4.10.2, 6.5.2, 7.3.1, 7.7.1 nargout 函数输出宗量数 1.3.3, 4.10.3, 6.5.2, 7.2.4, 7.3.1, 7.7.1 ndgrid 产生高维格点矩阵 4.9 ndims 求数组维数 2.1.3, 2.4.2 nextpow2 取最接近的较大 2 次幂 4.10 nlinfit 非线性最小二乘拟合 4.8.3 nlparci 拟合参数置信区间 4.8.3 nlpredci 拟合的预测区间 4.8.3 norm 矩阵或向量范数 4.3.2, 4.5.3 normstat 正态理论均值和方差 4.6.3 notebook 启动 MATLAB 和 Word 集成环境 A.1.1 null 零空间 4.3.2, 5.6.1 num2cell 把数值数组转换为元胞数组 3.3.4, 3.3.6, 8.7.2 num2str 把非整数数组转换为串 3.2.3, 4.6.3, 4.8.3, 5.2.1, 8.8.3 NumberTitle 图形窗对象序号 9.3.1 numden 获取最小公分母和分子表达式 5.2.2, 5.7.2 Oo ode113 非 Stiff 微分方程变步长解算器 ode15s Stiff 微分方程变步长解算器 ode23 非 Stiff 微分方程变步长解算器 ode23s Stiff 微分方程解算器 ode23t 适度 Stiff 微分方程解算器 ode23tb Stiff 微分方程解算器 ode45 非 Stiff 微分方程变步长解算器 odeset 创建或改写 ODE 选项构架参数值 ones 全 1 数组 open_system 开启块图模型 optimset 优化指令的参数设置 orderfields 重排域名 orth 值空间正交化 4.11.1 4.11.1 4.11.1 4.11.1 4.11.1 4.11.1 4.11.1 4.11.1 2.1.2 8.8.3 4.12.2, 4.12.4, 8.7.5 3.4.3, 3.4.6 4.3.2 Pp Parent pascal path pathtool pause pcode pcolor peaks permute pi pie pie3 pink 图形对象的父对象 6.8.3 特殊矩阵 4.3.1 设置 MATLAB 搜索路径的指令 1.6.4 搜索路径管理器 1.6.4 暂停 6.5.2, 7.2.5 创建预解译 P 码文件 7.3.2 伪彩图 6.4.1, 8.7.5 MATLAB 所给三维曲面 6.3.4, 6.8.3 对各维次序重组 2.1.4, 2.3.3 (预定义变量)圆周率 1.3.3,1.3.4,1.4.5 二维饼图 6.6.1 三维饼图 6.6.1 粉红色图矩阵 6.3.2 10 pinv plot plot3 plotmatrix plotyy pol2cart poly poly2str poly2sym polyfit polyval polyvalm Position ppval pretty prism prod 伪逆 4.3.2, 4.5.3 平面线图 4.5.4, 6.1.3, 6.2.1, 6.6.5, 6.8.2, 7.2.4, 7.7.2, 8.7.5 三维线图 4.12.4, 5.7.1, 6.1.3, 6.3.1, 6.5.2 矩阵的散点图 6.6.4 双纵坐标图 6.2.3, 7.7.2 极或柱坐标变为直角坐标 6.6.2 矩阵特征多项式、根集对应多项式 4.7.1, 5.6.1 以习惯方式显示多项式 4.7.1 双精度多项式系数转变为向量符号多项式 5.9.1 数据的多项式拟合 4.7.1, 4.8.2 计算多项式的值 4.7.1, 4.8.2 计算矩阵多项式 4.7.1 图形轴对象位置 6.2.3, 6.3.3, 6.3.5, 6.4.1, 6.4.2, 6.6.3, 9.2.2, 9.3.1, 9.3.2 计算分段多项式 4.2.3, 4.9.3 以习惯方式显示符号表达式5.3.1, 5.3.3, 5.7.2 光谱色图矩阵 6.3.2 数组所有元素乘积 2.2.3 Qq qr quad quad2d quadl quadprog quadv quit quiver 矩阵的正交三角分解 低阶法计算数值积分 变限重积分 Lobatto 计算数值积分 二次规划 函数数组求积 推出 MATLAB 环境 二维方向箭头图 4.5.1, 4.8.2 4.2.3 4.2.3 4.2.3, 4.10.2 4.12.1 4.2.3 1.4.3, 7.2.5 8.7.5 Rr rand randi randn randperm randsrc RandStream range rank raylrnd raylstat rcond real realmax realmin rec rem repmat reset reshape residue Resize return 产生均匀分布随机数 均匀分布整数 产生正态分布随机数 随机置换向量 指定字符集均布随机数 随机流 样本极差 矩阵的秩 瑞利分布随机数 瑞利分布理论均值和方差 矩阵倒条件数估计 复数的实部 最大正浮点数 最小正浮点数 符号法解递推方程 求余数 铺放模块数组 重置 改变数组维数、大小 部分分式展开 图形对象大小可变属性 返回 2.1.2, 4.6.1 2.1.2 4.6.1 2.1.2 4.6.1 2.1.2 2.1.2, 4.6.1, 6.6.4 4.6.1, 4.6.3, 4.12.5 4.6.3 4.3.2, 5.6.1 4.6.1, 4.6.3 4.6.3 4.3.2 1.3.3, 4.10.4, 5.7.1, 7.7.4 1.3.3, 4.1 1.3.3, 4.1, 4.2.3 5.1.5, 5.9.2 2.2.1 2.1.4, 4.2.3, 7.2.1 4.6.1, 5.1.5 2.1.4, 2.3.3, 4.3.1, 4.12.5, 6.1.2, 7.2.1 4.7.1 9.2.2, 9.2.3 1.4.3, 7.2.5 11 ribbon rmfield rng roots rose rot90 rotate rotate3d rref rsf2csf run Ss save scatter sec sech semilogx semilogy set setfield set_param shading shg shiftdim sign sim simple simplify simplot simset simulink sin sinh size skewness slice SliderStep solve sort sortrows sphere spinmap spline spring sprintf sqrt sqrtm squeeze sscanf 把二维曲线画成三维彩带图 4.10.2, 6.6.3 删去构架的域 3.4.2, 3.4.6 设置全局随机流 2.1.1, 2.1.2, 2.2.4, 2.3.1, 3.2.2, 3.3.4, 4.6.1 求多项式的根 4.7.1, 5.7.1 频数扇形图 4.6.2 矩阵旋转 90 度 2.1.4 绕指定的原点和方向旋转 6.3.3, 6.5.1 启动三维图形视角的交互设置功能 6.3.3 简化矩阵为梯形形式 4.5.1, 5.6.1 实块对角阵转为复值对角阵 4.4.1 全域寻优 4.12.5 把内存变量保存为文件 1.7.4, 散点图 6.6.4 正割 2.2.1 双曲正割 2.2.1 X 轴对数刻度坐标图 4.2.1 Y 轴对数刻度坐标图 7.2.1 设置图形对象属性 4.6.1, 4.10.3, 4.12.5, 6.1.3, 6.2.2, 6.2.3, 6.5.2, 6.8.2,7.7.2, 8.7.2, 9.2.3 设置构架数组的域 3.4.2, 3.4.6 设置对象参数值 8.7.1, 8.7.3, 8.8.3 色彩浓谈模式 5.8.1, 6.1.3, 6.3.2, 6.6.3, 8.7.5, 9.2.3 使当前图形窗位于前台 6.5.2, 8.7.5 数组维序号左移重组 2.3.2 根据符号取值函数 2.2.1 运行Simulink模型 8.7.2, 8.7.3, 8.7.4, 8.7.5, 8.8.1, 8.8.3 寻找最短形式的符号解 4.10.3, 5.2.2, 5.2.3, 5.3.2, 5.5.1, 5.7.2 符号计算中进行简化操作 5.2.2, 5.5.1 采用示波窗形式绘图 8.7.2 对SIMULINK模型的仿真参数进行设置 8.7.4, 8.7.5, 8.8.1 启动 SIMULINK 模块库浏览器 8.1.2 正弦 2.2.1 双曲正弦 2.2.1 矩阵的大小 2.1.3, 2.4.2, 5.1.3 统计斜度 4.6.3 立体切片图 6.4.3 图形对象滑键步长属性 9.2.2, 9.2.3 求代数方程的符号解 4.5.4, 4.9.4, 4.12.2, 5.1.1, 5.1.4, 5.6.2, 5.6.3 按升序或降序排列 2.1.4, 3.2.4 按升序派矩阵的行 2.1.4 产生球面 4.11.1, 6.3.5, 6.5.1 色图彩色的周期变化 6.5.1 样条插值 4.2.3, 4.9, 4.9.3 紫黄调春色图 6.3.2, 6.6.1 把格式数据写成串 3.2.3, 5.2.1 平方根 2.2.1, 平方根矩阵 4.4.2 删去大小为 1 的“孤维” 2.1.4, 2.3.2 按指定格式读串 3.2.3 12 stairs 阶梯图 6.2.3, 6.8.4 statset 设置 nlinfit 选项 4.8.3 std 标准差 4.6.3 stem 二维杆图 4.7.2, 4.9.3, 6.2.3 stem3 三维杆图 6.3.2 step 阶跃响应指令 6.6.3, 8.7.5, 9.2.3 str2double 把串数字变成双精度数 3.2.3, 5.2.1, 9.2.3 str2func 创建函数句柄 7.5.2 str2mat 创建多行串数组 3.2.2, 3.2.4, 5.2.1 str2num 串转换为数 3.2.3, 5.2.1 strcat 接成长串 3.2.2, 3.2.4 String 图形文字对象串内容 6.5.2, 7.7.2, 9.2.2, 9.2.3, 9.3.1, 9.3.2 strjust 串对齐 3.2.4 strmatch 串匹配搜索 3.2.4 strncmp 前 n 个字符比较 3.2.4 strrep 串替换 3.2.4 strtok 寻找第一间隔符前的内容 3.2.4 struct 创建构架数组 3.4.1, 3.4.4, 3.4.6 struct2cell 把构架转换为元胞数组 3.3.6, 3.4.6 structfun 函数对整个构架作用 3.4.5, 3.4.6, strvcat 创建多行串数组 3.2.4 Style 图形控件类型 9.3.1, 9.3.2 sub2ind 多下标转换为单下标 2.4.2 subexpr 通过子表达式重写符号对象 5.2.3, 5.7.2 subplot 创建子图 4.10.3, 6.1.2, 6.1.3, 6.2.2, 6.2.3, 6.6.4 subs 符号计算中的符号变量置换 4.10.2, 4.10.3, 4.12.2, 5.2.3, 5.3.1, 5.7.1 subspace 两子空间夹角 4.3.2 sum 元素和 2.2.3, 4.2.1, 4.2.3 summer 绿黄调夏色图 6.3.2, 6.5.1, 6.6.3 surf 三维着色表面图 4.12.4, 6.3.2, 6.8.3 surface 创建面对象 9.2.3 surfc 带等位线的表面图 6.3.5 svd 奇异值分解 4.3.2, 5.6.1 svds 求指定的若干奇异值 4.3.2 switch-case-otherwise 多分支结构 4.11.1, 7.2.3, 7.2.4, 7.4.1, 7.7.2, 9.2.3 sym 创建一个符号变量 5.1.1, 5.1.4, 5.2.1, 5.9.1 sym2poly 符号多项式生成数组多项式系数数组 5.7.1, 5.9.1 syms 创建多个符号对象 5.1.1, 5.1.4, 5.1.5 symsum 符号计算求级数和 5.3.2 symvar 认定符号表达式中变量 5.1.3 Tt Tag 图形对象识别名属性 tan 正切 tanh 双曲正切 taylor 符号法 Taylor 展开 text 文字注释 tf 创建传递函数对象 tic 启动计时器 Title 图形对象名属性 TitlePosition 图形对象名位置属性 9.2.2, 9.2.3, 9.2.4 2.2.1 2.2.1 5.3.1 6.1.3, 6.2.2, 6.5.2 6.6.3, 8.7.3, 8.7.5, 9.2.3 4.7.2, 7.2.1, 8.8.3 9.2.2 9.2.2 13 title toc toeplitz Toolbar trace trapz tril trim trimesh triplequad trisurf triu true try-catch type 图名 6.1.2, 6.2.2, 6.6.3, 7.7.2 关闭计时器 4.7.2, 7.2.1, 8.8.3 生成 Toeplitz 矩阵 2.2.3, 4.7.2 图形对象工具条属性 9.2.4 矩阵的迹 4.3.1 梯形法数值积分 4.2.3 下三角阵 2.2.3, 5.6.1 求系统平衡点 8.7.4, 8.7.5 不规则格点网线图 6.6.3 三重积分 4.2.3 不规则格点表面图 6.6.3 上三角阵 2.2.3, 5.6.1 逻辑真 2.5.3 控制流中的 Try-catch 结构 7.2.4 显示 M 文件 1.4.3 Uu uicontrol unifstat Units unwrap upper 创建用户控件 9.3.1, 9.3.2 均匀分布理论均值和方差 4.6.3 图形对象长度单位 9.2.2, 9.2.3, 9.2.3, 9.3.1 自然态相角 4.10 转换为大写字母 3.2.4 Vv Value var varargin varargout vectorize vertcat view Visible voronoi vpa 图形对象控件取值属性 9.2.2, 9.2.3, 9.3.1, 9.3.2 方差 4.6.3 变长度输入宗量 7.2.4, 7.7.2 变长度输出宗量 7.2.4, 7.7.2 使串表达式或内联函数适于数组运算 2.2.3, 5.9.1, 5.10.2, 7.6.3 垂直排放矩阵 2.1.4 三维图形的视角控制 6.1.3, 6.3.3, 6.4.3, 9.2.3 图形字对象可视性 9.3.1 Voronoi 多边形 6.6.3 任意精度(符号类)数值 4.12.2, 5.2.1 Ww warning which while white who whos winter 显示警告信息 确定函数、文件的位置 控制流中的 While 环结构 全白色图矩阵 列出内存中的变量名 列出内存中变量详细信息 蓝绿调冬色图 5.3.3, 5.10.2, 7.2.5 1.4.3, 2.4.2, 5.9.2 6.5.2, 7.2.1, 8.5.2 6.3.2 1.7.2,1.7.4 1.7.2, 5.1.3, 5.1.5 6.3.2 Xx,Yy,Zz Xdata xlabel xlim XlimMode xor 图形线对象 X 轴数据 X 轴名 X 轴范围 图形 X 轴对象范围属性 或非逻辑 6.5.2 6.1.3, 6.2.2 6.8.2 9.2.2, 9.2.3 2.5.2 14 Xtick XtickLabel YColor Ydata Ylabel ylabel YlimMode Ytick YtickLabel zeros Zdata zlabel ZlimMode zoom ztrans 图形 X 轴分度位置 图形 X 轴分度标识 图形 Y 轴对象色彩 图形线对象 Y 轴数据 图形对象 Y 轴名称 Y 轴名 图形 Y 轴对象范围属性 图形 Y 轴分度位置 图形 Y 轴分度标识 全零数组 图形线对象 Z 轴数据 Z 轴名 图形 Z 轴对象范围属性 图形的变焦放大和缩小 符号计算Z变换 6.2.2 6.2.2 7.7.2 6.5.2 7.7.2 6.1.3, 6.2.2, 6.6.3 9.2.2, 9.2.3 6.2.2 6.2.2 2.1.2 6.5.2 6.1.3, 6.2.2, 6.6.3 9.2.2, 9.2.3 4.5.4 5.5.3 C.3 SIMULINK 的库模块 Abs Action Port Add Algebraic Constraint Assignment Clock Compare To Constant Constant Demux Derivative Discrete-Time Integrator Discrete Transfer Fcn Display Enable Enable Subsystem Fcn For Iterator For Iterator Subsystem Gain Ground If If Action Subsystem In1 Integrator Level-2 M-file S-Function Math Function MATLAB Fcn Matrix Square Memory Merge 取绝对值模块 条件口 加法模块 代数约束模块 赋值模块 仿真时钟模块 与常数比较模块 恒值输出模块 分量模块 求导数模块 离散时间积分模块 离散传递函数模块 数值显示模块 使能模块 使能子系统 用户自定义函数 循环指数模块 For环子系统 增益模块 接地模块 条件转向模块 条件子系统 输入端口模块 连续函数积分 二级M码S函数模块 数学函数模块 M码任意函数 矩阵平方模块 记忆模块 信号合成模块 8.7.5 8.5.3 8.3.1, 8.3.2, 8.5.2, 8.5.3, 8.6.1, 8.6.2, 8.7.1 8.7.2 8.8.3 8.5.1 4.2.3, 8.6.1, 8.7.5 8.6.1 8.5.1, 8.5.2, 8.5.3, 8.6.1, 8.7.4, 8.9.3 8.2.1, 8.2.2 8.3.1 8.6.2 8.6.2, 8.7.1, 8.7.3 4.2.3, 8.5.1, 8.5.2, 8.6.1 8.4.1 8.4.1, 8.6.1 8.8.3 8.5.1 8.5.1 8.2.1, 8.3.1, 8.6.1, 8.7.1, 8.7.2, 8.8.1, 8.8.3 8.2.2, 8.4.2 8.5.3 8.5.3 8.3.1, 8.4.1, 8.4.2, 8.5.1, 8.5.2, 8.7.3 4.2.3, 8.2.1, 8.3.1, 8.7.2, 8.7.4, 8.7.5, 8.8.1 8.8.3 8.9.3 8.5.3, 8.7.4 4.2.3, 8.5.1 8.5.1 8.5.2 8.5.3 15 Mux Out1 Product Pulse Generator Random Source Relation Operator Scope Signal Builder Sine Wave SMD Sqrt State-Space Step Stop SubSystem Subtract Sum To Workspace Transfer Fcn Trigger Trigged Subsystem Unit Delay Variable Selector While Iterator While While Iterator Subsystem XY Graph Zero-Order Hold 合路模块 输出端口模块 乘法器 脉冲发生模块 随机信号模块 关系运算模块 示波模块 信号构建器 正弦波输出 由符号表达式生成的 Simulink模块 平方根模块 状态方程模块 阶跃输出 终止仿真 子系统模块 减法模块 求和模块 数据存入内存变量 传递函数模块 触发模块 触发子系统 单位延迟模块 变量选择模块 条件模块 While环子系统 显示X-Y图形 零阶保持模块 8.4.1, 8.4.2, 8.6.2, 8.7.1, 8.9.3 8.3.1, 8.4.1, 8.4.2, 8.5.1, 8.5.2, 8.7.2, 8.7.3 8.7.5 8.5.3, 8.7.5 8.9.3 8.4.2 8.5.2 8.2.1, 8.2.2, 8.2.3, 8.3.1, 8.3.2, 8.4.1, 8.5.3 8.6.1, 8.6.2, 8.7.1, 8.8.1, 8.8, 8.9.3 8.4.1 8.4.1, 8.4.2, 8.6.2 5.9.3 8.5.1 8.2.2 8.2.3, 8.3.1, 8.3.2, 8.6.2, 8.7.1, 8.7.2, 8.7.5 8.8.3 8.6.1 8.3.1, 8.3.2 8.2.3 8.2.1, 8.7.3, 8.7.4, 8.8.1, 8.8.3 4.2.3, 8.4.2 8.2.3, 8.6.2, 8.7.1, 8.7.2, 8.7.3, 8.7.5 8.4.2 8.4.2 8.6.1, 8.7.3, 8.8.3 8.5.1 8.5.2 8.5.2 8.7.4 8.6.2 16 参考文献 [1] MathWorks, MATLAB R2011a, 2011. [2] C. Moler, Nemurical Computing with MATLAB, http://www.mathworks.com/moler / , 2011. [3] M. Majewski, MuPAD Pro Computing Essentials, 2/e, Springer, 2004. [4] R.C. Dorf, R.H. Bishop, Modern Control Systems, 11/e, Pearson Education Inc., 2008. [5] G.F. Franklin, etc, Feedback Control of Dynamic Systems, 6/e, Prentice-Hall, Inc., 2009. [6] J.G. Proakis, etc, Algorithms for Statistical Signal Processing, Prentice-Hall, Inc., 2002. [7] 张志涌,精通 MATLAB6.5,北京航空航天大学出版社,2003。 [8] 张志涌,杨祖樱,MATLAB 教程 R2010a, 北京航空航天大学出版社,2010。

Top_arrow
回到顶部
EEWORLD下载中心所有资源均来自网友分享,如有侵权,请发送举报邮件到客服邮箱bbs_service@eeworld.com.cn 或通过站内短信息或QQ:273568022联系管理员 高进,我们会尽快处理。