实验matlab编程介绍与循环结构3.1.1建立、运行M-文件的步骤1.建立M-文件的步骤(1)打开程序编辑窗口,点击matlab命令窗口工具条上的NewFile图标,或点击命令窗口中的[File]菜单,点击选项中的New,选择M-file,就可以打开打开MATLAB程序编辑窗口,用户可在窗口中输入、编辑程序。(2)保存程序:在程序输入过程中或程序输入完成后,点击工具条上的Save图标,或点击[File]菜单下的Save,在弹出的窗口中输入自己定义的文件名,点击[保存]保存文件。此时,程序被保存在默认路径指定的work文件夹中(初学者最好不要改变这个路径,避免添加路径步骤),保存后的文件名自动加上“.m”后缀,即为M-文件。注意:文件名是要以字母开头中间不含空格和标点符号的字符串;不能用汉字、数字和专用变量名作为文件名,如1,11,pi,ans等。程序通常保存在文件夹:\MATLAB6p5\work中,此路径为MATLAB的默认路径。程序若要存放到其他文件夹中,则要添加该路径到MATLAB的路径设置中,否则程序不能执行。具体操作:点击编辑窗工具条上[File]菜单,选择SetPath..,此时打开路径设置窗口,再点击AddFoider..,选择你所使用的文件夹(若没有,则要先新建),选定后该路径自动显示在列表的第一行或最后一行,再点击Save保存即可。2.运行M-文件运行M-文件有两种方法:方法一:在MATLAB编辑窗口中对正在编辑的M-文件,保存后可直接点击工具条上的Debug中的Run命令(或按F5键),即可运行当前程序。其运行结果或信息显示在命令窗口,此时,用户可以切换到命令窗口进行查看,之后可回到编辑窗对程序进行修改,重新保存再次运行。方法二:在MATLAB命令窗口中直接输入文件名回车,即可运行相应的M-文件。其运行结果或程序运行中的错误信息等显示在命令窗口,此时,用户若要修改程序则可以切换到编辑窗口进行修改,修改后重新保存。注意:当对程序进行修改保存时,当前程序将覆盖原来程序。此时若想保存为另外的文件,则要点击工具条上的[File]菜单,选择Saveas..,另取文件名保存即可。3.1.2MATLAB程序的基本结构程序是使计算机实现某一类功能任务的命令集。MATLAB提供了三种基本的程序结构:顺序结构、循环结构和选择结构。因此,MATLAB中除了按正常顺序执行程序中的命令和函数以外,有多种控制程序流程的语句,这些语句包括for,while,if,switch,try,continue,break,return等。用户编制程序时,需要按照解决问题的逻辑步骤和求解算法,用MATLAB提供的这些语句和函数,按照三种基本结构逐条编写。一般一行一条语句,以便调试和查找错误。程序一般包含三个部分:数据输入、功能处理和结果输出。其中功能处理部分是核心,主要是根据处理问题的逻辑步骤,采用循环迭代、判断推理、分步计算等来解决问题。3.1.3M-文件的输入、输出方式M-文件的输入、输出方式同前面所讲的命令窗中的输入、输出方式基本相同,具体如下:1.输入方式(1)程序中直接赋值x=2;a=[123;456;780];s='Anystring!'3.程序运行时赋值格式:变量=input('提示符号串');功能:从键盘接收数据并赋予等号左边变量。其中'提示符号串'是在命令窗口中的提示。如:X=input('x=');Y=input('Pleaseinputy=');%提示语句输入当执行此语句时,暂停程序运行,在命令窗口中光标将停留在提示符号串后闪烁,等待从键盘接收数据。用户从键盘输入数据并按回车键确认,继续程序运行。其优点是,每次运行可以输入不同数据,实现人机对话。2.输出方式(1)直接输出%变量后无分号“;”,变量直接输出disp([a]);%a可以是标量、向量、矩阵(2)格式控制输出格式:fprintf('x=%.3fy=%.0f\n',a,b);%按指定格式输出;其中,单引号内为格式说明符,%前为提示符,%.3f为数据格式符,通常与单引号后面的数据项对应,f指显示一个实数,3表示显示的数小数点后3位,小数点前整数部分不限。%.0f指显示一实数其小数部分显示0位,结果只显示整数部分。\n为换行符,即一行显示结束后,光标自动换到下一行。a、b为要显示的变量,它们与前面的格式符相对应。例如:fprintf('x=%.5fy=%.0f\n',pi,sqrt(2));x=3.14159y=1fprintf('x=%.5fy=%.0f\n',sqrt(2),pi);x=1.41421y=33.2MATLAB循环结构与应用循环结构是MATLAB程序中最常见的结构之一,它是让计算机按照一定的条件多次重复执行某一命令集,从而实现诸如累加、迭代、分层计算等功能。MATLAB软件提供了两种循环结构:有限次循环for-end结构和条件循环while-end结构。3.2.1有限次循环(for-end)结构格式:forn=n1:step:n2commands-1endcommands-2其中n为循环变量(自己定义),n1为起始值,step为步长,n2为结束值;commands-1为循环体(循环模块),commands-2为后续命令。作用:循环变量n从n1开始,执行commands-1,遇到end时n自动增加step步长,同时与n2比较,当n不超过n2时重复执行commands-1;当n超过n2时转向执行commands-2。当步长为1时可省略。在设计for-end循环结构时,应在循环模块内充分利用循环变量的变化规律,开展相关运算。另外,结构中for与end要成对出现。例3-1:求n(n=100)个奇数的和:s=1+3+5+…+(2n-1).clear;clc;%清除内存变量,清理命令窗口n=100;%赋值给定奇数的个数s=0;%设定存放和的变量s并赋初值0fori=1:n%定义循环变量i从1到n,以1为步长,即为奇数序号s=s+(2*i-1);%先计算右端奇数并累加后再赋给左端的变量sfprintf('i=%.0f,s=%.0f\n',i,s)%逐行显示出累加求和的过程end%循环体结束i=1,s=1………i=98,s=9604i=99,s=9801i=100,s=10000问题1:可否用从1开始的奇数作为循环变量?clear;clc;%清除内存变量,清理命令窗口n=2*100-1;%赋值给定奇数的个数s=0;%设定存放和的变量s并赋初值0fori=1:2:n%定义循环变量i从1到n,以1为步长,即为奇数序号s=s+i;%先计算右端奇数并累加后再赋给左端的变量end%循环体结束fprintf('i=%.0f,s=%.0f\n',i,s)%逐行显示出累加求和的过程clear;clc;%清除内存变量,清理命令窗口m=input('请输入第m个奇数')n=2*m-1;%赋值给定奇数的个数s=0;%设定存放和的变量s并赋初值0fori=1:2:n%定义循环变量i从1到n,以1为步长,即为奇数序号s=s+i;%先计算右端奇数并累加后再赋给左端的变量end%循环体结束fprintf('i=%.0f,s=%.0f\n',i,s)%逐行显示出累加求和的过程问题2:不显示求和过程,只显示最后结果?clear;clc;%清除内存变量,清理命令窗口n=100;%赋值给定奇数的个数s=1;%设定存放和的变量s并赋初值0fori=2:n%定义循环变量i从1到n,以1为步长,即为奇数序号s=s+(2*i-1);%先计算右端奇数并累加后再赋给左端的变量sendfprintf('i=%.0f,s=%.0f\n',i,s)%显示出最后结果例3-2:求正整数n的阶乘:p=1×2×3×…×n=n!,并求出n=20时的结果。分析:这是一个逐次乘积的过程,从1开始存放在积p中,再乘以下一个正整数之后再取代积p,以此类推,直到乘至第n个数,因此,使用循环结构来实现。i=1,p=1i=2,p=2i=3,p=6i=4,p=24i=5,p=120i=6,p=720i=7,p=5040i=8,p=40320i=9,p=362880i=10,p=3628800i=11,p=39916800i=12,p=479001600i=13,p=6227020800i=14,p=87178291200i=15,p=1307674368000i=16,p=20922789888000i=17,p=355687428096000i=18,p=6402373705728000i=19,p=121645100408832000i=20,p=2432902008176640000只显示最后一个数的阶乘clear;clc;%清除内存变量,清理命令窗口n=20;%赋值给定正整数p=1;%设定存放阶乘的变量p并赋初值1fori=1:n%定义循环变量i从1到n,以1为步长,即连续正整数p=p*i;%先计算右端乘积后再赋给左端的变量pend%循环结构结束fprintf('i=%.0f,p=%.0f\n',i,p)%显示出i和p(注意该行要不要“;”都会输出)i=20,p=2432902008176640000fprintf('i=%.0f,p=%.0f\n',i,p)可改为:i,pclear;clc;%清除内存变量,清理命令窗口n=20;%赋值给定正整数p=1;%设定存放阶乘的变量p并赋初值1fori=1:n%定义循环变量i从1到n,以1为步长,即连续正整数p=p*i;%先计算右端乘积后再赋给左端的变量pend%循环结构结束i,p%fprintf('i=%.0f,p=%.0f\n',i,p)可改为:i,pi=20,p=2.4329e+018利用input命令对n进行赋值,随时改变其大小。clear;clc;%清除内存变量,清理命令窗口p=1;%设定存放阶乘的变量p并赋初值1n=input('Pleaseinputn=')fori=1:n%定义循环变量i从1到n,以1为步长,即连续正整数p=p*i;%先计算右端乘积后再赋给左端的变量pend%循环结构结束fprintf('i=%.0f,p=%.0f\n',i,p)%显示出iPleaseinputn=Pleaseinputn=10n=10i=10,p=3628800例3-3:根据麦克劳林公式可以得到e≈1+1+1/2!+1/3!+…+1/n!,试求e的近似值。clear;clc;%清除内存变量,清理命令窗口n=10;%赋值给定正整数p=1;%设定存放阶乘的变量p并赋初值1s=1;%设定存放累加和的变量s并赋初值1fori=1:n%定义循环变量i从1到n,以1为步长p=p*i;%先计算右端乘积后再赋给左端的变量p,此时p为i的阶乘s=s+1/p;%先计算右端阶乘倒数的累加后再赋给左端的变量sfprintf('i=%.0f,s=%.8f\n',i,s)%逐行显示出第i次e的近似值end%循环结构结束i=1,s=2.00000000i=2,s=2.50000000i=3,s=2.66666667i=4,s=2.70833333i=5,s=2.71666667i=6,s=2.71805556i=7,s=2.71825397i=8,s=2.71827877i=9,s=2.71828153i=10,s=2.71828180问题:如何有效控制e的近似值的精度,或者说如何修改程序使其根据近似值的精度要求自动控制循环次数?3.2.2条件循环(while-end)结构格式:while(conditions)Commands-1;EndCommands-2;作用: