您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 项目/工程管理 > matlab3_finalmatlab教程
Matlab编程(M文件)北京理工大学信息科学技术学院徐贵航xu.guihang@163.com一、为什么要用到M文件:1、命令窗口中输入的指令是输入一行运行一行,这样对一些并不是顺序执行的(条件执行和循环执行)指令非常不利;即使顺序执行,如果程序较长,也很难调试与纠错;2、Matlab中的自编函数要通过M文件实现。二、认识M文本编辑器:打开方式:1、file\new\m-file;2、直接点击工具栏的“新建”图标;3、在命令窗口中输入edit。文本编辑器英文为“editor/debugger”,它兼有编辑与调试的作用。大部分菜单与工具栏与普通编辑器相同。执行、单步等操作在debug菜单下;断点、报错等设置在breakpoint菜单下;三、Matlab控制流及编程关键字1、For循环与C语言中对比:MatlabC语言Fori=1:n指令语句;endfor(i=10;i=n;i++){循环体;}举例:for_example.m(%后为注释)fori=0:pi/50:2*pi%循环变量x=2*sin(i);y=2*cos(i);%圆心位置t=0:pi/100:2*pi;xx=x+sin(t);yy=y+cos(t);plot(xx,yy)%以(x,y)为中心画园holdon%维持原来图形不变,在图形窗内添加其他图形end运行结果:2、while循环语法格式:(与C语言对比)MatlabCwhile表达式循环体;endwhile(表达式){循环体;}3、if-else-end分支结构:语法格式:MatlabCif表达式1指令1;elseif表达式2指令2;else指令3;endif(表达式1){指令1;}else{if(表达式2){指令2;}}为节省空间,C语言部分格式不太规范。与C相比,Matlab多了一个elseif关键字,使得分支更加灵活简洁。4、其他break:与C语言相同;switch……case:与C语言基本相同,不过执行完每一种情况后自动跳出(C语言则接着往下执行);try……catch:与C++相同,一般用的不多;pause:执行到该指令后,程序停止,等用户按任意建开始;pause(n)停留n秒四、M文件函数的编写:Matlab中函数以关键字function为标志,并且只能在文本编辑器中编辑。函数返回指令为return;在函数体中可以有循环、分支与函数调用,并且允许自己调用自己(递归)。下面以实现加法为例,比较Matlab函数与C++函数(C函数比C++麻烦一点)MatlabC++functionc=my_add(a,b)%my_add加法函数,格式为c=my_add(a,b)%返回两参数的和intmy_add(inta,intb){c=a+b;c=a+b;return%在最后的return可不要return(c);}在以function为开头的函数格式定义后,最好有关于这个函数及其用法的详细说明,在命令窗口中运行“help函数名”,可以显示这些内容。在文本编辑器中完成M函数的编写后,要以扩展名为“.m”的格式保存,文件名最好是函数名(不然Matlab会认为函数名无效,而以文件名代替)。为了让Matlab能够找到该函数,该函数必须保存在“当前目录”下,在Matlab6.5(??6.1)中该目录在工具栏后并且有一个单独的窗口显示其中文件。如果没有该窗口,可通过\view\desktoplayout\default调出。对于早期版本,可以通过在命令窗口输入“cd”察看,并通过类似于DOS的方法更改。在正确保存该文件后,在命令窗口中输入“my_add(参数一,参数二)”可以返回计算结果,其中参数一、参数二可以是常数和变量。下面举一个用Matlab实现递归的例子,计算“费波那契(fibonacci)数列”,fabonacci数列是离散系统中很经典的数列,其定义为:a(0)=a(1)=1;a(n)=a(n-1)+a(n-2);(n1)fabnacci.mfunctionx=fb(n);%计算fibonacci数列if(n==1|n==0)x=1;elsex=fb(n-1)+fb(n-2);end在命令窗口中输入fibonacci(整数),即可得到该数列的值;由于Matlab中的函数具有参数可变,编写与调用简单,与命令窗口结合紧密等特点,Matlab中的程序大都是以函数的形势来实现,以例一的画图程序为例,可以说像那样一个程序是不完整的,一个好的Matlab程序应该是将可以改变的参数作为函数的参数,将结果作为返回值,封装成一个函数的形式的。下面就将例一画一组圆的程序稍加改动,该为一个函数:functionpic=draw(n,R,r)%pic=draw(n,R.r)画一组圆的函数%画出:圆心均匀分布在半径为R的圆上,半径为r的n个圆%返回值为图形句柄fori=0:pi/n:2*pix=R*sin(i);y=R*cos(i);t=0:pi/100:2*pi;xx=x+r*sin(t);yy=y+r*cos(t);pic=plot(xx,yy);holdonend五、Matlab程序的调试:调试:理解程序的运行并改正编程错误的的过程。Matlab文本编辑器兼有编辑器与调试器的作用,在正常运行程序时,函数中的变量是作为局部变量出现的,在命令窗口中不能访问。只有进入调试状态时,才可以进入通过命令窗口或工作区“workplace”变量表来查询与访问局部变量。调试状态与正常状态的形式上的不同在于命令窗口的命令行前有一个“K”字符。错误分为语法错误与逻辑错误,其中语法错误在运行时Matlab会给出提示,并且一般有准确地定位,比较容易调试。常见语法错误有以下几种:1、非同型矩阵赋值、相加减、作比较,不符合要求的矩阵相乘除;错误提示(Matrixdimensionsmustagree)2、行列不等的矩阵被当作方阵使用,如将非方针求逆、作除数、求行列式等;提示(Matrixmustbesquare.)3、出现零作除数、NaN参与运算等计算规则错误;(有时只有warning,甚至没有提示)4、函数参数格式不符合要求等;提示如(Notenoughinputarguments.)5、调用函数时函数名不存在,或使用内存中不存在的变量;提示(Undefinedfunctionorvariable)6、数组或矩阵下标不符合要求,出现越界。提示(Indexexceedsmatrixdimensions.)需要注意的是,对于像sqrt(-3),ln(-1)等表达式Matlab认为没有语法错误,而是在复数域内处理这些问题,这些往往是编程者不希望的。对于上述错误,第4可以借助系统提示与帮助文件通过观察解决,其他错误一般产生错误的原因并不在错误所在行,所以往往要经过跟踪调试才能解决。如果错误发生在循环体中,一个重要的过程是找出在哪一次循环中出现了错误,这中情况下,可以将菜单“breakpoint\stopifXXXX”选中,则选中的情况出现后程序将自动进入调试状态,这时可以通过命令窗口查询循环变量的当前值从而确定错误出现的位置。对于其他错误设置“stopifXXX”也是有用的,通过这种方法进入调试状态,查询错误行中变量的当前值,找出与预期形势不同的变量,进而推溯到这些变量的赋值语句,找出错误原因。对于逻辑错误,产生原因较为复杂,对初学者常见的有以下两种:(1)、矩阵相乘除、乘方时“.*”、“./”、“.^”写成“*”、“/”、“^”;(2)、前面提到的实数错误表达式在复数域内处理。对于逻辑错误一般要在关键语句前设断点,程序运行到断点时进入调试状态,通过单步执行并不断在命令窗中查询局部变量的值来理解程序的运行。再次强调,理解程序运行过程是调试中发现错误的诀窍。六、编程经验:1、充分利用库函数:由于Matlab的库函数相当全面,各个工具箱几乎覆盖所有工程领域,需要实现某个功能的函数时先通过书籍资料或HELP文件查一下Matlab库函数中是否有了这个函数或其他对你有用的函数;2、避免与库文件或核心冲突:由于Matlab库函数多,而且有些函数不允许重载(C++允许),Matlab中自己编的函数起名时要注意,如果函数名与系统函数名称相同,即使参数不同,自编函数也将不起作用;另外,变量名最好不用i、j、pi、eps、inf等Matlab中已有定义的字符;3、用好help文件:与其他应用程序不同,Matlab的help文件对于任何一个使用者都是不能缺少的。4、Matlab的编程中的循环如果能用矩阵操作代替,会大大加快程序运行速度。因为矩阵内部含有循环,并且循环由内核实现;5、内存管理;Matlab是一个极其耗内存的家伙,并且其内存操作是在后台执行的。如果出现程序变量过多而导致内存不足的情况,考虑以下两种方法:(1)、将耗内存的程序段写成子函数的形势;(原因)(2)、及时删除临时变量及过时变量(clear);(3)、少用递归;5、版本差别:常见版本:5.2以前版本几乎没有人使用;5.3后功能完备;6.0后界面改动较大,更重要的一点是:帮助文件加入好多新的内容,变得好用多了;6.5版最要是改进一些底层算法,加快程序运行速度。考虑到帮助文件对Matlab的重要性,建议安装6.0以上版本;如果经常使用并可能变大的程序,推荐使用6.5;七、Matlabnotbook的安装与使用;在命令窗口中输入“notbook-setup”,开始notebook的安装。按照Matlab的提示,选择word的版本,并找到winword.exe与normal.dot(不同系统位置不同,可在C盘搜索),即可完成notebook的安装。在Matlab命令窗中输入notebook,即可打开word,在word中输入Matlab命令或程序,选中后按cntl+回车,即可在word中运行Matlab程序并显示结果。如果写论文时用到Matlab,notebook非常方便。注意:notebook中运行Matlab程序时比直接在Matlab中运行要慢。附录、程序举例:举例一:说明while与if的用法:一个人以2m/s的速度沿直线散步,在离他散步的直线1000米处有一只狗,当人离狗最近时,狗发现人并以5m/s的速度追赶,假如人不改变路线并且狗始终向着人跑,试画出狗的路径;(2002年“数学建模”选修课期末考试题,有改动,该题有许多变体,如导弹追飞机等)由于要画轨迹图,需要将人、狗所经过的点存在(x1,y1,x2,y2)矩阵里面,有上一秒钟的位置计算下一秒钟的位置,直到二者离的足够近。Dog.mx1=zeros(1,10000);y1=zeros(1,10000);x2=zeros(1,10000);y2=zeros(1,10000);v2=2;v1=5;t=1;while1x2(t)=10000;y2(t)=v2*t;d=sqrt((x1(t)-x2(t))^2+(y1(t)-y2(t))^2);ifd100disp('Catchhim!')break;elset=t+1;x1(t)=x1(t-1)+v1*(x2(t-1)-x1(t-1))/d;y1(t)=y1(t-1)+v1*(y2(t-1)-y1(t-1))/d;endendplot(x1(1:t),y1(1:t),'r',x2(1:t),y2(1:t),'b');利用pause指令,可以将上面狗追人的程序加以改进,x2=zeros(1,10000);y2=zeros(1,10000);v2=2;v1=5;t=1;while1x2(t)=1000;y2(t)=v2*t;d=sqrt((x1(t)-x2(t))^2+(y1(t)-y2(t))^2);ifd5disp('Catchhim!')text(x1(t),y2(t),'Catchhimhere!!')break;elset=t+1;x1(t)=x1(t-1)+v1*(x2(t-1)-x1(t-1))/d;y1(t)=y1(t-1)+v1*(y2(t-1)-y1(t-1))/d;endpause(0
本文标题:matlab3_finalmatlab教程
链接地址:https://www.777doc.com/doc-2881874 .html