版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Ch02M文件与MATLAB程序设计教学目标用交互式的方式来编写程序适用于命令行比较简单,输入比较方便,同时处理的问题步骤较少的情况。当需要处理重复、复杂且容易出错的问题时,可以进行控制流的程序设计,这就是M文件的编程工作方式。教学重点MATLAB的控制流语言变量和函数的种类了解程序的调试和优化教学过程M文本编辑器的基本知识MATLAB的控制流语言变量和函数的种类程序设计的辅助函数程序的调试和优化提问<2>1.例举几个MATLAB中常用的函数,以及简要阐述其相应的功能。2.等差向量的生成方法有哪些?3.如何输入多项式?如何求多项式的根?4.如何创建函数式M文件?5.请简要介绍MATLAB程序设计中的for循环和while循环的使用方法及它们的主要区别。1.M文本编辑器的基本知识我们前面所介绍在MATLAB所做的运算,是适合于所要计算的算式不太长或是想以交谈式方式做运算,如果要计算的算式很长有数十行或是须要一再执行的算式,则那样的方式就行不通了。
MATLAB提供了所谓的M-file的方式,可让使用者自行将指令及算式写成巨集程式然后储存成一个特别的文档,其扩展名是m,譬如picture.m,其中的picture就是文件名称。%新建M-file,area.m
%计算一个球的体积r=input('Typeradius输入半径:');Area=pi*r^2;volume=(4/3)*pi*r^3;fprintf('半径Theradiusis%12.5f\n',r)fprintf('面积Theareaofacircleis%12.5f\n',Area)fprintf('体积Thevolumeofasphereis%12.5f\n',volume)在指令窗口运行指令area1.M文本编辑器的基本知识1.M文本编辑器的基本知识
M文本编辑器M文件的基本属性M文件的组成部分脚本式M文件函数式M文件(1)M文本编辑器M文件的语法类似于一般高级语言,是一种程序化的编程语言,但是,与传统的高级语言相比,M文件又有自己的特点。它只是一个简单的ASCⅡ型码文本文件,因此,它的语法比一般的高级语言要简单,程序也容易调试,并且有很好的交互性。M文件的基本属性*M文件有两种,一种为脚本式(Script),一种为函数式(Function)。函数M文件必须满足一些标准,另外,它们还应该满足一些MATLAB的属性。主要有以下几点:函数式M文件名和出现在文件的第一行的函数名必须相同。实际上,MATLAB忽略了第一行的函数名,并且根据存储在硬盘上的文件名来执行函数。……M文件的组成部分*函数式M文件的组成部分。调出M-edit窗口,在里边输入如下内容:functionf=fact(n)%函数的定义行%Computeafactorialvalue.%H1行%FACT(N)returnsthefactorialofN,%帮助文本%usuallydenotedbyN!%Putsimply,FACT(N)isPROD(1:N).%注释f=prod(1:n);%函数体M文件的组成部分及其功能*M文件的组成部分及其功能组
成
部
分描
述函数定义行(仅限于函数式M文件)定义函数名,以及输入和输出变量的数目和顺序H1行H1行对程序进行概括性的描述,使用help和lookfor命令都可以调出此行帮助文本这是比H1行更详细的帮助信息,使用help命令时与H1行一起显示函数体函数体是M文件的主要部分,程序的计算和设计都在此实现注释解释程序行的意义(2)脚本式M文件用户可以将需要重复输入的所有命令按顺序放到一个扩展名为m的文本文件下,每次运行时只要输入该M文件的文件名即可。用户自己创建的M文件的文件名要避免与MATLAB的内置函数和工具箱中的函数重名,以免发生内置函数被替换的情况。
脚本式M文件举例本脚本式M文件绘制一个正弦曲线:
%此文件用于绘制【-2×pi,2×pi】区间的正弦曲线图x=-2*pi:0.05:2*pi;y=sin(x);plot(x,y,'c+')legend('正弦曲线图')(3)函数式M文件函数式M文件一般都要自带参数,并且有返回结果。函数式M文件的第一行都是以function开始,说明此文件是一个函数。函数式M文件中的变量都不是全局变量,仅在函数运行期间有效,函数运行完毕之后,它所定义的变量将从工作区间中清除。例题举例说明一个名为cylinder的函数,它输入两个参数:圆柱的高与底面半径,并且产生返回变量volume。functionvolume=cylinder(height,radius)%functiontocomputethevolumeofacylinder%volume=cylinder(height,radius)base=pi*radius^2;volume=base*height;functions=jiecheng(n)%此函数用来求非负整数n的阶乘%参数n可以为任意的非负整数%编写日期:2007-5-2ifn<0%若用户将输入参数误写成负值,则报错
error('输入参数不能为负值!');return;elseifn==0%若n为0,则其阶乘为1s=1;elses=1;fori=1:ns=s*i;endendend函数的嵌套调用functions=sum_jiecheng(n)%此函数用来求1+1/2!+...+1/n!的值%参数n为任意非负整数%编写日期:2007-5-3ifn<0%若用户将输入参数误写成负值,则报错
disp('输入参数不能为负值!');return;elses=0;fori=1:ns=s+1/jiecheng(i);%调用求n的阶乘的函数jiecheng
endend【练习】请编写求解扭矩T的函数,并利用该函数求解。functionNiuju=f(F,f,r,theta)degree=theta/180*pi;Niuju=4*f*F*r*sin(degree/2)/(degree+sin(degree));clcclearF=250;f=0.35;r=0.4;theta=60;T=Niuju(F,f,r,theta)2.MATLAB程序设计三种:顺序结构、循环结构和分支结构最简单的程序控制就是顺序结构,用户依次输入命令语句即可。MATLAB语言还提供了4种高级的控制结构。它们是:if-else-end结构、switch-case-otherwise-end结构、for循环和while循环。(1)顺序结构顺序结构是最简单的程序结构,用户在编写好程序之后,系统将按照程序的物理位置顺次执行。a=1;b=2;c=3;s1=a+bs2=s1+cs3=s2/s2disp('这是一个顺序结构的例子');disp('矩阵A,B分别为');A=[12;34];B=[56;78];A,Bdisp(‘A与B的和为:');C=A+B(2)if-else-end语句只有一种选择时的情况。最简单的If-Else-End结构是:
if表达式执行语句end
如果在表达式中的所有元素为真(非零),那么就执行if和end语言之间的{commands}
【例】apples=10; cost=apples*25;
ifapples>5 cost=(1-20/100)*cost;
end cost cost= 200(2)if-else-end语句if……end语句有两种选择时的情况if表达式执行语句1else
执行语句2end在这里,如果表达式为真,则执行第一组命令;如果表达式是假,则执行第二组命令。if……end语句有3种或3种以上选择时的情况
ifexpression1commandsevaluatedifexpression1isTrue
elseifexpression2commandsevaluatedifexpression2isTrue
elseifexpression3commandsevaluatedifexpression3isTrue
elseifexpression4commandsevaluatedifexpression4isTrue
elseif……
...
elsecommandsevaluatedifnootherexpressionisTrue
end
最后的这种形式,只和所碰到的、与第一个真值表达式相关的命令被执行;接下来的关系表达式不检验,跳过其余的If-Else-End结构。而且,最后的else命令可有可无。
【例】ifrand(1)>0.5
disp('iloveyou')
else
disp('i
donotloveyou')endif……end语句【例题】编写一个脚本,利用input()函数录入一个由百分数表示的等级数,然后根据下表,用if语句将其转化为一个字母等级:90%或者更大:A80%~90%:B70%~80%:C60%~70%:D小于60%:F请通过反复输入合法和不合法的等级百分数来测试你的程序。grade=input('whatgrade?');ifgrade>=90letter='A'elseifgrade>=80letter='B'elseifgrade>=70letter='C'elseifgrade>=60letter='D'elseletter='F'end(3)switch……case……end语句*switch开关语句可代替系列if-elseif-else-end结构
case条件语句,执行语句,……,执行语句
case{条件语句1,条件语句2,条件语句3,……}
执行语句,……,执行语句
……
otherwise,
执行语句,……,执行语句
end(4)try……catch……end*try-catch模块提供了一种错误捕获机制。换句话说,利用try-catch模块,MATLAB编译系统发现的错误将被其捕获,用户可以控制MATLAB怎样对发生的错误进行处理。try执行语句1catch执行语句
2end
(5)for循环语句For语句是一种循环语句,可以很方地实现循环操作,从而可以从容地应付大规模的循环语句。fori=表达式,执行语句,……,执行语句endFor循环允许一组命令以固定的和预定的次数重复在for和end语句之间的{commands}按数组中的每一列执行一次。【例】
forn=1:10
x(n)=sin(n*pi/10);
end »x x= Columns1through7 0.30900.58780.80900.95111.00000.95110.8090 Columns8through10 0.58780.30900.0000
(5)for循环语句编程求出sin(nπ/10)的值,其中n取1~10之间的整数。
For循环可按需要嵌套n=0:1:10;fori=1:11
forj=1:11
y(i)=sin(n(i));
n(j)=n(j)*10;endendy=Columns1through70-0.50640.9300-0.8027-0.1425-0.9765-0.5118Columns8through110.8586-0.99570.99170.9287n=1.0e+012*Columns1through700.10000.20000.30000.40000.50000.6000Columns8through110.70000.80000.90001.0000可以利用break命令跳出for循环
(5)for循环语句【例】一个简单的for循环示例。fori=1:10;%i依次取1,2,…10,.
x(i)=i;%对每个i值,重复执行由该指令构成的循环体end;x %要求显示运行后数组x的值。
x=12345678910
(5)for循环语句例:[tang.m]a=2;b=2;x=-a:0.2:a;y=-b:0.2:b;fori=1:length(y)
forj=1:length(x)
if
x(j)+y(i)>1
z(i,j)=0.5457*exp(-0.75*y(i)^2-3.75*x(j)^2-1.5*x(j));
elseif
x(j)+y(i)<=-1
z(i,j)=0.5457*exp(-0.75*y(i)^2-3.75*x(j)^2+1.5*x(j));
else
z(i,j)=0.7575*exp(-y(i)^2-6.*x(j)^2);endendendaxis([-a,a,-b,b,min(min(z)),max(max(z))]);colormap(flipud(winter));surf(x,y,z);(6)while循环语句与for循环不同,while循环的判断控制可以是逻辑判断语句,因此,它的循环次数可以是一个不定数。这样就赋予了它比for循环更广泛的用途。
while表达式执行语句end与For循环以固定次数求一组命令的值相反,While循环以不定的次数求一组语句的值。While循环的一般形式是:
whileexpression {commands} end只要在表达式里的所有元素为真,就执行while和end语句之间的{commands}。(6)while循环语句【例
】num=0;EPS=1;
while(1+EPS)>1EPS=EPS/2; num=num+1;end»numnum= 53»EPS=2*EPSEPS= 2.2204e-016(6)while循环语句【例】x=zeros(1,6);%x是一个的零矩阵i=1;whilei<=6,
x(i)=1/i;i=i+1;end»xx=1.00000.50000.33330.25000.20000.1667可以利用break命令跳出while循环while循环可按需要嵌套。(6)while循环语句课堂练习【练习】
用
for循环求1~200之间的偶数之和。编程:total=0;forn=2:2:200total=total+n;end【课堂练习】【练习】利用while函数编程求出sin(nπ/10)的值,其中n取1~10之间的整数。n=1;whilen=<10
x(n)=sin(n*pi/10);n=n+1;end课堂练习【练习】级数收敛性判定。计算并显示级数Sn的项数N,Sn如下:当收敛到终值S∞=π
2/6的0.01%以内时,项数N为多少?请编程计算。编程series=1;k=2;exact=pi^2/6;whileabs((series-exact)/exact)>=1e-4series=series+1/k^2;k=k+1;enddisp(k-1)(7)人机交互命令终止命令break和return继续命令continue等待用户反应命令pauseecho命令
用户输入提示命令input请求键盘输入命令keyboard
MATLAB的输入与输出语句1.输入语句
输入数值
x=input('pleaseinputanumber:')pleaseinputanumber:22x=22输入字符串
x=input('pleaseinputastring:','s')pleaseinputastring:thisisastringx=thisisastring2.输出语句
输出显示命令
自由格式(disp)disp(23+454-29*4)361disp([112233;445566;778899])112233445566778899disp('thisisastring')thisisastring格式化输出(fprintf)。
fprintf('Theareais%8.5f\n',area)%注意输出格式前须有%符号,%跳行符号须有\符号Theareais12.56637%输出值为8位数含5位小数MATLAB的输入与输出语句错误消息显示命令
error('thisisanerror')??thisisanerrorMATLAB的输入与输出语句3.变量和函数种类*与其他语言一样,MATLAB的变量有输入变量、输出变量和函数内使用的变量之分,而函数也有主函数、局部函数和子函数之分,本节将介绍这些不同种类变量和函数的特点。4.程序设计的辅助函数执行函数容错函数时间运算函数(1)执行函数执行函数及其功能函
数
名功
能
描
述assignin在MATLAB工作区间中分配变量builtin外部加载调用内置函数eval字符串调用函数evalc执行MATLAB的表达式evalin计算工作区间中的表达式feval字符串调用M文件run运行脚本文件(2)容错函数程序设计的好坏在很大程度上取决于其容错能力的大小。MATLAB语言提供了相应的报错及警告函数error、warning、lasterr、lastwarn以及errortrapon/off等,可以很方便地实现这方面的功能。(3)时间运算函数常用的时间控制函数及其功能
函
数
名功
能
描
述clock以向量的形式显示当前的时间和日期date以字符型显示当前的日期now以数值型显示当前的时间和日期calendar显示当月的日历表weekday显示当前日期对应的星期表达eomday给出指定年月的当月最后一天datetick指定坐标轴的日期表达形式datevec转换为向量形式显示日期1.Tic和Toc函数Tic:计时的开始Toc:计时的结束(两个函数配合使用)TICStartastopwatch(秒表)timer.ThesequenceofcommandsTIC,operation,TOCprintsthenumberofsecondsrequiredfortheoperation.TOCReadthestopwatchtimer.TOC,byitself,printstheelapsedtime(inseconds)sinceTICwasused.t=TOC;savestheelapsedtimeint,insteadofprintingitout.Exampleforn=1:100A=rand(n,n);b=rand(n,1);ticx=A\b;t(n)=toc;endplot(t)t=toct=44.01602.Cputime函数Cputime函数返回从调用该函数起所用的总的CPU时间,单位以秒计算。CPUTIMECPUtimeinseconds.CPUTIMEreturnstheCPUtimeinsecondsthathasbeenusedbytheMATLABprocesssinceMATLABstarted.Examplet=cputime;A=magic(4)*rand(4)A=8.238710.680731.76186.79958.40326.984127.381713.86308.10968.313329.633810.04309.11956.693025.005618.2593e=cputime-te=43.64105.程序的调试和优化程序的调试程序的错误种类错误的识别和程序调试程序的优化程序优劣的分析程序优化的技巧有效地使用内存(1)程序的错误种类在MATLAB的表达式中可能存在两种类型的错误,即语法错误和运行错误:语法错误
语法错误发生在M文件程序代码的生成过程中,一般是由函数参数输入类型有误或是矩阵运算阶数不符等引起。
运行错误运行错误一般指在程序运行过程中,出现溢出或是死循环等异常现象。
(2)错误的识别和程序调试对于简单的问题,使用下面的一种或几种方法可以方便地求解:将函数中输出关键值的行的分号(;)去掉,这样,这些运算的中间结果将在命令窗口中予以显示,用户可以据此来检查中间结果的正确性。在函数中添加一些语句,用来显示用户认为很重要的变量的值。使用keyboard命令中断程序,该命令实现函数工作区间和命令窗口工作区间的交互,从而获得用户所需要的信息,使用该命令后,程序将处于调试状态,此时命令窗口的提示符由“>>”变为“K>>”,用户可以进行相应的操作。在函数头前加“%”,这样就将函数式M文件变为脚本式M文件,而脚本式M文件运行时,其工作区间就是MATLAB的工作区间,这样在出现错误的时候就可以查询这个工作区间。错误的识别和程序调试错误识别函数及其功能函
数
名
功
能
描
述echo在函数运行时显示代码disp显示特定的值或信息Sprintf&fprintf显示不同格式和类型的数据whos列出工作区间的所有变量size显示矩阵的维数keyboard中断程序运行,允许用户从键盘进行交互操作return回复keyboard命令后函数的运行warning显示特定的警告信息error显示特定的错误信息错误的识别和程序调试程序断点的设置函
数描
述dbstop用于在M文件中设置断点dbstatus显示断点信息dbtype显示M文件文本dbstep该函数用于从断点处继续执行M文件dbstack显示M文件执行时调用的堆栈dbup/dbdowm实现工作区间的切换dbquit结束调试状态(3)程序优劣的分析在MATLAB语言中,使用profile函数以及计时函数tic和toc来分析程序中各个部分的耗时情况,从而帮助用户找出程序中需要改进的地方。其中profile在计算相对耗时以及查找文件执行过程中瓶颈问题时更为有效,而tic和toc函数在计算绝对耗时时更为有效。(4)程序优化的技巧程序的向量化操作
循环运算是MATLAB中的最大弱点,在程序设计中,应当尽量避免使用循环运算。用户可以通过将M文件向量化来优化M文件,所谓向量化就是使用向量和矩阵运算来代替for循环和while循环。数据的预定义
使用for循环和while循环来增加数据结构的大小时,将影响系统
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年陕西省渭南市高考英语质检试卷
- 幼儿园爱国卫生工作总结
- 2026年新高考化学全国卷易错点专题模拟卷含解析
- 2026年新高考物理模拟押题压轴卷含解析
- 2026年高考全国卷英语压轴题分析易错卷(含解析)
- 桥梁巡视养护工创新意识知识考核试卷含答案
- 船舶轮机员岗前活动策划考核试卷含答案
- 顺酐装置操作工安全意识强化知识考核试卷含答案
- QES三体系换版差距分析表
- 《短视频制作》课件 项目六 制作产品广告短视频
- 喷灌工程安全生产培训课件
- 二手房交易资金监管服务协议书3篇
- 油田汛期安全知识培训课件
- 中西医结合医院综合管理规范
- 2025年云南消防文职考试题库
- 间歇性经口至食管管饲法临床应用
- 检测公司实验室管理制度
- 【化学 上海卷】2025年上海市高考招生统一考试真题化学试卷(真题+答案)
- 2025年高考真题物理(江苏卷)
- DG-TJ08-2062-2025 住宅工程套内质量验收标准
- GB/T 4498.1-2025橡胶灰分的测定第1部分:马弗炉法
评论
0/150
提交评论