实验报告课程名称:可视化计算机语言实验项目名称:matlab程序设计学院:信息工程学院专业:电子信息工程指导教师:报告人:学号:班级:实验时间:实验报告提交时间:教务部制一、实验目的与要求:1、熟练掌握matlab的程序流程控制结构。2、熟悉掌握M文件的结构和函数调用。3、掌握内联函数和函数句柄的使用。4、了解程序性能剖析窗口。二、内容和步骤:MATLAB的语法规则简洁,编程效率高,作为一个完整的程序语言,MATLAB也有各种程序流程控制,文件格式和函数调用的规则,通过对函数的调用就能够组成庞大的程序,完成复杂的功能。1.使用程序流程控制Fibonacci数列的各元素为:1、1、2、3、5、8、...满足一下关系F1=1F2=1Fn=Fn-1+Fn-2用M函数文件实现,数列的元素个数为输入变量。(1)按M函数文件格式创建文件开头。functionf=shiyan0501(n)%SHIYAN0501%Fibonacci数列%n元素个数%f构成Fibonacci数列向量%%copyright2015-11-25(2)用while循环实现程序功能f(1)=1;f(2)=1;i=2;whilei=nf(i+1)=f(i-1)+f(i);i=i+1;End运行后,输入参数10,运行结果如下所示:(3)使用for循环实验fori=2:nf(i+1)=f(i-1)+f(i);end运行结果如下所示:(4)当某个元素大于50时,退出循环结构,程序修改如下:fori=2:niff(i)10breakelsef(i+1)=f(i-1)+f(i);endend当某个元素大于50,程序便退出循环结构当n=10,最后一个元素刚好是大于50的,正好退出循环结构当n=12时,第十个元素对应的f(i)大于50,于是退出循环结构,不再运行f(11),f(12)了。(5)将该.m文件生成P码文件pcodeshiyan0501将shiyan0501.m删除,重新运行该文件夹,结果如下所示:练习:将该M文件函数改为M脚本文件,将数列元素个数通过键盘输入,程序应该如何修改?①将M文件函数另存为M脚本文件;②在函数前加n=input('pleaseinputanum:')便可通过键盘键入文件运行结果如下所示:pleaseinputanum:12n=12ans=11235813213455892.使用函数调用计算arcsin(x),)12()!(2)!2(54163134arcsin122252nxnnxxxxnn(1)子函数factorial计算n!子函数factorial计算n!输入参数为n,使用for循环实现的阶乘,输出参数为阶乘。在matlab界面中选择“file-new-function”命令,创建一个新的函数文件,修改输入输出参数和函数名。functionf=factorial(n)%[output_args]=Untitled7(input_args)%UNTITLED7此处显示有关此函数的摘要%此处显示详细说明f=1;form=1:nf=m*f;(2)子函数cal.子函数cal是计算系数functionk=cal(n1)%计算系数form=1:n1k=factorial(2*n1)/(2^(2*n1)*(factorial(n1))^2*(2*n1+1));end输入参数n=5运行结果如下图所示:cal(5)ans=0.0224本函数中调用了求阶乘的子函数factorial(3)主程序shiyan0502.求主函数计算arcsinx,输入参数为x,输出参数为arcsinx的计算结果。程序如下所示:functiony=shiyan0502(x)%shiyan0502arcsinxn=1;ifabs(x)1y=x;whilecal(n)0.0001y=y+cal(n)*x^(2*n+1);n=n+1;endelsedisp('输入错误');y=0;returnend运行结果:y=shiyan0502(0.7)y=0.7754当输入参数不满足条件是退出程序:y1=shiyan0502(2)输入错误y1=0练习:如果不使用子函数factorial,而直接在cal函数中计算阶乘,应如何修改程序。修改cal函数如下所示:functionk=cal(n1)%计算系数f=1;f1=1;form=1:2*n1f1=m*f1;endform=1:n1f=m*f;endk=f1/(2^(2*n1)*f^2*(2*n1+1));end调用程序shiyan0502,运行结果如下所示:y=shiyan0502(0.7)y=0.7754运行结果与使用子函数factorial的运行结果一致。(4)使用程序性能剖析。选择菜单‘view’-‘profile’命令;或使用在命令窗口输入‘profileviewer’命令都可以打开程序性能剖析窗口。在程序性能剖析窗口的‘命令输入栏’中输入需要剖析的命令,‘y=shiyan0502(0.7)’,然后单击‘startprofiling’按钮,查看剖析报告。(5)程序的调试。当有多个函数调用时,由于函数变量的工作空间是独立的,被调用的函数执行结束后变量消失,因此调试时要使用matlab调试器查看运行过程中的变量值。①设置断点。在需要查看的程序的地方设置断点,shiyan0502(0.7)Kyy=0.7000Kx=0.5x=0.5000在K输入x=0.5即可将x的值从0.7修改为0.5.去除断点,查看结果:ans=0.7236结果与x值为0.7时不一致,当x=0.7时,y=0.7754,由此可知,x的值已被修改。②单步运行shiyan0502(0.7)9n=n+1;K按单步运行键:可看到箭头不断的移动:(6)使用函数句柄。在命令窗口使用函数句柄调用函数。h_shiyan0502=@shiyan0502h_shiyan0502=@shiyan0502y=feval(h_shiyan0502,0.5)y=0.5236(7)使用全局变量。Matlabe的编程不提倡使用全局变量,本例中的程序主要是为了查看全局变量的概念。将n作为全局变量,子函数factorial不修改,子函数cal程序和主函数shiyan0502修改如下:functiony=shiyan0502(x)%shiyan0502arcsinxglobaln;n=1;ifabs(x)1y=x;whilecal(n)0.0001y=y+cal(n)*x^(2*n+1);n=n+1;endelsedisp('输入错误');y=0;returnendfunctionk=cal(n1)globalnform=1:nk=factorial(2*n)/(2^(2*n)*(factorial(n))^2*(2*2*n+1));Endglobal为设置的全局变量,子函数没有输入变量,而用全局变量n传递。在全局变量前设置断点,然后运行程序,当程序运行到断点处停止,接着不断使用单步运行调试,结果如下所示:|||练习:使用单步运行调试,查看全局变量n的变化,并在工作空间查看n;3、利用泛函命令实现数值分析①创建函数shiyan0503实现上述表达式关系。functiony=shiyan0503(t)%shiyan0503y=(sin(t)).^2.*exp(a*t)-b*abs(t)a=0.1;b=0.5;y=(sin(t)).^2.*exp(a*t)-b*abs(t);②查看该函数的输出波形,如下图所示:-10-8-6-4-20246810-5-4-3-2-101③利用函数名求零点,在上图中可以看相互在0的附近有2个过零点x1=fzero('shiyan0503',0.5)x2=fzero('shiyan0503',-0.5)运行结果如下所示:shiyan0503_1x1=0.5198x2=-0.5993④利用函数句柄求过零点x1=fzero(@shiyan0503,0.5)x1=0.5198x2=fzero(@shiyan0503,-0.5)x2=-0.5993⑤利用函数句柄求极小值,由②图可知,极小值有多个,查看其中2个x1=fminbnd(@shiyan0503,0.1,0.7)x1=0.2511x2=fminbnd(@shiyan0503,2,5)x2=3.3233练习:利用函数句柄求[-1,1]的面积。x=-1:0.1:1;y=shiyan0503(x);area=trapz(x,y)%用梯形计算积分area=0.0485area1=quad(@shiyan0503,-1,1)%用quad计算积分area1=0.0469(2)使用内联函数①创建内联函数fa=0.1;b=0.5;f=inline('(sin(t)).^2.*exp(.1*t)-0.5*abs(t)','t')f=内联函数:f(t)=(sin(t)).^2.*exp(.1*t)-0.5*abs(t)②绘制曲线图t=-10:0.1:10;y=feval(f,t);plot(t,y)-10-8-6-4-20246810-5-4-3-2-101③求过零点x1=fzero(f,0.5)x1=0.5198④求极小值x2=fminbnd(f,0.1,0.7)x2=0.2511练习:利用内联函数求8附近的极小值x=fminbnd(f,7.9,8.1)x=8.0999x2=fminbnd(f,7.99,8.01)x2=8.0099(3)使用字符串①创建字符串g='(sin(x)).^2.*exp(.1*x)-.5*abs(x)'g=(sin(x)).^2.*exp(.1*x)-.5*abs(x)②绘制曲线图x=-10:0.1:10;y=eval(g,x);plot(x,y)运行程序得到下图:-10-8-6-4-20246810-5-4-3-2-101③求零点x1=fzero(g,0.5)x1=0.5198自我练习:(1)编写函数计算输入参数r为圆半径的圆面积和周长。程序如下所示:g='pi*r^2'k='2*pi*r'r=input('请输入圆的半径r:')disp('圆的面积:')y=eval(g,r)disp('圆的周长:')y1=eval(k,r)运行结果如所示:假设输入圆的半径为3g=pi*r^2k=2*pi*r请输入圆的半径r:3r=3圆的面积:y=28.2743圆的周长:y1=18.8496(2)创建内联函数计算y=sin(r)/r,使用函数句柄调用,并绘制曲线。y=inline('sin(r)./r')y=内联函数:y(r)=sin(r)./rx=-10:0.1:10;f=feval(y,x);plot(x,f)运行结果如下图所示:-10-8-6-4-20246810-0.4-0.200.20.40.60.81注:1、报告内的项目或内容设置,可根据实际情况加以调整和补充。2、教师批改学生实验报告时间应在学生提交实验报告时间后10日内。三、实验结论:通过该实验较为熟练地掌握matlab的一些基本操作,掌握熟练掌握matlab的程序流程控制结构,熟悉掌握M文件的结构和函数调用,掌握内联函数和函数句柄的使用,了解程序性能剖析窗口。指导教师批阅意见:成绩评定:指导教师签字:年月日备注: