MATLAB程序设计实验.docx
- 文档编号:5172083
- 上传时间:2022-12-13
- 格式:DOCX
- 页数:18
- 大小:97.35KB
MATLAB程序设计实验.docx
《MATLAB程序设计实验.docx》由会员分享,可在线阅读,更多相关《MATLAB程序设计实验.docx(18页珍藏版)》请在冰豆网上搜索。
MATLAB程序设计实验
科学计算与数据处理实验报告
学 号
姓 名
实验名称
MATLAB程序设计实验
实验目的
1.掌握M文件的编辑、调试和性能剖析方法
2.掌握MATLAB脚本和函数的设计方法
3.掌握MATLAB程序的基本语法、关系运算和控制结构
4.掌握串演算函数的用法
实验方案
1.编写两段简短的代码,演示MATLAB脚本和函数的不同:
脚本和函数的不同点是:
函数需要通过function来声明,一般有输入参数和输出参数。
脚本是按顺序一条一条命令逐行执行。
编写一个函数文件myfun.m和一个脚本文件myfunscript.m,来演示脚本和函数的不同。
2.编写程序演示控制结构的用法:
编写程序分别来演示循环(for、while)、分支(if-else-end、switch-case)和异常处理(try-catch)控制结构的用法。
3.编写程序分别演示以下命令的功能。
return的返回功能,input的输入功能。
keyboard语句常用在程序调试和运行中的变量修改。
用户在程序中使用keyboard语句,在系统执行此语句时,将停止文件的执行,显示提示符“K>>”并把控制权交给键盘,等待用户的输入。
当pause语句执行时,系统暂停执行,等待用户按任意键继续执行。
break终止本次循环,跳出最内层循环中剩下的语句。
error输出错误信息。
lasterr显示或返回上一条出错的信息。
warning遇到错误需要给使用者必要的提示,warning语句是常见的警告提示语句。
lastwarn存放最新的警告信息。
4.串演算实验:
设计实验演示以下函数的功能和用法。
eval是执行包含MATLAB表达式/命令的字符串,feval是调用某个函数的另一个方法。
5.程序调试实验:
对程序错误进行调试,总结调试过程,指出并改正所给程序的出错语句,记录程序出错时和调通后显示的图形。
6.程序性能剖析实验:
利用剖析器(profileviewer)对relaxzzy(300)进行运行分析,找出relaxzzy函数中最耗时的语句,记录其执行时间、被调用次数,并指出该语句是否可以被加速。
实验记录
1.编写两段简短的代码,演示MATLAB脚本和函数的不同:
(1)函数文件:
文件名:
myfun.m
functiony=myfun(a,b)
disp(sprintf('Myfirstinputis"%s"',inputname
(1)))
disp(sprintf('Mysecondinputis"%s"',inputname
(2)))
y=a+b;
运行结果:
>>x=5;y=6;y=myfun(x,y)
>>Myfirstinputis"x"
Mysecondinputis"y"
>>y=
11
(2)脚本文件:
文件名:
myfunscript.m
a=2;
b=2;
clf;
x=-a:
0.2:
a;
y=-b:
0.2:
b;
fori=1:
length(y)
forj=1:
length(x)
ifx(j)+y(i)>1
z(i,j)=0.5457*exp(-0.75*y(i)^2-3.75*x(j)^2-1.5*x(j));
elseifx(j)+y(i)<=-1
z(i,j)=0.5457*exp(-0.75*y(i)^2-3.75*x(j)^2+1.5*x(j));
elsez(i,j)=0.7575*exp(-y(i)^2-6.*x(j)^2);
end
end
end
axis([-a,a,-b,b,min(min(z)),max(max(z))]);
colormap(flipud(winter));surf(x,y,z);
运行结果:
2.编写程序演示控制结构的用法:
(1)for循环:
>>symsnfact_n
>>fact_n=1;
>>n=input('pleaseenterapositiveinteger:
');
pleaseenterapositiveinteger:
5
>>fact_n=1;
>>forii=1:
n
fact_n=fact_n*ii;
end
>>fprintf('Thefactionalfunctionof%fis:
%f\n',n,fact_n);
Thefactionalfunctionof5.000000is:
120.000000
(2)While循环:
clear
symsxnsum_xsum_x2xbarstd_dev
n=0;sum_x=0;sum_x2=0;
x=input('Pleaseenterthefirstsample:
');
whileisnumeric(x)&&isempty(x)==0
n=n+1;
xmat(n)=x;
sum_x=sum_x+x;
x=input('Pleaseenternextsample');
end
x_bar=sum_x/n;
forii=1:
n
sum_x2=sum_x2+(xmat(ii)-x_bar)^2;
end
std_dev=sqrt(sum_x2/n);
fprintf('Thenumberofdatapointsis:
%f\n',n);
fprintf('Themeanofthisdatasetis:
%f\n',x_bar);
fprintf('Thestandarddeviationis:
%f\n',std_dev);
运行结果:
Pleaseenterthefirstsample:
12
Pleaseenternextsample24
Pleaseenternextsample12
Pleaseenternextsample23
Pleaseenternextsample23
Pleaseenternextsample1
Pleaseenternextsample45
Pleaseenternextsample45
Pleaseenternextsample45
Pleaseenternextsample21
Pleaseenternextsample12
Pleaseenternextsample11
Pleaseenternextsample111
Pleaseenternextsample11
Pleaseenternextsample45
Pleaseenternextsample45
Pleaseenternextsample45
Pleaseenternextsample1
Pleaseenternextsample1
Pleaseenternextsample1
Pleaseenternextsample1
Pleaseenternextsample1
Pleaseenternextsample1
Pleaseenternextsample1
Pleaseenternextsample1
Pleaseenternextsample1
Pleaseenternextsample1
Pleaseenternextsample1
Pleaseenternextsample1
Pleaseenternextsample1
Pleaseenternextsample1
Pleaseenternextsample1
Pleaseenternextsample1
Pleaseenternextsample1
Pleaseenternextsample1
Pleaseenternextsample1
Pleaseenternextsample1
Pleaseenternextsample1
Pleaseenternextsample1
Pleaseenternextsample1
Pleaseenternextsample1
Pleaseenternextsample1
Pleaseenternextsample1
Pleaseenternextsample1
Pleaseenternextsample1
Pleaseenternextsample1
Pleaseenternextsample1
Pleaseenternextsample1
Pleaseenternextsample1
Pleaseenternextsample1
Pleaseenternextsample1
Pleaseenternextsample1
Pleaseenternextsample11
Pleaseenternextsample
Thenumberofdatapointsis:
53.000000
Themeanofthisdatasetis:
10.886792
Thestandarddeviationis:
19.950562
(3)if-else-end分支:
clc
clear
symsnumber1number2sum2numberssub2numbers
number1=input('pleaseenternumber1as:
');
number2=input('pleaseenternumber2as:
');
n=input('ifyouwanttoexecutesumcalculation,youshouldenter"1",otherwiseenter"-1";');
ifn==1
fprintf('thesumofthetwonumbers%f\nand%f\nis%f\n',number1,number2,number1+number2);
elseifn==-1
fprintf('thesumofthetwonumbers%f\nand%f\nis%f\n',number1,number2,number1-number2);
end
运行结果:
pleaseenternumber1as:
5
pleaseenternumber2as:
7
ifyouwanttoexecutesumcalculation,youshouldenter"1",otherwiseenter"-1";1
thesumofthetwonumbers5.000000
and7.000000
is12.000000
(4)switch分支:
clear
symsscore
score=input('pleaseenterthescoreofthestudentsubjectthatyouwanttokonw','s');
switch(score)
case{'A','a'}
disp('¸这门课你做的非常好!
');
case{'B','b'}
disp('良好');
case{'C','c'}
disp('中等');
case{'D','d'}
disp('及格');
case{'E','e'}
disp('对不起,你需要重修!
')
otherwise
disp('对不起,输入错误!
)
end
运行结果:
pleaseenterthescoreofthestudentsubjectthatyouwanttoknow
a
该门课你做的非常好!
(5)try-catch异常处理:
clear
clc
A=sym(input('pleaseentermatrixA=','s'))
B=sym(input('pleaseentermatrixB=','s'))
try
disp('ThemultiplicationofAandBis')
C=A*B
catch
try
disp('ThedoltmultiplicationofAandBis')
D=A.*B
catch
disp('ThetwomatricesAandBcannotbeexecutedmatrixanddotmultiplication.');
end
end
运行结果:
输入正确时的运行结果:
pleaseentermatrixA=[2345]
A=
[2,3,4,5]
pleaseentermatrixB=[3456]
B=
[3,4,5,6]
ThemultiplicationofAandBis
ThedoltmultiplicationofAandBis
D=
[6,12,20,30]
输入错误时的运行结果:
pleaseentermatrixA=[2345]
A=
[2,3,4,5]
pleaseentermatrixB=[34]
B=
[3,4]
ThetwomatricesAandBcannotbeexecutedmatrixanddotmultiplication.
3.编写程序分别演示以下命令的功能:
(1)return的功能和用法:
s=0;
fori=1:
50
s=s+i;
ifs>=500
disp('您要的结果是:
')
disp(s)
return
end
end
运行结果:
您要的结果是:
528
(2)input的功能和用法:
clc
clear
a=input('请输入数字');
ifa>0
disp('输入的大于零')
elseifa==0
disp('输入的等于零')
else
disp('输入的小于零')
end
运行结果:
请输入数字:
1
输入的大于零
(3)keyboard的功能和用法:
clear
clc
x=input('输入被除数:
');
y=input('输入除数:
');
ify==0
errordlg('除数不能为0');
keyboard
n=x/y;
disp('您要的结果是:
')
disp(n)
else
n=x/y;
disp('您要的结果是:
')
disp(n)
end
运行结果:
输入被除数:
5
输入除数:
0
K>>1
ans=
1
(4)pause的功能和用法:
x=-pi:
pi/10:
pi
y1=cos(x);
subplot(1,2,1);
plot(x,y1);
pause(5)
y2=sin(x);
subplot(1,2,2);
plot(x,y2);
运行结果:
(5)break的功能和用法:
forn=1:
100
ifmod(n,6)~=0
continue
end
break
end
disp('小于100的自然数中第一个能被6整除的数是:
')
disp(n)
运行结果:
小于100的自然数中第一个能被6整除的数是:
6
(6)warning的功能和用法:
clear
clc
x=input('输入被除数:
');
y=input('输入除数:
');
ify==0
warning('除数不能为0');
else
n=x/y;
disp(您要的结果是:
')
disp(n)
end
运行的结果:
输入被除数:
45
输入除数:
0
Warning:
除数不能为0!
(7)error的功能和用法:
clear
clc
x=input('输入被除数:
');
y=input('输入除数:
');
ify==0
error('除数不能为0');
else
n=x/y;
disp(您要的结果是:
')
disp(n)
end
运行的结果:
输入被除数:
45
输入除数:
0
?
?
?
除数不能为0!
(8)lasterr的功能和用法:
>>lasterr
ans=
除数不能为0
(9)lastwarn的功能和用法:
>>warning('被除数不能为0');
Warning:
被除数不能为0
>>warning('除数不能为0');
Warning:
除数不能为0
>>lastwarn
ans=
除数不能为0
4.串演算实验:
(1)eval的功能和用法:
x=-pi:
pi/10:
pi;
subplot(2,1,1);
eval('plot(cos(x))');
subplot(2,1,2);
eval('plot(sin(x))')
运行结果:
(2)feval的功能和用法:
>>temp=feval('feval2',3,5);
Myfirstinputis"3"
Mysecondinputis"5"
>>temp
temp=
8
文件名:
feval2.m
functiony=feval2(a,b)
disp(sprintf('Myfirstinputis"%s"',inputname
(1)))
disp(sprintf('Mysecondinputis"%s"',inputname
(2)))
y=a+b;
5.程序调试实验:
(1)出错时:
运行结果:
>>randn('seed',1);
>>x=randn(1,100);
>>Debug_Test(x);
?
?
?
Errorusing==>plot
Vectorsmustbethesamelengths.
Errorin==>Debug_Test>barzzy0at18
plot(xxmu,yy,'r','Linewidth',3)
Errorin==>Debug_Testat7
barzzy0(nn,xx,xmu,xstd)
(2)改正后:
把原程序中的xxmu=xmu*size(yy)改为xxmu=xmu*ones(size(yy))。
运行结果:
>>randn('seed',1),x=randn(1,100);Debug_Test(x)
ans=
13416211920961
6.程序性能剖析实验:
由上例图可知,relaxzzy函数中最耗时的语句是newplate(j,k)=(plate(jm1,km1)/2+plate(jm1,k)+...
plate(jm1,kp1)/2+plate(j,km1)+plate(j,kp1)+...
plate(jp1,km1)/2+plate(jp1,k)+plate(jp1,kp1)/2)/6
其执行时间为0.651s,被调用次数为3000000次。
这个语句可以加速,用过向量化改为矩阵的形式,就可以加速了。
实验总结
(1)MATLAB脚本和函数的异同点:
M脚本文件与M函数文件都是由一系列的语句组成的相对独立的一个运行体。
M脚本文件没有参数传递功能,但M函数文件有此功能。
M函数文件的格式有严格规定,它必须以“function”开头。
函数文件与脚本文件的主要区别在于:
函数文件一般都要带参数,都要有返回结果,而脚本文件没有参数与返回结果。
函数文件的变量是局部变量,运行期间有效,运行完毕就自动被清除,而脚本文件的变量是全局变量,执行完毕后仍被保存在内存中。
(2)MATLAB程序调试和性能剖析的方法:
程序调试的基本方法有:
设置或清除断点,单步执行,stepin当遇见函数时进入函数内部,stepout执行流程跳出函数,观察变量或表达式的值。
性能剖析的方法有:
简单计算程序运行时间:
tic,toc。
全面分析程序运行时间Profiler。
(3)提高MATLAB程序运行速度的有效措施:
要学好matlab,有效地使用matlab,能不用循环的地方,尽量不要使用。
向量化,使用C-mex写核心。
(4)通过这次试验我掌握了M文件的编写,运行和调试。
知道了函数文件和脚本文件的相同点和不同点。
同时也掌握了matlab程序设计中的基本语法,关系运算,以及for和while循环结构,if-else-end和switch的分支结构和异常处理的try-catch结构。
通过自己调试一个程序,明白了程序调试的基本方法。
自己通过对一个程序的性能剖析,知道了性能剖析的基本方法。
成绩评定
注:
实验方案要详略得当、条理清晰,实验记录数据详实,实验总结应做高度归纳和提炼。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- MATLAB 程序设计 实验