matlab出错:Thecss expressionn to the left of the equals sign is not a valid target for an assignment.

5615人阅读
Matlab(6)
3.8& MATLAB程序的调试和优化
在MATLAB的程序调试过程中,不仅要求程序能够满足设计者的设计需求,而且还要求程序调试能够优化程序的性能,这样使得程序调试有时比程序设计更为复杂。MATLAB提供了强大的程序调试功能,合理的运用MATLAB提供的程序调试工具尤其重要。本节从MATLAB程序调试的方法和过程开始介绍,先让用户懂得合理运用MATLAB的程序调试功能,再总结MATLAB程序优化的方法,从而达到实现提高程序性能的目的。
3.8.1& MATLAB程序调试方法和过程(1)
MATLAB是一种解释和执行同时进行的语言,这使得程序的调试变得相对便利,尤其是MATLAB具有良好的所见即所得特性。在MATLAB程序调试过程中,可运用的除了一系列调试函数外,MATLAB还提供了专门的调试器,即M文件编译器,通过该M文件编译器和调试函数的共同使用,用户能够完成大部分的程序调试工作。
1.调试的基本任务
程序调试(Debug)的基本任务就是要找到并去除程序中的错误。程序的错误大致可以分为如下三类。
语法错误:由于程序员疏忽、输入不正确等原因而造成的代码违背程序语言规则的错误。
运行错误:由于对所求解问题的理解差异,导致程序流程出错或对程序本身的特性认识有误而造成的程序执行结果错误的情况。
异常:程序执行过程中由于不满足条件而造成的程序执行错误。
语法错误是初学者最常犯的错误,例如,变量或函数名拼写错误、缺少引号或括号等。这类错误对于熟练掌握MATLAB的用户来说很容易避免,并且当MATLAB运行发现这些错误时会立即标识出这些错误,并向用户说明错误的类型以及在M文件中的位置,下面用一个例子来说明,在debug.m文件中输入如下内容:
1 1 A=[1 2 3,4 5 6,7 8 9];
%定义矩阵A
2 2 B=[1 2 3 4,5 6 7 8,9 10 11 12,13 14 15 16];
%定义矩阵B
%C为矩阵A和B相乘
运行时则会出现如下错误:
???&Error&using&==Inner&matrix&dimensions&must&agree. &
在上述矩阵四则运算的例子中,矩阵A和矩阵B的维数不满足运算前置条件,即两个矩阵的维数不同不能进行运算。
运行错误也能够被MATLAB发现,但是用户却不知道错误到底发生在何处,也就不能通过查询函数工作区域的方法来查询错误来源,更多时候是MATLAB无法发现运行错误,但是运行结果在验证时出错。这类错误的处理方法多是依靠编程经验解决,下面就求解方程组的例子来进行说明,在命令窗口中输入以下指令:
运行结果为:
x&= &&&&&-2.6667&&&&&&&&&0&&&&1.6667 &&&&&-2.1667&&&&&&&&&0&&&&1.1667 &&&&&-1.6667&&&&&&&&&0&&&&0.6667 &
该结果在不同计算机的不同版本的MATLAB下可能不完全相同。为了验证这个结果,在命令窗口中输入如下命令:
运算结果为:
ans&= &&&&&74.4236 &
显然x不是A*x=B的解。
说明这就是一个简单的运行错误,MATLAB同样有运行结果,但是进行验证时结果却不正确。原因是在求解A*x=B方程的解时,应该不能用B右除A,而应该是左除,例如,在MATLAB命令窗口输入如下命令:
运行结果为:
x&= &&&&&-27&&&-26&&&-17 &&&&&&42&&&&41&&&&24 &&&&&-16&&&-16&&&&-8 &
验证结果为:
ans&= &&&&&&&0&&&&&0&&&&&0 &&&&&&&0&&&&&0&&&&&0 &&&&&&&0&&&&&0&&&&&0 &ans&= &&&&&&&0&
运行错误通常很难发现,用户在分析问题时要做到非常细心,并且有时需要做必要的验证。
异常的错误往往出现在规模较大的MATLAB程序中,并且涉及多个函数的调研以及数据的调用,异常的种类也很多,例如,被调用的文件不存在、数据传输路径错误、异常的数据输入等。
3.8.1& MATLAB程序调试方法和过程(2)
2.调试工具
MATLAB提供了大量的调试函数供用户使用,这些函数可以通过help指令获得,在MATLAB命令执行窗口输入如下指令:
用户便可获得这些函数,这些函数都有一个特点,就是以&db&开头,具体功能和作用如下:
dbstop&&&&&-&Set&breakpoint&&&&&&&&&&&&&&&&&&&&&&&&&&&&&%设置断点 &&&&&dbclear&&&&-&Remove&breakpoint&&&&&&&&&&&&&&&&&&%清除断点 &&&&&&&&&dbcont&&&&&-&Resume&execution&&&&&&&&&&&&&&&&&&&&&&&%重新执行 &&&&&&&&&dbdown&&&&-&Change&local&workspace&context&&&&&&%下移本地工作空间内容 &&&&&&&&&dbmex&&&&&-&Enable&MEX-file&debugging&&&&&&&&&&&&&&&%使MEX文件调试有效 &&&&&&&&&dbstack&&&&-&List&who&called&whom&&&&&&&&&&&&&&&&&&&%列出函数调用关系 &&&&&&&&&dbstatus&&&&-&List&all&breakpoints&&&&&&&&&&&&&&&&&&%列出所有断点 &&&&&&&&&dbstep&&&&&-&Execute&one&or&more&lines&&&&&&&&&&&&&&%单步或多步执行 &&&&&&&&&dbtype&&&&&-&List&M-file&with&line&numbers&&&&&&&&&&%列出M文件 &&&&&&&&&dbup&&&&&&-&Change&local&workspace&context&&&&&&&&&&%上移本地工作空间内容 &&&&&&&&&dbquit&&&&&-&Quit&debug&mode&&&&&&&&&&&&&&&&&&&&&&&&%退出调试模式 &
在MATLAB中,这些调试函数都有相应的图形化调试工具,使得程序的调试更加方便、快捷。这些图形化调试工具在MATLAB编译器的&debug&和&Breakpoints&菜单中,以方便调试使用。
3.调试方法
对于简单的MATLAB程序中出现的语法错误,可以采用直接调试法,即直接运行该M文件,MATLAB将直接找出语法错误的类型和出现的地方,根据MATLAB的反馈信息对语法错误进行修改。
当M文件很大或M文件中含有复杂的嵌套时,则需要使用MATLAB调试器来对程序进行调试,即使用MATLAB提供的大量调试函数以及与之相对应的图形化工具。
下面通过一个判断2000年至2010年间的闰年年份的示例来介绍MATLAB调试器的使用方法。
(1)创建一个leapyear.m的M函数文件,并输入如下函数代码程序。
%程序为判断2000年至2010年10年间的闰年年份 &%本程序没有输入/输出变量 &%函数的使用格式为leapyear,输出结果为2000年至2010年10年间的闰年年份 &function&leapyear&&&&&&&&&&&&&&&&&&&%定义函数leapyear &for&year=&&&&&&&&&&&&&&%定义循环区间& &&&sign=1; &&&a&=&rem(year,100);&&&&&&&&&&&&%求year除以100后的剩余数 &&&b&=&rem(year,4);&&&&&&&&&&&&&&&&&&%求year除以4后的剩余数 &&&c&=&rem(year,400);&&&&&&&&&&&&&&&&%求year除以400后的剩余数 &if&a&=0&&&&&&&&&&&&&&&&&&&&&&&&&&&&&%以下根据a、b、c是否为0对标志变量sign进行处理 &&&&signsign=sign-1; &end &if&b=0&&&&signsign=sign+1; &end &if&c=0&&&signsign=sign+1; &end &if&sign=1&&&fprintf('%4d&\n',year) &end &end &
(2)运行以上M程序,此时MATLAB命令窗口会给出如下错误提示:
???&Error:&File:&leapyear.m&Line:&10&Column:&6 &The&expression&to&the&left&of&the&equals&sign&is&not&a&valid&target&for&an&assignment. &
由错误提示可知,在程序的第10行存在语法错误,检测可知if选择判断语句中,用户将&==&写成了&=&。因此将&=&改成&==&,同时也更改第13、16、19行中的&=&为&==&。
3.8.1& MATLAB程序调试方法和过程(3)
(3)程序修改并保存完成后,可直接运行修正后的程序,程序运行结果为:
2001& &2002& &2003& &2005& &2006& &2007& &2009& &2010 &
显然,2001年至2010年间不可能每年都是闰年,由此判断程序存在运行错误。
(4)分析原因。可能由于在处理年号是否是100的倍数时,变量sign存在逻辑错误。
(5)断点设置。断点为MATLAB程序执行时人为设置的中断点,程序运行至断点时便自动停止运行,等待用户的下一步操作。设置断点只需要用鼠标单击程序左侧的& &使得& &变成红色的圆点(当存在语法错误时圆点颜色为灰色),如图3.2所示。应该在可能存在逻辑错误或需要显示相关代码执行数据附近设置断点,例如,本例中的12、15和18行。如果用户需要去除断点,可以再次单击红色圆点去除,也可以单击工具栏中的 工具去除所有断点。
(6)运行程序。按&F5&键或单击工具栏中的 按钮执行程序,这时其他调试按钮将被激活。程序运行至第一个断点暂停,在断点右侧则出现向右指向的绿色箭头,如图3.3所示。
图3.2& 断点标记
图3.3& 程序运行至断点处暂停
程序调试运行时,在MATLAB的命令窗口中将显示如下内容:
此时可以输入一些调试指令,更加方便对程序调试的相关中间变量进行查看。
(7)单步调试。可以通过按&F10&键或单击工具栏中相应的单步执行图形按钮,此时程序将一步一步按照用户需求向下执行,如图3.4所示。
(8)查看中间变量。可以将鼠标停留在某个变量上,MATLAB将会自动显示该变量的当前值,也可以在MATLAB的workspace中直接查看所有中间变量的当前值,如图3.5所示。
图3.4& 程序单步执行
图3.5& 中间变量查看
3.8.1& MATLAB程序调试方法和过程(4)
(9)修正代码。通过查看中间变量可知,在任何情况下sign的值都是1,此时调整修改代码程序如下所示。
%程序为判断2000年至2010年10年间的闰年年份 &%本程序没有输入/输出变量 &%函数的使用格式为leapyear,输出结果为2000年至2010年10年间的闰年年份 &function&leapyear &for&year= &&&&sign=0; &&&&a&=&rem(year,400); &&&&b&=&rem(year,4); &&&&c&=&rem(year,100); &if&a&==0 &&&&&signsign=sign+1; &end &if&b==0 &&&&&signsign=sign+1; &end &if&c==0 &&&&signsign=sign-1; &end &if&sign==1 &&&&fprintf('%4d&\n',year) &end &end &
按&F5&键再次执行程序,得到的运行结果如下:
2000& &2004& &
链接:/realkate1/p/5302089.html
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:53332次
排名:千里之外
原创:27篇
转载:27篇
(8)(5)(1)(1)(1)(11)(1)(1)(5)(3)(1)(3)(13)
(window.slotbydup = window.slotbydup || []).push({
id: '4740887',
container: s,
size: '250,250',
display: 'inlay-fix'(window.slotbydup = window.slotbydup || []).push({
id: '4540180',
container: s,
size: '250,200',
display: 'inlay-fix'
热门资料排行
添加成功至
资料评价:
所需积分:0随时随地,快速访问
只要手机在手,您都可以快速、方便地看贴发帖,与论坛好友收发短消息。
极致优化,畅快"悦"读
独有的论坛界面和触屏设计,手机论坛也变得赏心悦目,操作自如。
即拍即发,分享生活
不管是风景图画,还是新闻现场,拍照发帖一气呵成,让您在论坛出尽风头。
下载客户端后,拍摄二维码快速访问本站:
或者通过以下地址访问:
MATLAB中文论坛是全球最大的 MATLAB & Simulink 中文社区。用户免费注册会员后,即可下载代码,讨论问题,请教资深用户及结识书籍作者。立即注册加入我们吧!
MATLAB官方社交平台
MATLAB中文论坛微社区扫二维码下载作业帮
拍照搜题,秒出答案,一键查看所有搜题记录
下载作业帮安装包
扫二维码下载作业帮
拍照搜题,秒出答案,一键查看所有搜题记录
关于matlab,调试的时候出现Error:The expression to the left of the equals sign is not a valid……please input test score:a=input('please input test score,0 means out:')while =0switch =0case a>100|a=90disp('the grade is ''A''')case a>=80disp('the grade is ''B''')case a>=70disp('the grade is ''C''')case a>=60disp('the grade is ''D''')otherwisedisp('the grade is ''E''')enda=input('please input test score:')end调试的时候出现Error:The expression to the left of the equals sign is not a valid target for an assignment.
扫二维码下载作业帮
拍照搜题,秒出答案,一键查看所有搜题记录
%please input test score:% 这句是注释a=input('please input test score,0 means out:')while =0switch =0case a>100|a=90disp('the grade is ''A''')case a>=80disp('the grade is ''B''')case a>=70disp('the gr...
为您推荐:
其他类似问题
扫描下载二维码当前位置: >>
Matlab揭秘
MATLAB?揭秘David McMahon 著 郑碧波 译New York MadridChicago San Francisco Lisbon London Mexico City Milan New Delhi San Juan Seoul Singapore Sydney Toronto 译言经过将近 2 个半月的时间(公元
至 ) ,终于把本书翻译完成。很高 兴。^_^ 翻译本书纯粹是兴趣,完全没有任何的经济目的!请相信我,到目前为止,我没有因为 翻译本书或发布本书而收到一分钱! 到目前为止,我翻译过两本 MATLAB 方面的书,第一本为 S.J.Chapman 的《MATLAB 编程》 (第二版) ,第二本为 David McMahon 的《MATLAB 揭秘》 。翻译书籍是一件非常枯 燥无聊的事情,需要极大的耐心,特别是像我这样完全没有任何的经济利益的翻译(不信可 以试试,如果试了,请一定要坚持到底,否则就是夭折! )――它的确考验了我的积极性和 耐心!现在看来我还是经得起考验的。^_^ 在翻译本书的过程中,曾经想过继续翻译更多的 MATLAB 方面的书籍,后来还是回到 现实――我不是一个不用吃饭就能干活的人, 我每天得为生活而奔波。 在我发布这本书翻译 版本之后,我得重新找工作(2008 年 7 月,现在工作难找呀)――目前我已经选好方向: 单片机方面具有软硬件相结合的领域。 如果你学习MATLAB仅是为了了解一下,我建议你阅读我翻译的《MATLAB编程》一 中文版修正版” 就是了) 如果你学习MATLAB , 书 (网上搜索 “S.J.Chapman 《MATLAB编程》 是想进行科学计算,那我建议你阅读我翻译的《MATLAB揭秘》一书(本书) ,本书介绍了 统计、绘图、求微积分、解微分方程、解ODE、变换、曲线拟合、特殊函数……很多的高 数方面的应用,还附有习题和答案。 我是一个 MATLAB 初学者, 我知道并不比你多, 所以, 请最好不要向我问有关 MATLAB 如何使用的问题,我极有可能不懂,也不一定会回复你的信(请原谅) 。但如果你发现本书 有翻译错误及其它一些问题或建议,则请写信给我,你的一封信、几句话很有可能使很多 MATLAB 初学者受益匪浅,谢谢! 如果本书对你有所帮助,那是我最大的心愿! 郑碧波()
于广东省普宁市I Mc Graw Hill的介绍MATLAB Demystified By McMahon, David 需要学习 MATLAB?问题即刻解决! 在这本实用的指导书帮助下你立即就可使用 MATLAB 了。 《MATLAB 揭秘》为学习这种功能强大的数学计算工具提供了 高效的、启发性的方法。 本书使用简单易行的风格,一开始介绍了 MATLAB 基础, 你将学习到如何绘制图象, 求解代数方程及计算积分, 也将学 习到如何求解微分方程, ODE 的数值解, 求 使用特殊函数工作。 本书含有几百个例子及其详细解说过程, 章末带有习题, 书末 还带最终测试题目,一句话,本书给予你的是 MATLAB 精华。 本自学指导书提供了: 上手 MATLAB 的最快方法 几百个带有解答过程的工作实例 覆盖了 MATLAB7 每章章末配有习题,提高学习质量,查漏补缺。 书末附有最终测试题 为学习和工作节省时间提高效率 《MATLAB 揭秘》对初学者很容易,对高手有挑战性,是通往计算精度的捷径。 作者传记 David McMahon 是 Microsoft 认证的 Visual Basic 开发人员, 他使用 Visual Basic 和 Visual C++为 Windows NT 和 95/98 编写面向对象的软件和硬件驱动程序,他同时也是一个 Visual Basic 和 Microsoft Access 的微软认证讲师。II 关于作者David McMahon 博士是 Sandia 国家实验室的一位物理学家和研究者,是《线性代数揭 、 、 、 、 等书的 秘》《量子力学揭秘》《相对论揭秘》《信号与系统揭秘》《静力学与动力学揭秘》 作者。III 目录译言........................................................................................................................................... I Mc Graw Hill的介绍 ............................................................................................................... II 关于作者.................................................................................................................................III 目录.........................................................................................................................................IV 前言....................................................................................................................................... VII 致谢......................................................................................................................................VIII第一章MATLAB环境.................................. 1用户界面概述...................................................................................................................2 命令窗口与算法基础.......................................................................................................2 赋值运算符.......................................................................................................................4 基本数学定义式...............................................................................................................7 复数...................................................................................................................................8 修正输入...........................................................................................................................9 文件基础...........................................................................................................................9 结束MATLAB ................................................................................................................10 习题.................................................................................................................................10第二章向量与矩阵................................. 11向量.................................................................................................................................12 从已存变量创建大向量.................................................................................................13 创建等差元素向量.........................................................................................................14 特征化向量(Characterizing a Vector) .......................................................................15 向量的点乘和叉乘(数量积和向量积).....................................................................18 引用向量元素.................................................................................................................19 矩阵基本操作.................................................................................................................19 矩阵相乘.........................................................................................................................21 更多基本操作.................................................................................................................22 特殊类型矩阵.................................................................................................................23 引用矩阵元素.................................................................................................................23 行列式与线性系统求解.................................................................................................24 求矩阵的秩.....................................................................................................................25 求逆矩阵与伪逆矩阵.....................................................................................................27 简化梯形矩阵.................................................................................................................30 矩阵分解.........................................................................................................................32 习题.................................................................................................................................33第三章绘图与图形................................. 342D绘图基础....................................................................................................................35 更多 2D绘图选项...........................................................................................................38 坐标轴命令.....................................................................................................................40 在同一图象中显示多个函数.........................................................................................41 添加图例.........................................................................................................................43IV 设置颜色.........................................................................................................................44 设置坐标比例.................................................................................................................45 子图.................................................................................................................................48 图象重叠和linspace命令 ...............................................................................................51 极坐标和对数图象.........................................................................................................53 离散数据绘图.................................................................................................................57 等高线图.........................................................................................................................61 三维图象.........................................................................................................................66 习题.................................................................................................................................70第四章统计和MATLAB编程介绍....................... 71创建柱状图.....................................................................................................................72 基本统计.........................................................................................................................76 编写MATLAB函数 ........................................................................................................77 使用for循环编程 ............................................................................................................80 计算标准偏差和中位数.................................................................................................80 更多编程要点.................................................................................................................84 习题.................................................................................................................................87第五章代数方程求解和其它符号工具 ................. 88解基本代数方程.............................................................................................................89 二次方程求解.................................................................................................................90 符号方程绘图.................................................................................................................91 高次方程求解.................................................................................................................96 方程组.............................................................................................................................98 方程展开与合并.............................................................................................................99 使用指数和对数函数求解方程...................................................................................101 函数的级数表示...........................................................................................................103 习题...............................................................................................................................105第六章基本符号演算和微分方程 .................... 107极限计算.......................................................................................................................108 导数计算.......................................................................................................................113 dsolve命令 ....................................................................................................................118 常微分方程(ODE)求解................................................................................................119 方程组和相平面图.......................................................................................................125 习题...............................................................................................................................132第七章ODE的数值解............................... 133使用ODE23 和ODE45 求解一阶方程 ........................................................................134 二阶方程求解...............................................................................................................140 习题...............................................................................................................................147第八章积分...................................... 148INT命令 ........................................................................................................................149 定积分...........................................................................................................................151 多重积分.......................................................................................................................156 数值积分.......................................................................................................................157 正交积分.......................................................................................................................161 习题...............................................................................................................................162第九章变换...................................... 163拉普拉斯变换...............................................................................................................164 拉普拉斯逆变换...........................................................................................................165 微分方程求解...............................................................................................................169 傅立叶变换的计算.......................................................................................................172 傅立叶逆变换...............................................................................................................175 快速傅立叶变换...........................................................................................................175 习题...............................................................................................................................178第十章曲线拟合.................................. 180线性函数拟合...............................................................................................................181 指数函数的拟合...........................................................................................................191 习题...............................................................................................................................191第十一章使用特殊函数工作........................ 193Γ(伽马)函数..................................................................................................................194 MATLAB中的伽马函数 ..............................................................................................194 与伽马函数相关的数...................................................................................................197 贝塞耳函数...................................................................................................................198 贝塔函数.......................................................................................................................204 特殊积分.......................................................................................................................205 勒让德函数...................................................................................................................208 亚里函数.......................................................................................................................210 习题...............................................................................................................................212附录A最终测试................................... 213 附录B习题及测试答案............................. 220第一章:MATLAB环境 ..............................................................................................221 第二章:向量与矩阵...................................................................................................221 第三章:绘图与图形...................................................................................................221 第四章:统计和MATLAB编程介绍 ..........................................................................222 第五章:代数方程求解和其它符号工具...................................................................223 第六章:基本符号演算和微分方程...........................................................................223 第七章:ODE的数值解...............................................................................................223 第八章:积分...............................................................................................................227 第九章:变换...............................................................................................................227 第十章:曲线拟合.......................................................................................................227 第十一章:使用特殊函数工作...................................................................................227 最终测试.......................................................................................................................229 前言MATLAB 是科学与工程上其中一个非常广泛使用的计算工具,不管你的背景是什么― ―物理、化学、数学还是工程学――它都能适宜你。学习一款数学计算工具有三个好处:第 一,如果你是手工完成计算的,那么它就像一个后台检查工具。假如你是学生,有一个工具 可以检查你的答案总是好的。 我并不是说你要过份依赖某种计算工具, 好像它就是神谕一样。 如果你的教授要求你手工完成工作,之后你就可以使用 MATLAB 或其它计算工具来检验你 的工作是否正确。 第二个原因是用像 MATLAB 这样一个工具来绘图和进行数学运算是非常有价值,你不 用花费很多时间来手工绘图,MATLAB 就可以帮你产生你的需要的非常漂亮的图形。 第三个原因是在某种程度上你的职业要求你使用数学计算工具。 如果你是一个做理论研 究的教授,有时候你所做的工程用分析解法行不通,如果你在工业或实验室工作,可能会碰 到有些工作无法用手工完成而要求或数学解法。MATLAB 在大学、实验室或公司中广泛应 用。懂得 MATLAB 将使你的简历加上重要的一项。 一句话,本书是直接针对于 MATLAB 初学者,目的也不是教专家使用 MATLAB 去解 决复杂问题,相反,本书是介绍给 MATLAB 新人,使他们进入数学计算世界。这里要介绍 的是使用 MATLAB 去解决某些基本问题――绘函数的图形、解代数方程、计算积分和解微 分方程,所以要本书的例子较简单,针对新手。如果你以前从没接触过 MATLAB,或者是 在使用 MATLAB 有很多疑问,那么本书将帮助你学得一些基本技巧,使用它们你将能够掌 握 MATLAB。本书仅是掌握 MATLAB 的垫脚石。VII 致谢感谢 Rayjan Wilson 对本书给了全面细心的审阅,他深刻见解的评论和详细审阅对本书 的成功出版至关重要。VIII 第一章MATLAB 环境我们从着眼于 MATLAB 的用户界面开始我们的 MATLAB 之旅。在我们干劲十足地解 决数学问题之前,会先学习如何输入命令,创建文件及其它平常的必须知道的任务。本章所 讨论到的内容会在整本书中用到,也会贯穿你以后使用 MATLAB 的过程。在本书中会涉及 到开始使用 MATLAB 的一些基础知识,我们的目的是在每一章告诉你一些基本知识,你可 以使用这些知识解决一些重要问题。读完本书后,你还不会成为 MATLAB 专家,但能够自 由地使用 MATLAB 并且完成不少常见任务,在学习上取得进步或在工作上为进一步学习打 下基础。无论如何,我们都得来看看 MATLAB 启动后的主界面。 2用户界面概述本书我们假定你使用 Windows――虽然对本书的大部分内容并没有什么影响。 请注意我 们使用的是 MATLAB 7.1 版本。 MATLAB 的启动与其它 Windows 程序一样,点击开始-程序,找到 MATLAB 文件夹, 点击它就会看几项――取决于你的安装,但至少有如下几项 MATLAB (版本号) M?le editor Uninstaller 选择 MATLAB(7.1)启动程序,屏幕上显示的 MATLAB 默认上面如图 1.1 所示,可以看 到,屏幕被划分成三个元素,它们是 当前目录(Current Directory) 历史命令窗口(Command History) 命令窗口(Command Window)图 1.1 MATLAB 桌面 MATLAB 桌面顶部的标准菜单允许你做管理文件和调试文件等工作,你可能已经注意 到右边有一个下拉列表框,它可以选择设置当前工作路径,不过这里最重要的是命令窗口。命令窗口与算法基础命令窗口位于 MATLAB 桌面的右边,命令在双大于号“&&”提示符后面输入 && 这里我们开始输入一些实际的基本命令。 如果你想知道一些数字表述式的值, 简单的输 入就可以了。假设我们想知道 433.12 乘以 15.7 的结果,在提示符后面输入 433.12 * 15.7 然 后按 Enter 回车,结果如下: && 433.12*15.7 ans = 6. 3MATLAB 方便地输出答案,并命名为 ans――这是一个变量(符号) ,可以用来表示值。 如果我们想要使用自己定义的变量名,例如叫变量 x,假设我们想要让它等于 5 乘以 6,则 输入如下: && x=5*6 x = 30 一旦变量输入系统,我们就可以在以后引用它,假设我们要计算 x 乘以 3.56 的值,并 把它赋给 y。输入 && y = x * 3.56 y = 106.8000 现在,你可能已经注意到在这个例子中,我们在方程每项之间都留有空格,这样提高了 我们输出的可读性, 看起来更专业些。 MATLAB 并不要求这些空格, 我们也可以输入 y = x * 3.56 或者 y = x * 3.56;不过后者更清楚更容易。当你的表达式比较复杂时,带上空格就变得 非常重要了。提倡这么做! 我们总结一下 MATLAB 输入基本算法。要写两数相乘 ab,在 MATLAB 中我们输入 a * b a 两数相除 b ,输入为 a / b b 这种除法被称为右除,MATLAB 也允许另一种写法,叫左除。如果我们要计算 a ,我 们可以使用反斜杠代替斜杠,表示反过来除,表达式如下: a \ b 幂ab 以下面的形式输入 a ^ b 最后,相加和相减以普通形式输入即可 a + b a C b MATLAB 运算符的优先级与数学中优先级一致,不过要注意左除与右除的情况:幂运 算优先于乘和除,右除优先于左除,加和减的优先级最低,如果想改变优先级,用圆括号括 起来。例 1-1使用 MATLAB 计算 9 3 5×?4? + 5 ? ? 9 3 和 43×?4 + 2×3???解 1-1第一个表达式的命令为 && 5*(3/4) + 9/5 ans = 5.5500 对于第二个表达式,我们必须用括号把 a ^ b 括起来。虽然是简单表达式,我们采用变 量分部输入,得到 && r = 4^3 r = 64 && s = 3/4 + 9/(2*3) 4s = 2.2500 && t=r*s t = 144赋值运算符符号“=”称为赋值运算符,一直以来,它都这样存在着,即是,在 MATLAB 中描述 一个方程, 计算机程序中有时候把它理解为把值赋给一个变量的指令更为恰当一些。 这种理 解的差异可以用下面方式显示出来。如果你输入 && x + 6 = 90 在 MATLAB,你会得到下面的回应 ??? x + 6 = 90 | Error: The expression to the left of the equals sign is not a valid target for an assignment. 可见,在纸上写的完全正确的代数表达式 MATLAB 会完全不知道如何处理。不过,如 果你把 90-6 赋给变量 x,MATLAB 会高兴完成,写成 x = 90 C 6 赋值运算符在计算机程序中处理起来更像是赋值的另一个例子是递归赋值给变量,例 如,如果变理已经定义,MATLAB 允许你写成 x = x + 4 下面的语句是完全正确的 && x = 34^2 x = 1156 && x = x + 4 x = 1160 在赋值运算符右边使用变量,必须事先给变量赋值,因此,下面的表达式会产生错误 && x = 2 x = 2 && t = x + a ??? Undefined function or variable 'a'. 下面的表达式则不会产生错误 && x = 2 x = 2 5&& a = 3.5 a = 3.5000 && t = x + a t = 5.5000 在很多时候,我们并不需要 MATLAB 输出结果。要这样做,只需要在表达式后面加上 分号(;) ,在下面的命令中,开始我们输入 x = 3, MATLAB 及时地报告结果,第二次我们 输入 x = 3; ,MATLAB 就没有再花费空间输出结果,而是直接跳到命令提示符,等待下次 输入。 && x = 3 x = 3 && x = 3; && 我们还可以在一行中包含多个表达式。例如,下面的表达式是合法的。 && x = 2; y = 4; z = x*y z = 8 注意那两个分号,它们告诉 MATLAB 我们不想看到 x 和 y 的值。 当做许多计算时,结果可能会产生大量变量,可以通过在命令窗口中输入 who 来刷新 内存,告诉 MATLAB 显示到目前为止所有变量名称。例如,在我们的例子中,我们得到 && who Your variables are: V a ans r s t x y z如果输入 whos,我们会得到更多信息,告诉我们当前内存中的变量,类型,每个变量 所分配的内存空间,以及它们是否是复数(见下面) 。在我们的例子中我们有 && whos Name V a ans r s t x y z Size 1x1 1x1 1x1 1x1 1x1 1x1 1x1 1x1 1x1 Bytes 8 8 16 8 8 8 8 8 8 Class double double double double double double double double double array array array (complex) array array array array array arrayGrand total is 9 elements using 80 bytes 现在假设我们要全部重新开始,要这样做,我们输入 clear 命令。要清除全部变量只需 输入 clear 然后回车即可,要清除特定变量,则在 clear 后面带上变量名列表。如果我们要清 除使用过的变量 x、y 和 z,我们输入 6&& clear x y z && 此时 MATLAB 返回命令提示符,没有给出任何提示。但如果你想再使用这些变量而没 有再赋值,它们就好像没有存在过一样。 较长的表达式可以在行尾加上三点(...)省略号进行续行输入。例如 && FirstClassHolders = 72; && Coach = 121; && Crew = 8; && TotalPeopleOnPlane = FirstClassHolders + Coach... + Crew TotalPeopleOnPlane = 201 Coach 后面带省略号的那行定义了变量 TotalPeopleOnPlane,当你输入省略号后回车, MATLAB 会把光标移到下一行等待用户更进一步的输入。 好了,到这里你可能会像我开始 MATLAB 时一样,想知道如何控制 MATLAB 在屏幕 上显示的数字。目前我们的例子中,MATLAB 输出小数点后四位,这在 MATLAB 中称为 short 格式,是 MATLAB 的默认格式。如果这个精度已经满足你的要求,那么就没有必须改 变它。如果要更多位数,就必须用格式命令告诉 MATLAB 在小数点后输出更多位。如果要 用 16 位代替 4 位,输入 format long。想知道如何工作,看看下面用两种格式显示的计算例 子。 && format long && x = 3 + 11/16 + 2^1.2 x = 5.07 && format short && x = 3 + 11/16 + 2^1.2 x = 5.9849 比较 long 和 short 格式,注意 short 格式在第四位四舍五入进位到 9。如果要进行财务 计算,你可以使用 format bank 格式命令。正如所预计,所有数字被取到小数点后两位。 && format bank && hourly = 35.55 hourly = 35.55 && weekly = hourly * 40 weekly = 1422.00 MATLAB 使用指数形式显示大数字,即是把 5. 表示成 5.4387e + 003。你也可 以让所有的数字都以这种风格显示。 这种风格也可以使用 short 或 long 格式来定义, 对于 short (小数点后四位)输入 format short e。要使小数点后 15 位加上指数,输入 format long e,这 里我们用短指数格式举例 && format short e && 7.2*3.1 7ans = 2. 如果我们输入 format rat,MATLAB 将自动查找最接近结果的比例式,是不是相当有意 思?下面我们重复前一个计算 && format rat && 7.2*3.1 ans = 558/25基本数学定义式MATLAB 附带了许多基本的或者是常见的数学量和函数,我们用例子来演示 例 1-2 计算半径为 2m 的球的体积 解 1-2 球体的体积由下式决定 4 V = 3πR3 MATLAB 当然预定义了 π,要使用的话只需输入 pi。在定义了表示半径的变量之后, 我们就可以输入下面的表达式得到体积 && r = 2; && V = (4/3) * pi * r^3 V = 33.5103 另一个在很多数学应用中闻名的常数是 e=2.718。在 MATLAB 中我们可以引用 e,输入 exp(a)得到 ea 的值。这里有些例子 && exp(1) ans = 2.7183 && exp(2) ans = 7.3891 要得到一个数字的平方根,我们输入 sqrt,例如 && x = sqrt(9) x = 3 && x = sqrt(11) x = 3.3166 要得到 x 的自然对数,输入 log(x) 8&& log(3.2) ans = 1.1632 && x = 3;log(5) ans = 1.6094 如果要得到以 10 为底的对数,输入 log10(x) && x = 3; log10(x) ans = 0.4771 MATLAB 还带有基本三角函数及反三角函数,默认以弧度为参数,以小写标准形式输 入即可,例如 && cos(pi/4) ans = 0.7071 要使用反三角函数,在三角函数名前加 a。例如,要计算一个数的反三角,格式如下 && format rat && atan(pi/3) ans = 复数在 MATLAB 中我们也可以输入复数。提醒一下农科大学生,-1 的平方根定义为 i = -1 复数可以写成 z=x+iy 的形式,其中 x 是 z 的实部,y 是 z 的虚部。在 MATLAB 中输入 复数很容易,默认就把 i 当为负一的平方根。在 MATLAB 中复数计算很容易,例如 a = 2 +3i b = 1 - i =& a + b = 3 + 2i 让我们在 MATLAB 中验证一下。在 MATLAB 没有必要在 i 前面添加空格或乘号(*) 。 && format short && a = 2 + 3i; && b = 1 - && c = a + b c = 3.0000 + 2.0000i 9修正输入有时候我们输入表达式时会带有错误,当你按 ENTER 回车后才意识到,这时没必须重 新输入整行,只需使用方向键向上移动,修正错误,然后按回车重新输入,MATLAB 会修 正输出。文件基础下面我们以文件基本操作内容作为本章的结束,如果不保存并重新取得我们的工作进 度,MATLAB 就没有那么好用了,是吗?假定我们要保存在命令窗口中输入的变量和表达 式以便以后使用,那么按照下面的步骤来操作就可以了: 1. 2. 3. 4. ”下接菜单 点击“文件(File) 选择“保存工作区为(Save Workspace As…) ” 输入文件名 点击“保存(Save) ”按钮在 Windows 下,这种方法创建了一个扩展名为.MAT 的 MATLAB 文件,如果你以这种 方式保存文件, 你可以在另一台计算机上运行程序重新取得所有命令然后继续工作。 有时候, 特别是复杂工程, 你不会总想坐在一个地方把所有的表达式全部输进去, 可能就想把很长的 一系列命令保存到一个文件中, 然后仅在命令窗口输入一个简单命令就能执行。 创建一个脚 本文件(script file)就能这样做了。这种类型的文件被称为 MATLAB 程序,以.M 为扩展名 保存。因此,我们也称为 M 文件。我们也可以创建全是函数(function)的 M 文件。 到目前为止, 我们已经知道如何创建脚本文件, 脚本文件内容是一系列 MATLAB 命令。 我们创建一个简单的脚本文件,用它来计算对不同 x 的 ex 值。 首先,打开 MATLAB 编辑 器,或者 从文件(File)下拉菜单中点击新建(New)→M 文件(M-File) 或者单击屏幕顶部工具栏上的新建图标( 现在输入下面几行: )% script file example1.m to compute exponential of a set of numbers x = [1:2:3:4]; y = exp(x)注意第一行以%开始,表示这一行是注释(Comment) 。这一行介绍性文字方便我们, MATLAB 会忽略。下一行创建一个数据(array)或者称数集。数组采用方括号[]表示,元 素之间采用冒号(:)或分号(;)隔开。最后一行告诉 MATLAB 计算数组中每个元素的幂, 或者说计算 e1,e2,e3,e4 的值。点击保存图标( )或者从文件下拉菜单中选择“另存为” 保存文件,以 example1.m 为文件名保存到 MATLAB 的当前目录中。 现在回到 MATLAB 桌面的命令窗口,输入 example1。如果前面没有弄错,你会看到下 面的输出 && example1 y = 2.120.085554.5982我们也可以使用 M 文件创建和储存数据。我们在文件编辑器创建一组表示温度的数值 并把它保存到文件中。我 We do this by creating a list of temperatures in the ?le editor 10temps = [32,50,65,70,85] 把文件保存到 MATLAB 当前目录并命名为 TemperatureData.m, 只需在命令窗口中输入 文件名即可访问刚才保存的文件,MATLAB 把数分开后输出。 && TemperatureData temps = 32 50 65 7085现在我们就可以引用文件中的数组名使用刚才的数据了。 让我们创建一组表示摄氏温度 的数字,然后转换成我们所熟悉的华氏温度,用下面的命令就可以做到 && CelsiusTemps = (5/9) * (temps - 32) CelsiusTemps = 0 10.3 21.4 在后面我们会学习 MATLAB 编程, 到时会学习如何创建可以在命令窗口中调用的函数。结束MATLAB到 目 前 我 们 已 经 学 习 一 些 基 础 的 MATLAB 命 令 , 你 可 能 想 保 存 工 作 然 后 退 出 MATLAB。如何退出屏幕呢?与其它程序一样,你可以从文件下拉菜单中选择“退出(Exit) MATLAB”来结束 MATLAB 会话,还可以在命令窗口中输入 quit 命令,这样也能关闭 MATLAB。习题用 MATLAB 计算下面各式: 1.514 3.91.25 4.真或假。如果 y 已经赋值,MATLAB 允许你定义方程 x = y^2 并储存到内存中,以后 还可以使用它。 5.如果圆柱体的体积由其高 h 和半径 r 通过公式 V=2πr2h 得到,使用 MATLAB 找出高 12cm,直径 4cm 的圆柱体所包含的体积。 6.使用 MATLAB 计算 π/3 的正弦值并用有理数(一个能用整数或整数之比表达的数字, 但零不能做分母。――译者注)表示出来。 7.创建一个 M 文件,以有理数的形式显示 sin(π/4),sin(π/3)和 sin(π/2)的值。 2.53 + 378 11 第二章向量与矩阵MATLAB 相当有用的其中一个领域是解决线性代数问题。 这是因为 MATLAB 对处理数 组有非凡能力,使得成为许多科学与工程应用中的一个有用的工具。 12向量向量(vector)一维数值数组。MATLAB 允许你创建列向量和行向量,列向量通过在方 括号内把数值用分号(;)隔开来创建,对元素的个数没有限制。例如,要创建一个含有三 个元素的向量,我们写成: && a = [2; 1; 4] a = 2 1 4 列向量的基本操作通过引用创建时使用的变量名来进行的。 如果我们要把一个列向量乘 上一一个数,这叫做数量乘法(scalar multiplication) 。假设我们要创建一个新向量,它的元 素是刚才我们创建的向量 a 的元素的三倍,我们可以先定义一个数量(注意命令行末的分号 禁止了输出) : && c = 3; 下一步,我们就像 a 是另一个变量一样进行计算 && b = c*a b = 6 3 12 要创建行向量, 我们仍然是把一组数值用方括号括起来, 不过这次使用的分隔符是空格 (space)或逗号(,) 。例如: && v = [2 0 4] v = 2 0 4 或者使用逗号: && w = [1,1,9] w = 1 1 9 使用转置操作可以进行列向量与行向量之间的相互转换。假设我们有 n 个元素的列向 量,如下所示: v1 v2 . v= . . vn 转置后为 vT=[v1 v2 ... vn] 在 MATLAB 中,我们用单引号(')代表转置操作,把列向量转为行向量的例子为:?? ?? ?? 13&& a = [2; 1; 4]; && y = a' y = 2 1 4 现在我们把行向量转为列向量: && Q = [2 1 3] Q = 2 1 3 && R = Q' R = 2 1 3 有时也可能会使用两个向量进行相加或相减来创建第三个。 要实现此操作, 两个向量之 间必须类型相同,长度相同。因此我们可以对两个列向量进行相加创建第三个列向量,或者 把两个行向量进行相加创建第三个行向量。 此时只需引用变量名就可以了, 没有必要列出所 有的元素。下面的例子把两个列向量加到一起: && A = [1; 4; 5]; && B = [2; 3; 3]; && C = A + B C = 3 7 8 现在我让两个行向量相减: && W = [3,0,3]; && X = [2,1,1]; && Y = W - X Y = 1 -1 2从已存变量创建大向量MATLAB 允许把向量合并在一起创建新向量。 u 和 v 是 MATLAB 中已经存在两个列 设 向量,各自带有 m 和 n 个元素。我们创建第三个向量 w,它的前 m 个元素来自 u,后 n 个 元素来自 v。新创建的列向量一共有 m+n 个元素。这时可以写成 w = [u; v],例如: && A = [1; 4; 5]; && B = [2; 3; 3]; && D = [A;B] D = 1 4 5 2 143 3 也可能使用行向量来创建新向量。要从带有 m 个元素的行向量 r 和带有 n 个元素的行 向量 s 中创建带有 m+n 个元素的行向量 u,我们写成 u = [r, s]。例如: && R = [12, 11, 9]; && S = [1, 4]; && T = [R, S] T = 12 11 9 14创建等差元素向量有时需要创建带有等差元素的向量,差值为 q 为一个实数。创建一个首元素为 xi,末元 素为 xe 的向量 x 的语法如下: x = [xi : q: xe] 例如,要创建一个含有从 0 到 10 之间偶数的向量的写法为: && x = [0:2:10] x = 0 2 46810我们已经在前一章使用这种技术创建了一组数值。 让我们看看在含有少量元素向量的背 后它是如何工作的。开始我们创建一组值: && x = [0:0.1:1] x = Columns 1 through 10 0 0.0 0.0 Column 11 1.00000.00.30000.40000.5000这组值可以用来创建某函数的在某点的一系列值。例如,假设 y = ex,那么我们就有: && y = exp(x) y = Columns 1 through 10 1.2 1.8 2.2255 Column 11 2.7183 当然我们也可以让 y = x2 && y = x .^ 2 y = Columns 1 through 10 0 0.0 0.0 Column 111.61.34991.49181.64870.00.09000.16000.2500 151.0000 插入语――注意在 MATLAB 中向量的乘方必须在幂运算符前(^)前加上句号(.) ,如 果我们只是输入&& y = x^2,MATLAB 会给出错误信息。 && y = x ^ 2 ??? Error using ==& mpower Matrix must be square. 回到创建等差元素数组的过程,注意你也可以使用负的递增量(即递减) 。例如,我们 创建一个从 100 到 80 以 5 增减的数列: && u = [100:-5:80] u = 100 95 90 8580我们也可以采用 linspace 命令创建行向量,这向量含有 a 到 b 之间间隔相等(等差)的 n 个元素。linspace(a, b)创建了 a、b 之间含有 100 个等差元素的向量,而 linspace(a, b, n)创 建了 a、b 之间含有 n 个等差元素的向量。不管是哪种形式,MATLAB 自动确定元素之间的 增量。 MATLAB 还允许创建 n 个对数值相隔相同的行向量,使用的格式为 logspace(a, b, n) 这创建了 10a 和 10b 之间 n 个对数值等差的向量。例如: && logspace(1, 2, 5) ans = 10.8 31.6228 另一个例子: && logspace(-1, 1, 6) ans = 0.2 0.631056.01.58493.981110.0000特征化向量(Characterizing a Vector)命令 length 返回向量中包含元素的个数,例如: && A = [2;3;3;4;5]; && length(A) ans = 5 && B = [1;1]; && length(B) ans = 2 length 命令既可以应用到行向量和列向量(见本章后面的“矩阵基本操作” )也能应用 到矩阵。 使用 max 或 min 命令我们还可以找出向量中数值最大和最小的元素。例如: && A = [8 4 4 1 7 11 2 0]; 16&& max(A) ans = 11 && min(A) ans = 0 要找出向量的模,我们引进两种操作。回顾一下,向量 v1 v2 . v= . . vn 的模由下式给出: |v| = v12+v22+...+vn2 要实现本操作,我们先介绍向量的数量积(点乘) ,使用数组乘法(.*)来完成。首先 我们定义一个向量。?? ?? ??&& J = [0; 3; 4]; 现在我们就可以做数组相乘了: && J.*J ans = 0 9 16 本操作产生了元素为 v12,v22,...的向量。要得到我们要的总和可以使用 sum 操作符: && a = sum(J.*J) a = 25 向量的模为本得数的平方根: && mag = sqrt(a) mag = 5 如果变量包含有复数,那么计算向量的模就更加要注意了。要计算复数行向量的模,必 须先计算该向量的共轭复数向量。例如,如果: ? i ? u = ?1+2i? ? 4 ? 要计算模,我们需要下列的向量: u?=[-i 1-2i 4] 那么我们需要计算的和是: ? i ? u?u =[-i 1-2i 4]?1+2i? =(-i)(i) + (1 - 2i)(1 + 2i) + (4)(4) = 22 ? 4 ? 因此这个算数向量的模是: ? |u| = u u = 22 17可以看到如何使用共轭复数计算向量的和, 注意向量的模是一定是实数。 现在我们看看 如何在 MATLAB 来计算。首先输入列向量: && u = [i; 1+2i; 4]; 如果我们以前例子的乘法计算向量的和,我们会得到不能正常工作的复数: && sum(u.*u) ans = 12.0000 + 4.0000i 因此我们先定义 u 的共轭复数,使用转置操作符,MATLAB 会自动计算: && v = u' v = 0 - 1.0000i 现在计算和: && b = sum(v.*u) ??? Error using ==& times Matrix dimensions must agree. 非常不幸,看来我们是闯进死胡同,没有一一对应,如何绕过这一点呢?让我们计算复 数的共轭复数向量,再来计算总和,我们使用 conj 命令计算向量的共轭复数向量: && v = conj(u) v = 0 - 1.0 - 2.0 现在我们得到正确答案,也就能正确得到模: && b = sum(v.*u) b = 22 && magu = sqrt(b) magu = 4.6904 当然这些也可以一步到位: && c = sqrt(sum(conj(u).*u)) c = 4.6904 这里其实我们以繁琐的方法来做――只是为了演示方法和一些 MATLAB 命令,在下一 节中,我们讲到如何自动计算向量的模。 我们可以使用 abs 命令返回向量的绝对值――即在原位置返回向量中每个元素的绝对 值。例如: && A = [-2 0 -1 9] A = -2 0 -11.0000 - 2.0000i4.00009 18&& B = abs(A) B = 2 0 1 9向量的点乘和叉乘(数量积和向量积)两个向量 A=(a1 a2 ... an)和 B=(b1 b2 ... bn)的点乘结果由下式给出 A?B =∑aibii在 MATLAB 中,a、b 两向量的点乘可以使用 dot(a, b)命令计算。 两个向量点乘的结果是数量,也即是说,它只是一个数值。我们使用 MATLAB 计算一 个简单的例子: && a = [1;4;7]; b = [2;-1;5]; && c = dot(a,b) c = 33 点乘可以用来计算向量的模,所需要的只是把向量同时传递给 dot 命令的两个参数。考 虑上一节的向量: && J = [0; 3; 4]; 调用 dot 命令我们得到: && dot(J, J) ans = 25 或者我们也可以用下面这种方式计算向量的模: && mag = sqrt(dot(J,J)) mag = 5 对于带有复数元素的向量,dot 操作也能正确计算: && u = [-i; 1 + 4 + 4*i]; && dot(u, u) ans = 35 向量的另一个重要操作是叉乘。 要计算向量的叉乘, 这两个向量必须是的三维的。 例如: && A = [1 2 3]; B = [2 3 4]; && C = cross(A, B) C = -1 2 -1 19引用向量元素MATLAB 有几种方法用来引用向量的一个或多个元素。 向量 v 的第 i 个元素可以用 v(i) 来引用,例如: && A = [12; 17; -2; 0; 4; 4; 11; 19; 27]; && A(2) ans = 17 && A(8) ans = 19 如果使用冒号――如 v(:)――来引用向量,等于告诉 MATLAB 列出向量的所有元素: && A(:) ans = 12 17 -2 0 4 4 11 19 27 我们还可以选出向量中某一范围内的元素,本节中我们一直在使用的向量 A 有 9 个元 素,可以用 A(4:6)选出第 4 到第 6 个元素组成一个新的、含有 3 个元素的向量: && v = A(4:6) v = 0 4 4 在下一节中,我们会看到如何使用这项技术来引用被称为矩阵的整行或整列。矩阵基本操作矩阵是两维数字数组,要在 MATLAB 创建矩阵,输入的行各元素之间用空格或逗号分 隔,行末使用分号标记。例如,考虑下列例子: -1 6 A = ?7 11? ? ? 这个矩阵在 MATLAB 中使用下面的语法输入: && A = [-1,6; 7, 11] A = -1 6 7 11 20如果考虑矩阵? 2 0 1? B = ?-1 7 4? ? 3 0 1?在 MATLAB 中我们以下面的方式输入: && B = [2,0,1;-1,7,4; 3,0,1] B = 2 0 1 -1 7 4 3 0 1 我们已经在向量使用的很多操作也可以延伸到矩阵操作。 所有的带有 n 个元素的列向量 是一个有一列 n 行的矩阵,所有的带有 n 个元素的行向量是一个有一行 n 列的矩阵。例如, 数量相乘可以通过引用矩阵的名称来进行: && A = [-2 2; 4 1] A = -2 2 4 1 && C = 2*A C = -4 4 8 2 如果两个矩阵行数和列数都相等,那么它们可以进行相加减: && A = && B = && A + ans = 7 1 && A ans = 3 -1 [5 1; 0 9]; [2 -2; 1 1]; B -1 10 3 8B我们也可以进行矩阵的转置。转置操作交换矩阵的行和列。例如: ?-1 2 4? ?-1 0 2? 0 1 6? ,=&AT = ? 2 1 7? A= ? ? 2 7 1? ? 4 6 1? 我们使用与转置向量相同的操作符转置矩阵: && A = [-1 2 0; 6 4 1] A = -1 2 0 6 4 1 && B = A' B = -1 6 2 4 0 1 如果矩阵包含有复数元素,那么转置操作会自动计算复数的共轭值: 21&& C = [1+i, 4-i; 5+2*i, 3-3*i] C = 1.0000 + 1.0 - 1.0 + 2.0 - 3.0000i && D = C' D = 1.0000 - 1.0 - 2.0 + 1.0 + 3.0000i 如果要转置复数矩阵的而不计算它的共轭值,那么我们使用(.') : && D = C.' D = 1.0000 + 1.0 - 1.0000i5.0000 + 2.0 - 3.0000i我们可以进行数组乘法,注意这不是矩阵乘法。我们使用与向量相乘相同的符号(.*) 。 ...... 例如: && A = [12 3; -1 6]; B = [4 2; 9 1]; && C = A .* B C = 48 6 -9 6 正如所见。A .* B 操作实际上是进行元素与元素相乘。理论上它如下计算: a11 a12 b11 b12 (a11)(b11) (a12)(b12) A .* B = ?a a ??b b ? = ?(a )(b ) (a )(b )? ? 21 22?? 21 22? ? 21 21 22 22 ? 下一节我们会学习如何进行矩阵相乘。矩阵相乘考虑两个矩阵 A 和 B,如果 A 是一个 m×p 矩阵,而 B 是 p×n 矩阵,它们可以相乘产生 m×n 矩阵。要在 MATLAB 中这样做,我们只需把点号去掉简单地写成 A*B 即可。要紧紧 记住:如果两个矩阵的维数不正确,那么会产生错误。考虑下面两个矩阵: 2 1 3 4 A = ?1 2? ,B = ?5 6? ? ? ? ? 他们都是 2×2 矩阵,因此可以进行矩阵相乘。首先我们进行数组相乘以便看出差异: && A = [2 1; 1 2]; B = [3 4; 5 6]; && A .* B ans = 6 4 5 12 现在我们把“.”号去掉,进行结果不同的矩阵相乘: && A * B ans = 11 1314 16下面是另一个例子,考虑: 22? 1 4? -1 7 4 A = ? 8 0? ,B = ? 2 1 -2? ? ? ?-1 3? 矩阵 A 是一个 3×2 矩阵,而 B 是一个 2×3 矩阵,由于 A 的列数和 B 的行数相匹配。我 们可以计算 AB 的向量积。在 MATLAB 中:&& A = [1 4; 8 0; -1 3]; B = [-1 7 4; 2 1 -2]; && C = A*B C= 7 11 -4 -8 56 32 7 -4 -10 虽然这种形式的矩阵可以进行相乘,但不能进行数组相乘。要使用数组相乘,行数和列 数都必须相匹配。这时如果进行数组相乘,MATLAB 会告诉我们: && C = A .* B ??? Error using ==& times Matrix dimensions must agree.更多基本操作MATLAB 允许在矩阵上进行其它几个操作,对这个几操作,从你的线性代数背景来说, 你可能不能立即习惯它们。例如,MATLAB 允许你把数量添加到一个数组(向量或矩阵) 中。本操作把数量值把数组的每个元素中。下面是把数量值加到行向量的一个例子: && A = [1 2 3 4]; && b = 2; && C = b + A C = 3 4 56我们也可以在数组上进行左除和右除。 这时数组元素与元素匹配相除, 因此两数组必须 等大。例如,我们用“./”让 MATLAB 进行数组右除: && A = [2 4 6 8]; B = [2 2 3 1]; && C = A ./ B C = 1 2 2 8 数组左除用 C = A .\ B (此式与 C = B ./ A 相同)简要说明: && C = A .\ B C = 1.00.50000.1250基本上你能想到的任何数学操作在 MATLAB 中都能在数组中实现。例如,我们可以对 每个元素进行平方: && B = [2 4; -1 6] B = 2 4 -1 6 23&& B .^ 2 ans = 4 16 1 36特殊类型矩阵单元矩阵是一个对角线为非零元素其它元素为零的方形矩阵。要创建 n×n 的单元矩阵, 输入下面的 MATLAB 命令: eye(n) 我们创建 4×4 单元矩阵: && eye(4) ans = 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 要创建 n×n 的零矩阵, 我们输入 zeros(n)。 我们还可以输入 zeros(m, n)创建 m×n 的矩阵, 当然也完全可以创建整个元素都为 1 的矩阵。可能出乎你意外,你只需输入 ones(n)或 ones(m,n)即可分别创建 n×n 和 m×n 的矩阵。引用矩阵元素在 MATLAB 中,矩阵的单个元素或整列都能够被引用。考虑下面的矩阵: && A = [1 2 3; 4 5 6; 7 8 9] A = 1 2 3 4 5 6 7 8 9 我们可以用 A(m,n)选出第 m 行 n 列的元素。例如: && A(2,3) ans = 6 要引用第 i 列的所有元素,我们输入 A(:,i)。例如,我们要选出第二列的所有元素: && A(:,2) ans = 2 5 8 要选出从第 i 列到第 j 列之间的所有元素,我们输入 A(:,i:j)。下面的例子返回第二和第 三列的元素: && A(:,2:3) 24ans = 2 5 8 3 6 9我们也可以选出小块或子矩阵。 仍然用刚才的矩阵, 我们选出第二到第三行同时处于第 一和第二列的元素,写成: && A(2:3,1:2) ans = 4 5 7 8 我们也可以使用这些引用改变矩阵的值。让我们把第一行第一列元素的值改为-8: && A(1,1) = -8 A = -8 2 3 4 5 6 7 8 9 要在 MATLAB 中创建空数组,只需在方括号[]里留空即可。它可以用来删除矩阵的行 或列。让我们删除 A 的第二行: && A(2,:)=[] A = -8 2 7 83 9本操作把前面 3×3 矩阵变成 2×3 矩阵。当然也可以通过引用矩阵中的行或列来创建新 的矩阵。在本例中,我们复制 A 矩阵的第一行四次来创建一个新矩阵: && E = A([1,1,1,1],:) E = -8 2 3 -8 2 3 -8 2 3 -8 2 3 下面这个例子引用两次 A 的第一行创建新矩阵: && F = A([1,2,1],:) F = -8 2 3 7 8 9 -8 2 3行列式与线性系统求解方矩阵的行列式是一个数值。对于一个 2×2 矩阵,其行列式由正式给出: a11 a12 D = ?a a ?= a11a22 - a12a21 ? 21 22 ? 要在 MATLAB 中计算矩阵 A 的行列式,简单地写成 det(A)即可,下面是 2×2 矩阵的行 25列式: && A = [1 3; 4 5]; && det(A) ans = -7 在下面这个例子中,我们得到 4×4 矩阵的行列式: && B = [3 -1 2 4; 0 2 1 8; -9 17 11 3; 1 2 3 -3]; && det(B) ans = -533 无需说明, 这种计算用手工完成是相当单调乏味的。 行列式可以用来找出一个线性系统 方程是否有解。考虑下面的方程组: 5x + 2y - 9z = -18 -9x - 2y + 2z = -7 6x + 7y + 3z = 29 要找出像这样的方程组的解,我们使用两步:首先系数矩阵 A 的行列式,在本例中是: ? 5 2 -9 ? A = ?-9 -2 2 ? ?6 7 3 ? 它的行列式是: && A = [5 2 -9; -9 -2 2; 6 7 3] A = 5 2 -9 -9 -2 2 6 7 3 && det(A) ans = 437 如果行列式不为零,那么解存在。解是列向量: ?x ? x = ?y ? ?z ? MATLAB 允许我们使用左除容易地得到解。首先,我们创建由系统(方程)右边组成 的向量。我们得到: && b = [-18;-7;29]; && A \ b ans = 1.0 3.0000求矩阵的秩矩阵的秩是矩阵行或列的数值线性独立的度量。 如果一个向量线性独立于另外一些向量 组,那意味着这一个向量不能写成它们的线性组合。简单例子如下: 261 3 5 u = ?-2? ,v = ?-4? ,w = ?-6? ? ? ? ? ? ? 研究这些列向量,我们可以看出: 2u + v = w 因此 w 是线性相关于 u 和 v,这时由于 w 可以写 u 和 v 的线性组合。另一方面: ?2 ? ?0? ?0? u = ?0? ,v = ?-1? ,w = ?0? ?0? ?0? ?7? 就形成了线性独立组,这是由于这些向量中没有一个可以写成另外两个的线性组合。 考虑矩阵: 0 1 0 2 A = ?0 2 0 4? ? ? 很明显,矩阵的第二行是第一行的两倍。因此只有一行单值行,矩阵的秩为1。我们在 MATLAB 检验一下,我们用下面的方式计算秩: && A = [0 1 0 2; 0 2 0 4]; && rank(A) ans = 1 另一个例子: ?1 2 3? B = ?3 0 9? ?-1 2 -3? 第三列是第一列的三倍: 3 ?1? 9 = 3? 3 ? ?-1? -3 因此,其中两列线性相关(it’s linearly dependent on the other two columns (add zero times the second column)) 。另外两列线性独立,这是由于找不到常量 α 使得: ?2 ? ?1? 0? = α? 3 ? ? ?2? ?-1? 我们知道有两个线性独立列,rank(B) = 2。我们在 MATLAB 检验一下: && B = [1 2 3; 3 0 9; -1 2 -3]; && rank(B) ans = 2 现在我们考虑一下带有 n 个未知量的 m 个线性系统方程: Ax = b 把 b 连结 A 上构成了增广矩阵: [A b] 当且仅当 rank(A) = rank(A b)时系统有解。如果秩等于 n,那么系统有唯一解,但如果 秩小于 n,那么系统有无数解。如果我们用 r 来表示秩,那么未知量的 r 就可以表示成其它 变量的 n-r 的线性组合。 既然秩可以在 MATLAB 中简单的计算得到,我们也能够容易地把数组连接在一起,我 们可以相对轻松地使用这些事实来分析线性系统。如果秩条件吻合并且秩与未知数个数相 等,解就可以用左除计算得到。我们演示一下这个技术。考虑系统: x - 2y + z = 12 3x + 4y + 5z = 20 -2x + y + 7z = 11 矩阵的系数是: ? 1 -2 1? A = ? 3 4 5? ?-2 1 7? 27我们还有:?12? b = ?20? ?11?因此增广矩阵是:? 1 -2 1 12? (A b) = ? 3 4 5 20? ?-2 1 7 11?第一步是在 MATLAB 中输入这些矩阵: && A = [1 -2 1; 3 4 5; -2 1 7]; b = [12; 20; 11]; 我们可以使用级联创建增广矩阵: && C = [A b] C = 1 -2 3 4 -2 11 5 712 20 11现在我们检查一下 A 的秩: && rank(A) ans = 3 增广矩阵的秩为: && rank(C) ans = 3 由于秩相同,因此解存在。这里有三个未知量,我们也注意到秩 r 满足 r = n。这意味 着解唯一。我们用左除求得解: && x = A \ b x = 4.2 3.1458求逆矩阵与伪逆矩阵矩阵 A 的逆矩阵用 A-1 表示,并且满足下面的关系: AA-1 = A-1A = 1 考虑下面的矩阵方程: Ax = b 如果 A 的逆矩阵存在,那么解可以简易地写成: x = A-1b 在实践中它要比看起来难得多, 这是因为逆矩阵是相当繁琐头痛的。 幸运的是 MATLAB 帮我们避免了这些繁琐工作,使得计算变得简单。在 MATLAB 中输入下面的命令即可计算 矩阵 A 的逆矩阵: inv(A) 28逆矩阵并不总是存在。 事实上我们可以用矩阵的行列式确定逆矩阵是否存在。 如果 det(A) = 0,那么逆矩阵不存在,此时我们说此矩阵是一个奇异矩阵。 我们开始计算一些逆矩阵,看看在 MATLAB 中是多么简单的一件事。以一个 2×2 矩 阵开始: 2 3 A = ?4 5? ? ? 首先检查矩阵的行列式: && A = [2 3; 4 5] A = 2 3 4 5 && det(A) ans = -2 由于 det(A) ≠ 0,我们可以求得逆矩阵。MATLAB 告诉我们它是: && inv(A) ans = -2.01.0我们可以手工计算验证这个逆矩阵: 2 3 -5/2 3/2 -10/2 + 6 6/2 - 3 1 0 AA-1 = ?4 5?? 2 -1 ? = ?-20/2 + 10 12/2 - 5? = ?0 1? ? ?? ? ? ? ? ? 我们并不是要告诉你如何手工计算逆矩阵――这些知识可以在很多线性代数书中找到。 可以这么说,你倒是要避免这么做,特别是对于大矩阵。我们看看在 MATLAB 中 4×4 的 例子。 首先创建矩阵: && S = [1 0 -1 2; 4 -2 -3 1; 0 2 -1 1; 0 0 9 8]; 检查行列式: && det(S) ans = -108 由于 det(S) ≠ 0,逆矩阵存在。MATLAB 输出为: && T = inv(S) T = -0.5 -0.4 -0.1 0.70.4 0.70.6 0.1111 0要手工计算它可就不是那么轻松愉快了,并且很有可能计算出错。让我们检查一下: && S*T ans = 1.0 0.0000 00 1.0 00 0 -0.. 1.0000 29C0.0000 来自于四舍五入误差。在计算机的精度范围内,看来我们确实得到了逆矩阵。 我们用另一种方式检查一下乘积: && T*S ans = 1. 00 1.0 0 1.00 0..0000这一次输出结果变得好看一点了(管它 MATLAB 内部如何处理,反正对我们这些基本 应用影响不重要) 。 现在我们看看如何使用逆矩阵求解方程组。考虑方程组: 3x - 2y = 5 6x - 2y = 2 系数矩阵是: && A = [3 -2; 6 -2] A = 3 -2 6 -2 Ax = b 中的向量 b 是: && b = [5;2] b = 5 2 我们检查 A 的行列式确保逆矩阵存在: && det(A) ans = 6 既然逆矩阵存在,我们就可以在 MATLAB 很容易求得解: && x = inv(A)*b x = -1.0 我们也可以仅使用前面讨论的方法, 用系数矩阵的逆矩阵来相乘求得解, 如果系数矩阵 是方阵,这意味着方程组的方程数与未知数个数相同。如果方程数比未知数个数少,此时方 程组称为欠定。这意味着方程组有无限解,因为此时只有一些未知数能够确定下来,不能确 定的未知数可以赋予任意值。因此可以得到无限多组解。我们举个简单例子: x + 2y - z = 3 5y + z = 0 稍微处理可以得到: z = -5y x = 3 - 7y 在这个方程组中,我们可以为两个变量找到值(x 和 z) ,第三个变量 y 是不确定的。我 们可以为 y 选择喜欢的值,此时方程组就有解了。 另外一种方程组存在无限解的情况是当 det(A) = 0 时。 30那么,要是可怜的数学家遇到这种情况怎么办呢?幸运的是,伪逆矩阵(属广义逆矩阵 ――译者注)来救援。解的办法是为未知数给出最小范数实数解,即是说,解向量 x 具有最 小范数且元素都为实数。我们找一个线性方程组来举例: 3x + 2y - z = 7 4y + z = 2 很明显,这个方程组具无限解。我们输入数据: && A= [3 2 -1; 0 4 1]; b = [7; 2]; && C = [A b] C = 3 2 -1 7 0 4 1 2 现在计算秩: && rank(A) ans = 2 && rank(C) ans = 2 由于这些秩相等,解存在。我们可以用 MATLAB 中的左除产生一组解: && x = A \ b x = 2.0 0 MATLAB 通过把其中一个变量(本例中是 z)设为零产生一组解。如果要尝试用左除产 生一组解,通常都是这样做的。当然,这解是有效的,不过记住它只是让 z = 0,而 z 可以 是任何值。 我们也可以使用伪逆矩阵来解这个方程组。输入如下内容: && x = pinv(A) * b x = 1.7 -0.6667 MATLAB 使用 Moore-Penrose pseudoinverse 计算 pinv。简化梯形矩阵MATLAB 中的 rref(A)函数使用 Gauss-Jordan 消元法产生矩阵 A 降行后的梯形形式。你 可以用手工计算验证的这个简单例子: && A = [1 2; 4 7] A = 1 2 4 7 && rref(A) 31ans = 1 0 0 1现在让我们看一个你可能不大喜欢会想用手工计算的例子。 魔方矩阵 (幻方) 是一个 n×n 矩阵。矩阵的元素从 1 到 n2 之间,并且行元素的和等于列元素的和。如果要手工计算产生 魔方那可能要搞到脑出血 。不过 MATLAB 可以用 magic(n)命令帮我们算出来。例如: && A = magic(5) A = 17 24 1 23 5 7 4 6 13 10 12 19 11 18 258 14 20 21 215 16 22 3 9我们检查一下每列的和是否相等: && sum(A) ans = 65 65656565使用 Gauss-Jordan 消元法化简成梯形形式,对我来说有些难,所以我打算让 MATLAB 告诉我们它是怎样的: && rref(A) ans = 1 0 0 1 0 0 0 0 0 00 0 1 0 00 0 0 1 00 0 0 0 1怎样?我们得到一个单位矩阵。试试更大一点的矩阵: && magic(8) ans = 64 2 9 55 17 47 40 26 32 34 41 23 49 15 8 583 54 46 27 35 22 14 5961 12 20 37 29 44 52 560 13 21 36 28 45 53 46 51 43 30 38 19 11 627 50 42 31 39 18 10 6357 16 24 33 25 48 56 1这个矩阵对于大多数人来说难以处理,不过在 MATLAB 求得: && rref(magic(8)) ans = 1 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 01 3 -3 0 0 0 01 4 -4 0 0 0 00 -3 4 0 0 0 00 -4 5 0 0 0 01 7 -7 0 0 0 0 320 0 0 0 0 0 0 0矩阵分解MATLAB 可以快速地对矩阵进行 LU、QR 或 SVD 分解。在这一节中,我们看看如何 在 MATLAB 中进行 LU 分解及如何使用它来求解线性方程组。 对矩阵 A 进行 LU 分解写成: [L, U] = lu(A) 例如,让我们找出下列矩阵的 LU 分解: ?-1 2 0? A = ? 4 1 8? ? 2 7 1? 我们输入矩阵得到: && A = [-1 2 0; 4 1 8; 2 7 1]; && [L, U] = lu(A) L = -0.2 1.0 0 0 0.0 0 U = 4.0 8..0 0 0 3.0385 我们可以使用 LU 分解来求解线性方程组。假设 A 是某个方程组的系数矩阵,而 ?12? b = ? -8 ? ?6? 方程组的解可以通过两次左除得到: x = U\(L\b) 我们求得: && b = [12;-8;6]; && x = U\(L\b) x = -6.6 2.1519 考虑方程组: 3x + 2y - 9z = -65 -9x + 5y + 2z = 16 6x + 7y + 3z = 5 我们把方程组输进 MATLAB: && A = [3 2 -9; -9 -5 2; 6 7 3]; b = [-65; 16; 5]; 现在求出 A 的 LU 分解: && [L, U] = lu(A) L = -0.9 1.0000 01.0000 0 33-0.6667 U = -9. 1.0 3. 2.3 -8.7273现在我们使用这些矩阵用左除来求得解: && x = U\(L\b) x = 2.0 7.0000习题求向量 A = (-1 7 3 2)的模。 求向量 A = (-1+i 7i 3 -2-2i)的模。 考虑数 1,2,3。用这些数做元素分别以行向量或列向量的形式输入 MATLAB。 设 A = [1; 2; 3]; B = [4; 5; 6];,求这两个向量的数组乘积。 什么命令可以产生一个只有对角元素为 1,其它元素全为 0 的 5×5 矩阵。 ?8 7 11? ? 2 1 2? 6. 计算两个矩阵A = ?6 5 -1 ? ,B = ?-1 6 4? 的数组乘积和矩阵乘积。 ?0 2 -8 ? ? 2 2 2? 1 2 3? 7 8 9? ? ? 7. 设A = ?4 5 6? ,使用它创建B =?7 8 9? 。 ?7 8 9? ?4 5 6? 8. 求下面方程组的解: x + 2y + 3z = 12 -4x + y + 2z = 13 9y - 8z = -1 系数矩阵的行列式是什么? 9. 下面方程组的解存在吗?它是什么? x - 2y + 3z = 1 x + 4y + 3z = 2 2x + 8y + z = 3 10. 使用 LU 分解求解方程组: x + 7y - 9z = 12 2x - y + 4z = 16 x + y - 7z = 16 1. 2. 3. 4. 5. 第三章绘图与图形绘图是数学应用程序在计算机上最有用的一种应用,MATLAB 当然也毫不例外。通常 我们需要使手工难以绘制的函数或实验数据的图形可视化。本章我们将介绍在 MATLAB 中 完成这些任务的命令和技术。 352D绘图基础我们从绘制最基本的类型图开始――只有一个变量的函数图形。在 MATLAB 中绘图包 含下面三个步骤: 1. 定义函数 2. 指定要绘制的函数图形的值范围 3. 调用 MATLAB 的 plot(x, y)函数 当指定函数的值范围时,我们必须告诉 MATLAB 函数使用的变量的增量。使用较少的 增量可以使得图形显示更加平滑。如果增量较小,MATLAB 会计算更多的函数值,不过通 常不需要取得那么小。我们用一个简单的例子来看看如何做。 我们绘制 0≤x≤10 之间的 y = cos(x)的图形。绘制之前,我们要定义这个区间并告诉 MATLAB 我们所使用的增量。区间使用方括号[]以下面的形式定义: [ start : interval : end ] 例如,如果我们要告诉 MATLAB 在 0≤x≤10 上以 0.1 的增量递增,我们输入: [0:0.1:10] 我们用赋值运算符给这个范围内的变量一个名称,也用这种办法告知 MATLAB 相关变 量和我们要绘制的函数。因此,要绘制 y = cos(x),我们输入下面的命令: && x = [0:0.1:10]; && y = cos(x); 注意我们每行都以分号 “;” 结尾, 记住, 这会抑制 MATLAB 输出。 你不会想让 MATLAB 在屏幕中间输出一大串 x 值,因此使用了分号。现在我们可以输入下面的命令绘图了: && plot(x, y) 输入绘图命令后敲回车 ENTER。过一会儿,MATLAB 会新开启一个标题为“Figure 1” 的新窗口,窗口中含有所绘制的图形。本例中我们得到图 3-1。图 3-1 y = cos(x) 在 0≤x≤10 之间的图象 现在增量呢?假设我们把增量扩大 10 倍,即把它设置为 1,此时使用输入下面的命令 36即可: && x = [0:1:10]; 此时如果尝试再试绘图,我们会得到错误信息: && plot(x, y); ??? Error using ==& plot Vectors must be the same lengths. 我们已经定义过 y = cos(x),因此 MATLAB 不能再次绘图。那怎么办?我们必须告诉 MATLAB 重新计算我们新定义 x 后的 y 值。换句话说,正确的行为是我们重新输入所有的 命令: && y = cos(x) y =Columns 1 through 10 1.3 -0.4161 Column 11 -0.8391-0.9900-0.65360.28370.96020.7539-0.1455-0.9111&& plot(x, y)图 3-2 以较大增量绘制的余弦函数图象 简短插入语――注意我们在重新定义 y 的时候去掉了末尾的分号,所以 MATLAB 输出 了每个 x 点的 cos(x)值。此时如果 x 点的数量巨大,你会发现这并不是需要的。 如了,现在回到绘图。当我们以较大增量绘图时,所绘制的图象就不那么精确。看看图 3-2 中 MATLAB 以 1 为增量绘制的图象,此时变得很拙劣。让我们用另一种方式试试。我 们把增量设为原来的 1/10,即设为 0.01。 记住我们需要重新定义 y,因此我们需要输入的命令是: && x = [0:0.01:10]; && y = cos(x); && plot(x, y) 这一次我们重现了非常漂亮的 y = cos(x)图象,如图 3-3 所示。 现在我们知道如何在窗口中直接了当地绘图了。 下一件事你可能就想要绘制一个坐标轴 37有标签的图象了。这可以通过 xlabel 和 ylabel 函数做到。这些函数可以带一个用单引号括起 来的参数,该参数就是坐标轴的标签。把 xlabel 和 ylabel 函数用逗号分开与 plot 命令放在同 一行。例如,下面的命令产生的图象如图 3-4 所示: && x = [0:0.01:10]; && y = cos(x); && plot(x, y), xlabel('x'), ylabel('cos(x)');图 3-3 以更小增量绘制的 y = cos(x)图象图 3-4 为坐标轴添加标签后的图象 38更多 2D绘图选项到目前为止, 我们知道如何输出给定函数的一般图象。 让我们看看在绘图时可能会考虑 到的选项。如果你要在演示或作业中使用图象,你可能会想要给图象加个标题。MATLAB 允许你使用 title 命令做到这一点, 它使用用单引号括起来的字符串做参数。 标题就会在图象 的正上方打印出来。假设现在我们要用某些力数据来绘制图象,这些力遵循 f(t) = e-2tsint, 其中 t 表示时间,单位是秒,范围 0≤t≤4,每 0.02 秒取一次数据,另外我们还要在图象上 显示“阻尼弹力” 。怎样做呢?第一步定义时间间隔,以普通的方法来做就行了。这里我们 用 t 代替 x。 && t = [0:0.02:4]; 现在我们定义函数,这是相当简单的: && f = exp(-2*t)*sin(t); 然而,当你这样做的时候,你会注意到我们得到一个错误消息。MATLAB 告诉我们: ??? Error using ==& mtimes Inner matrix dimensions must agree. 那么我们如何绕过呢?一种方法是使用 fplot 函数来代替,fplot 函数绕过选择用来绘图 的时间间隔,而自动为我们决定绘图的点数。一般地,fplot 为你产生尽可能精确的的图象, 同时它也帮助我们绕过像这样的错误。调用 fplot 的形式如 fplot('function string', [xstart, xend]) 参数 function string 告诉 fplot 你所要绘制的图象函数, xstart 和 xend 定义了函数的区 而 间。这是相当简单的,让我们看看当前这个例子如何来解。 我们用下面的命令即可几步合一,然后敲回车即可: && fplot('exp(-2*t)*sin(t)',[0, 4]); MATLAB 很快就绘制了图象,如图 3-5 所示。 如果我们要为图象添加标签和标题,可以使用与 plot(x, y)相同的后继步骤。我们再做一 次,这次添加标题“阻尼弹力”和坐标轴标签。 && fplot('exp(-2*t)*sin(t)',[0, 4]), xlabel('t'), ylabel('f(t)'), title('阻尼弹力') 这行命令产生的图象添加了标签,如图 3-6 所示。 刚才我们介绍了 fplot 命令, 不过刚才我们输入指数函数和三角函数相乘时产生了错误。 我们输入: && t = [0:0.02:4]; && f = exp(-2*t)*sin(t); ??? Error using ==& mtimes Inner matrix dimensions must agree. 在 MATLAB 正确的方法是在乘号(*)前带上一个圆句点句(.*) ,不明白?让我演示 一遍正确的输入方法: && t = [0:0.02:4]; && f = exp(-2*t).*sin(t); 39&& plot(t, f)图 3-5 使用 fplot 函数绘制的 f(t) = e-2tsint 函数图 3-6 使用 fplot 函数绘制的加了标签的图象 这一次可就没有什么错误了,也正确地绘制了图象。因此,当一

我要回帖

更多关于 css expression 的文章

 

随机推荐