《matlab3程序设计.ppt》由会员分享,可在线阅读,更多相关《matlab3程序设计.ppt(83页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第三章 MATLAB程序设计一、matlab的工作模式1、指令驱动模式 通常matlab以指令驱动模式工作即在matlab 窗口下,当用户输入单行指令时,matlab 立即处理这条指令,并显示结果,这就是matlab命令行方式。命令行操作时,matlab窗口只允许一次执行一行上的一个或几个语句。x1=0:10,x2=0:3:11,x3=11.5:-3:0 x1=0 1 2 3 4 5 6 7 8 9 10 x2=0 3 6 9x3=11.5000 8.5000 5.5000 2.5000在matlab窗口输入数据和命令进行计算时,当处理复杂问题和大量数据时是不方便的。因此应编辑m文件。2.m文
2、件 m文件的语法类似于c语言,但有自身特点。它只是一个简单的ASCII码文本文件,执行程序时逐行解释运行程序。matlab是解释性的编程语言。m文件有两类独立的m文件 称程序文件 可调用m文件 称函数文件(1).程序文件 简单的m文件 程序文件实际上是一串指令的集合,与在命令窗口逐行执行文件中的所有指令,其结果是一样的。没有输入输出参数。(2).matlab内置函数文件 matlab自定义的函数文件称内置函数文件 调用内置函数的方法:使用函数名并给出相应的入口、出口参数即可。例如:sin.m函数用type sin查不到。调用格式:y=sin(2*x)实际应用中:x=0:2*pi/180:2*p
3、i;y=sin(2*x)plot(x,y)(3).函数m文件 需要输入变量,返回输出变量 matlab用户可以根据需要编辑自己的m文件,它们可以像库函数一样方便的调用,从而极大地扩展了matlab 的能力。各种工具箱的内部函数基本都是M函数文件,用户也可以自己编写一组M函数文件组成工具箱对于某一类特殊问题,如创建了许多m函数文件,则可形成新的工具箱。这种用matlab语言创建定义新的matlab函数的功能,正体现了matlab语言强大的扩展功能。二、二、文本编辑窗文本编辑窗MATLAB文本编辑器的功能就是完成编写、修改和调试这种文件程序就要用到M文件编辑器/调试器。文本编辑器/调试器的启动可以
4、从命令窗口中或当前目录窗口中选择新建或打开文件按钮进入,或在命令窗口中键入:edit(回车)。其编辑模式如下图所示。在文本编辑器中,文字的不同颜色显示表明文字的不同属性。绿色:注解;黑色:程序主体;红色:属性值的设定;蓝色:控制流程。编辑功能与大多数编辑器类似,都有复制、粘贴、查找、加注释、缩进等功能具有程序调试功能:设置断点、单步执行、连续执行等在运行程序之前,必须设置好MATLAB的工作路径,使得所要运行的程序及运行程序所需要的其他文件处在当前目录之下,只有这样,才可以使程序得以正常运行。否则可能导致无法读取某些系统文件或数据,从而程序无法执行。文本编辑器的相关菜单功能:文本编辑器的相关菜
5、单功能:Save and Run:保存并运行程序,直到遇到下一个断点。对应工具按钮为 。Single Step:单步执行。对应工具按钮为 。Step In:运行当前程序行,如果当前行调用了另外一个函数,则跳转到这个函数里。对应的工具按钮为 。Exit Debug Mode:退出调试模式。工具按钮为 。Set/Clear Breakpoint:设置/清除断点。Clear All Breakpoints:清除所有的断点。文本编辑器的参数设置文本编辑器的参数设置 三、MATLBA程序的基本设计原则1、后面的内容是程序的注解,要善于运用注解使程序更具可读性。2、养成在主程序开头用clear指令清除变量
6、的习惯,以消除工作空间中其他变量对程序运行的影响。但注意在子程序中不要用clear。3、参数值要集中放在程序的开始部分,以便维护。要充分利用MATLAB工具箱提供的指令来执行所要进行的运算,在语句行之后输入分号使其及中间结果不在屏幕上显示,以提高执行速度。4、input指令可以用来输入一些临时的数据;而对于大量参数,则通过建立一个存储参数的子程序,在主程序中用子程序的名称来调用。5、程序尽量模块化,也就是采用主程序调用子程序的方法,将所有子程序合并在一起来执行全部的操作。6、充分利用Debugger来进行程序的调试(设置断点、单步执行、连续执行),并利用其他工具箱或图形用户界面(GUI)的设计
7、技巧,将设计结果集成到一起。7、设置好MATLAB的工作路径,以便程序运行。8、MATLAB程序的基本组成结构说明清除命令:清除workspace中的变量和图形(clear,close)定义变量:包括全局变量的声明及参数值的设定逐行执行命令:指MATLAB提供的运算指令或工具箱 提供的专用命令控制循环 :包含for,if then,switch,while等语句 逐行执行命令 绘图命令:将运算结果绘制出来M M程序文件以.m格式进行存取,包含一连串的MATLAB指令和必要的注释。M程序文件中的命令格式和前后位置,与在命令窗口中输入的没有任何区别。需要在工作空间中创建并获取变量,也就是说处理的数
8、据为命令窗口中的数据,没有输入参数,也不会返回参数。程序运行时只需在工作空间中键入其名称即可。使用help xxx时将返回程序开始处的注释信息四、M程序文件命令文件包括两部分:注释文件和程序文件%二阶系统时域响应曲线%阻尼系数为0.3x=0:0.1:20;y=1-1/sqrt(1-0.32)*exp(-0.3*x).*sin(sqrt(1-0.32)*x+acos(0.3);plot(x,y)程序部分画出分段函数所表示的曲面:画出分段函数所表示的曲面:%This is a example.a=2;b=2;clf;%CLF Clear current figurex=-a:0.2:a;y=-b:
9、0.2:b;for i=1:length(y)for j=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)a=1;b=3;c=1;x1 x2=FindRoots(a,b,c)function x1 x2=FindRoots(a,b,c)%a*x2+b*x+c=0 x1=(-b+(b2-4*a*c)0.5)/(2*a);x2=(-b-(b2-4*a*c)0.5)/(2*a);q 函数调用的一般格式输出实参列表=函数名(输入实参列表)u 函数调用时,实参的顺序应与函
10、数定义时的形参的顺序一致。函数调用function y=dfw1(r,p)函数定义形参z=dfw1(x,k)实参1、nargin函数体内获取实际输入变量的个数2、nargout 函数体内获取实际输出变量的个数3、nargin(fun)函数体外获取定义输入变量数4、nargout(fun)函数体外获取实际输出变量数5、varargin获得输入变量的各元素内容6、varargout获得输出变量的各元素内容见文件 mysum.m MATLAB在函数调用上有一个与众不同之处在函数调用上有一个与众不同之处:函数:函数所传递的参数具有可调性所传递的参数具有可调性。函数文件函数文件examp.m:funct
11、ion fout=examp(a,b,c)if nargin=1 fout=a;elseif nargin=2 fout=a+b;elseif nargin=3 fout=(a*b*c)/2;end程序文件程序文件mydemo.m:x=1:3;y=1;2;3;examp(x)examp(x,y)examp(x,y,3)q 函数通过输入和输出参数与其它 M 文件进行数据传递。q 当函数调用完毕后,该函数文件中定义的所有局部变量都将被释放,即全部被清除。q 函数文件中的变量都是局部的,即一个函数文件中定义的变量不能被另一个函数文件或其它 M 文件使用。(2)局部变量q 函数文件运行时,matlab
12、会专门开辟一个临时工作区间,称为函数工作区间。q 如果在M函数中,调用某个M程序文件,那么该程序文件运行时产生的所有变量都存放于该函数空间中,而不是存放在Matlab空间。变量名列表中的各个变量用空格隔开,不能用逗号!全局变量给函数间的数据传递带来了方便,但却破坏了函数对变量的封装,降低了程序的可读性,因而在结构化程序设计中,全局变量是不受欢迎的。特别是当程序较大,子程序较多时,全局变量将个程序调试和维护带来不便,故不提倡使用全局变量。global 变量名列表(3)全局变量q 如果在若干个 M文件中,都把某个变量定义为全局变量,则这些函数将公共使用这一变量。所有函数都可以对它进行存取和修改操作
13、。global a b c a=18.3036b=3816.44c=-46.13for i=1:11 t=373.2+10*(i-1)psat(i)=antoine(t)end%函數:Antoine.m function p_vap=antoine(t)global a b cp_vap=exp(a-b/(t+c)function num1,num2,num3=test3(varargin)global firstlevel secondlevelnum1=0;num2=0;num3=0;list=zeros(nargin);for i=1:nargin list(i)=sum(varargi
14、ni(:);list(i)=list(i)/length(varargini);if list(i)firstlevel num1=num1+1;elseif list(i)secondlevel num2=num2+1;else num3=num3+1;endend?global firstlevel secondlevel?firstlevel=85;?secondlevel=75;?a,b,c=test3(90,89,60,79,89,60,99,98,100)a=1b=2c=0(4)子函数u 函数文件中可以含有一个或多个子函数u 子函数由 function 语句引导u 主函数必须位于最
15、前面,子函数出现的次序任意u 子函数只能被主函数和位于同一个函数文件中的其它子函数调用u 除了用 global 定义的全局变量外,子函数中的变量都是局部变量,子函数与主函数及其它子函数之间通过输入、输出参数进行数据传递u主函数与子函数的工作空间相互独立u用help和lookfor命令不能提供子函数的帮助信息function test()%注释注释tt(0.3);hold on;tt(0.5);tt(0.707);function y=tt(zeta)%二阶系统时域响应曲线二阶系统时域响应曲线%zeta 阻尼系数阻尼系数x=0:0.1:20;y=1-1/sqrt(1-zeta2)*exp(-ze
16、ta*x).*sin(sqrt(1-zeta2)*x+acos(zeta);plot(x,y)function avg,med=main_fun(x)%主函数主函数 n=length(x);avg=sub_fun1(x,n);med=sub_fun2(x,n);function a=sub_fun1(x,n)%子函数子函数a=sum(x)/n;function m=sub_fun2(x,n)%子函数子函数x=sort(x);if rem(n,2)=1 m=x(n+1)/2);else m=(x(n/2)+x(n/2+1)/2;endMATLAB的搜索过程matlab在一个文件中碰到指令cow时
17、:(1)检查cow是否变量(2)检查cow是否内建函数(3)检查cow是否子函数(4)检查cow是否私用函数(私用函数指位于private目录上的M文件函数。私用函数只能被private目录的直接父目录上的M函数文件所调用)(5)检查cow是否当前目录上的文件(先找.p,再找.m)(6)检查搜索路径上是否有cow六、程序流程结构(一)M-文件中输入、输出命令命令 直接赋值输入:提示对话输入(input命令)x=2;x=input(请输入参数 x=);a=1,2;3,4;a=input(请输入矩阵 a=);s=any string!;s=input(Please input s=,s);直接输出
18、:格式控制输出(fprintf命令)x fprintf(x=%.0f,y=%.5fn,pi,pi);disp(a,b);fprintf(x=%5g,y=%10.5gn,N,pi);例:输入一个人的姓名:xm=input(Whats your name:,s)例:求一元二次方程a2+bx+c=0的根。a=input(a=?);b=input(b=?);c=input(c=?);d=b*b-4*a*c;x=(-b+sqrt(d)/(2*a),(-b-sqrt(d)/(2*a)将该程序以aa.m文件存盘,然后运行aa.m文件。keyboard:停止程序执行,把控制权交给键盘。输入return并回车后
19、继续程序执行。return:结束函数执行,返回主程序 若想强行终止程序或中断死循环,按下Ctrl-C键 pause函数:函数:暂停程序的执行。调用格式:pause(延迟秒数)注:如果省略延迟时间,直接使用pause,则将暂停程序,直到用户按任一键后程序继续执行。(二)选择结构选择结构的语句有if语句和switch语句。1 if语句语句 格式一:if 条件 语句组 end格式二:if 条件 语句组1 else 语句组2 end格式三:if 条件1 语句组1 elseif 条件2 语句组2 elseif 条件m 语句组m else 语句组m+1 end例 输入三角形的三条边,求面积。A=input
20、(请输入三角形的三条边:);if A(1)+A(2)A(3)&A(1)+A(3)A(2)&A(2)+A(3)A(1)p=(A(1)+A(2)+A(3)/2;s=sqrt(p*(p-A(1)*(p-A(2)*(p-A(3);disp(s);else disp(不能构成一个三角形。)end运行:请输入三角形的三条边:4 5 6 9.9216输入一个字符,若为大写字母,则输出其后继字符,若为小写字母,则输出其前导字符,若为其他字符则原样输出。c=input(,s);if c=A&c=a&c0 sn=1;elseif x=0 sn=0;else sn=-1;endfprintf(x=%.5f,sn=%
21、.0fn,x,sn);2 switch语句语句switch语句根据变量或表达式的取值不同,分别执行不同的语句。其格式为:switch 表达式 case 值1 语句组1 case 值2语句组2 case 值m 语句组m otherwise 语句组m+1 end例 根据变量 num 的值来决定显示的内容。num=input(请输入一个数);switch num case-1 disp(I am a teacher.);case 0 disp(I am a student.);case 1 disp(You are a teacher.);otherwise disp(You are a stude
22、nt.);end(三)循环结构实现循环结构的语句:for语句和while语句。1 for语句:语句:格式:for 循环变量=表达式1:表达式2:表达式3 循环体语句 end注:其中表达式1的值为循环变量的初值,表达式2的值为步长,表达式3的值为循环变量的终值。步长为1时,表达式2可以省略。求1=n=100 的和y=0;for i=1:100 f=1/(2*i-1);y=y+f;end求奇数和:求奇数和:s=1+3+5+(2k-1)n=input(请输入 n=);s=0;for i=1:2:n s=s+i;fprintf(i=%.0f,s=%.0fn,i,s);end2 while语句语句格式为
23、:while(条件表达式)循环体语句 end循环控制语句:break continuewhile循环和for循环的区别在于:while循环结构的循环体被执行的次数不是确定的,而for结构中循环体的执行次数是确定的。求e:e=1+1+1/2!+1/3!+(1/n!=1.0e-8 p=p*i;r=1/p;e=e+r;fprintf(i=%.0f,r=%.9f,e=%.9f n,i,r,e);i=i+1;end 求:(1)y3 break;end i=i+1;end n=i-1 y=y-fbreak终止最内层的for或while语句,执行end后面的语句。通常与if结构结合使用continue结束本
24、次for或while循环,继续进行下次循环。通常与if结构结合使用break语句和continue语句举例求求100,200之间第一个能被之间第一个能被21整除的整数。整除的整数。for n=100:200 if rem(n,21)=0 continue end breakendn3 循环的嵌套循环的嵌套如果一个循环结构的循环体又包括一个循环结构,就称为循环的嵌套,或称为多重循环结构。多重循环的嵌套层数可以是任意的。可以按照嵌套层数,分别叫做二重循环、三重循环等。处于内部的循环叫作内循环,处于外部的循环叫作外循环。求100,1000以内的全部素数。n=0;for m=100:1000 flag
25、=1;j=m-1;i=2;while i=j&flag if rem(m,i)=0 flag=0;end i=i+1;end if flag n=n+1;prime(n)=m;end end prime%变量prime存放素数按条件执行命令组if 条件式1,命令组1;elseif 条件式2,命令组2;;else 命令组k;end分支语句当条件满足时执行循环命令组while 条件式,命令组;end循环语句对于循环变量依次取数组中的值,循环执行命令组直到循环变量遍历数组for 循环变量=数组,命令组;end循环语句解释语法类型提示错误并显字符串说明error(字符串)中断语句中断该程序,返回ret
26、urn中断语句跳出循环体break中断语句暂停执行,直到击键;pause(n)表示暂停n秒后继续pause中断语句按分支变量的取值,执行命令组Switch分支变量,Case 值1,命令组1;Case 值2,命令组2;;otherwise 命令组k;end分支语句解释语法类型函数可以嵌套调用,即一个函数可以被其它函数调用,甚至可以被它自身调用,此时称为递归调用。必须确保有一个终止条件来结束递归过程 七、递归函数%函数文件函数文件 factor.mfunction f=factor(n)if(n length(list);disp(list);else for num=1:length(list)
27、if all(list=num)list(k)=num;qpl_huisu(list,k+1)end endendclc;clear all;list=zeros(size(1:4)qpl_huisu(list,1)2、递归算法以1,2,3,4,5为例说明:1、一个数的全排列就是其本身。2、首先看最后两个数4,5。它们的全排列为4 5和5 4,即以4开头的5的全排列和以5开头的4的全排列。3、再看后三个数3,4,5。它们的全排列为:3 4 5、3 5 4、4 3 5、4 5 3、5 3 4、5 4 3 即以3开头的和4,5的全排列的组合、以4开头的和3,5的全排列的组合和以5开头的和3,4的全
28、排列的组合.为了更容易理解,将数组中的所有的数分别与第一个数交换,这样就总是在处理后n-1个数的全排列。可以推断,设一组数全排列为1234521345321454231552341123451324514325153421234512435125341234 51235 4r=1r=3r=2r=5r=4k=1:5k=3:5k=2:5k=4:51234512354function qpl(list,r)if r=length(list)disp(list);else for k=r:length(list)list(r,k)=list(k,r);qpl(list,r+1);list(r,k)=l
29、ist(k,r);endendclc;clear all;list=1:4qpl(list,1)八、Matlab 计时函数介绍1)calendar:返回当前日历2)calendar(year,month):反回指定的年月日历。3)calendar(data):返回公元0000年算起的天数的日历。4)cputime:以秒返回cpu当前时间。5)tic,toc启用、关闭计时器。6)clock:year month day hour minute seconds作用:计算运行程序所用的时间.tic;你的你的 Matlab 程序程序;time=toc;%Matlab 程序的运行时间程序的运行时间t0=
30、clock;你的你的 Matlab 程序程序;time=etime(clock,t0);%Matlab 程序的运行时间程序的运行时间t0=cputime;你的你的 Matlab 程序程序;time=cputime-t0;%Matlab 程序的运行时间程序的运行时间q Matlab 计时函数的调用计时函数的调用九、程序设计优化以矩阵为操作主体 以向量运算代替循环运算,提倡矩阵操作tic;x=1;for i=1:1000,y(i)=sin(x);x=x+0.1*pi;end,tocelapsed_time=0.0500tic;x=1:0.1*pi:1000*pi;y=sin(x);tocelaps
31、ed_time=0.0100在多重循环的情况下,建议外循环执行循环次数少的,内循环执行循环次数多的。例:生成510000的Hilbert矩阵,其中 hi,j=1/(i+j-1)Test2.mticfor j=1:10000 for i=1:5 H(i,j)=1/(i+j-1);endendtocTest1.mticfor i=1:5 for j=1:10000 H(i,j)=1/(i+j-1);endendtoc?test1elapsed_time=0.2970?test2elapsed_time=0.6100大型矩阵预先定维 大型矩阵动态的定维会降低程序运行效率,所以,应预先估计变量的最大维
32、数,用zeros或ones等进行预先定维。tic%H=zeros(5,10000);for i=1:5 for j=1:10000 H(i,j)=1/(i+j-1);endendtoctic%H=zeros(5,10000);for i=1:5 H(i,:)=1./i:i+9999;endtoc?test1elapsed_time=0.2970?test2elapsed_time=0.0310优先考虑内在函数采用有效算法提高内存使用效率 主要的命令 clear%清除变量 pack%将变量存在磁盘再载入 quit%退出Matlab环境 save%将变量数据存入文件 load%将文件数据加载进入工
33、作空间十、数据类型1、数值型double64-bit双精度single32-bit单精度int3232-bit signedint1616-bit signedint88-bit signeduint3232-bit unsigneduint1616-bit unsigneduint88-bit unsignedformat long 改变小数点后显示位数字符串用单引号输入或赋值;字符串作为字符数组存储,每个字符占两个字节字符串的每个字符都是都是字符数组的一个元素;?s=symbolics=symbolic?size(s)ans=1 8?s(3)ans=m2、字符串型l字符串的转换 doubl
34、e 字符串转换为数值代码char将ASCII转化为字符串 num2str 数字转换为字符串 int2str 整数转换为字符串 mat2str 矩阵转换为字符串 str2num 转换字符串为数字str2double 将字符串矩阵转换成双精度数sprintf 将数据格式化成字符串str2mat:将多个字符串组合为矩阵?double(s)ans=49 50 51 50 51 52llength:计算字符串长度lstrcat(S1,S2,)连接字符串lstrcmp(S1,S2)比较字符串lstrcmpi(S1,S2)比较字符串,不区分大小写lstrncmp(S1,S2,N)比较前N个字符lstrrep
35、:用一个字符串替换另一个字符串lfindstr(S1,S2)寻找较短字符在较长字符串中的位置索引lupper 将字符串转换成大写llower 将字符串转换成小写lblanks(n):返回一个n 个零或空格的字符串ldeblank:删除字符串尾部空格l执行字符串eval(string)作为一个MATLAB 命令求字符串的值feval求由字符串给定的函数值?t=1/(a*b-1);a=2;b=3;c=eval(t)c=0.2000建立一个字符串向量,然后对该向量做如下处理:建立一个字符串向量,然后对该向量做如下处理:(1)取第取第15个字符组成的子字符串。个字符组成的子字符串。(2)将字符串倒过来
36、重新排列。将字符串倒过来重新排列。(3)将字符串中的小写字母变成相应的大写字母,其余将字符串中的小写字母变成相应的大写字母,其余字符不变。字符不变。(4)统计字符串中小写字母的个数。统计字符串中小写字母的个数。ch=ABc123d4e56Fg9;subch=ch(1:5)%取子字符串取子字符串revch=ch(end:-1:1)%将字符串倒排将字符串倒排k=find(ch=a&ch=z);%找小写字母的位置找小写字母的位置ch(k)=ch(k)-(a-A);%将小写字母变成相应的大写字母将小写字母变成相应的大写字母char(ch)length(k)%统计小写字母的个数统计小写字母的个数3、元胞
37、数组(cell型)可以在一个数组中存放各种不同类型的数据 注意圆括号和大括号的使用。pp=cellstr(asd testetet sfsdfs sfdfgfdfgf)显示内容:pp(1)和pp1的区别清空一个单元数据:pp(3)=和pp3=的区别例子:A=This is a test,1 2;3 4;3,Tom,Janea=A(1,2)%表示1行2列的元胞元素b=A1,2%表示1行2列的元胞元素中的内容celldisp(A),cellplot(A)cell2mat(A(3),cell2mat(A4)4、结构数组(struct型)一个结构中可包含多个不同类型的域建立一个结构体:a.b=1构建一
38、个结构体的数组:pp(m,n)=struct(a)删除一个变量:pp=rmfield(pp,b)例子:ps(1)=struct(name,曲线1,col,r,pos,0,0)ps(2)=struct(name,曲线2,col,b,pos,1,1)ps(1).start=0ps(1).namegetfield(ps,1,name),getfield(ps,1,name,1)fieldnames(ps)1.编写一个函数,将百分制的学生成绩转换为五级制的成绩2.编写一个函数,计算Fibonacci数 F(n)已知:F(1)=F(2)=1 F(k)=F(K-1)+F(K-2)3.编写m程序,找出300以内所有满足下两个条件的数(1)各位数字之和为奇数(2)该数为素数练习: