Matlab课程报告.docx
《Matlab课程报告.docx》由会员分享,可在线阅读,更多相关《Matlab课程报告.docx(30页珍藏版)》请在冰豆网上搜索。
Matlab课程报告
序号:
23
学号:
13461223
课程报告
课程报告名称:
Matlab应用软件
学生姓名:
叶鹏飞专业班级:
电科132
学院(系):
信息科学与工程学院数理学院
校内指导教师:
姜忠义专业技术职务:
讲师
2015年8月1日——2015年12月28日
本课程报告是根据平时上课所讲练习、课后习题以及课外查找到的资料整理综合而得。
如有不得道之处还望老师指点!
Matlab课程报告
一、Matlab简介
MATLAB是MathWorks公司用C语言开发的将数据结构、编程特性以及图形用户界面完美结合到一起的软件。
matlab的数据单位是矩阵和数组,所有的数据都是以数组的形式来表示和存储的。
matlab将高性能的数值计算和可视化功能集成,并提供了大量的内置函数,从而被广泛的应用于科学计算、控制系统和信息处理等领域的分析、仿真和设计工作,为科学研究、工程设计以及必须进行有效数值计算的众多科学领域提供了一种全面的解决方案,代表了当今国际科学计算软件的先进水平。
MATLAB提供了强大的绘图功能,用户可以在matlab中使用M语言编写脚本文件或者函数以实现用户所需要的功能。
同时matlab还提供了图形用户接口(GUI),通过GUI,用户可以进行可视化编程。
二、matlab基本知识
1.操作界面
工作间窗口
命令历史窗口
M文件编辑器
命令行窗口
打开M文件窗口
当前路径窗口
2.变量
变量定义:
在MATLAB中,变量不用先定义,可以直接使用。
但命名要符合以下列规则:
变量名区分大小写;
变量名最多不超过18个字符;
变量名必须以字母开头,后面可以接任意的字母、数字与下划线;
变量名不要与系统函数、变量及常量名相同。
可以用clear命令清除定义的变量。
3.数组和矩阵
●数组的定义:
例1:
>>x=[1,2,3,4]%直接输入,中间以逗号或者空格相隔。
>>x=1:
5%冒号产生从1到5的向量,每间隔为1。
>>x=1:
2:
10%从1到10,每间隔为2。
>>linspace(-pi,pi,8)%利用命令linspace在区间[-π,π]等距产生8个点。
●矩阵的定义:
例2:
A=[1,2,3;4,5,6;7,8,9]%矩阵的每一行以;隔开。
也可以以空格隔开
运行结果:
>>A=
123
456
789
>>zeros(n,m)%零阵
>>ones(n,m)%壹阵
>>rand((n,m)%随机阵
>>randn(n,m)%正态随机
>>magic(n)%幻方阵
>>vander(c)%由向量C生成范德蒙矩阵
●矩阵的运算
注意:
A±B%两矩阵相加减
A.*a/a.*A%数a和矩阵相乘
A.*B%矩阵对应元素相乘
A./B%A对应元素右除B
B.\A%A对应元素左除B
●常见的矩阵、向量函数
例3:
>>A=[123;456;789]
>>A'%A的转置
>>det(A)%A的行列式
>>rank(A)%A的秩
>>inv(A)%矩阵求逆
>>[D,X]=eig(A)%A的特征值和特征向量
>>norm(A)%矩阵的范数
>>orth(A)%矩阵的正交化
>>poly(A)%特征多项式
>>size(A)%矩阵长度
>>rref(A)%将矩阵A化为行的最简形式
>>length(x)返回向量x的长度
>>s=size(A)矩阵的大小,s
(1)表示A的行数,s
(2)表示A的列数
又:
>>a=[123]
>>A=[236;712;233]
>>[c1d1]=max(a)
>>[c2d2]=max(A)
>>[c3d3]=min(a)
>>[c4d4]=min(A)
>>median(a);%向量中位元
>>median(A);%矩阵各列中位元
>>mean(a);%向量均值
>>mean(A);%矩阵各列均值
>>std(a,flag);%向量标准差
>>std(A,flag);%矩阵各项标准差
>>prod(a);%向量各元素乘积
>>prod(A);%矩阵各列各元素乘积
>>sum(a);%向量各元素之和
>>sum(A);%矩阵各列各元素之和
>>cov(a);%方差或协方差矩阵
>>cov(a,b);%求两随机变量协方差
>>corrcoef(a);%求相关阵
>>corrcoef(a,b);%求两随机变量的相关系数
>>sort(a);%以升序对向量排序
三、matlab绘图
4.二维图形的绘制
例4:
正弦余弦:
>>x=0:
.1:
2*pi;
>>y1=sin(x);
>>plot(x,y1,'r');%r表示红色
>>holdon;%保持前一个图像,下面图像也放在同一个坐标里
>>y2=cos(x);
>>plot(x,y1,'r',x,y2,'g*');%g表示绿色,*表示图线点构成图形
运行结果如下:
Ø符号函数(显函数、隐函数和参数方程)绘图
例5:
隐函数:
>>ezplot('exp(x)+sin(x*y)',[-10,0.5,0,10])
%画出e^x+sin(xy)=0分别在区间x【-10,0.5】和y【0,10】上的图形
运行结果如下:
5.三维图形的绘制
例6:
>>t=linspace(0,10*pi,100);
>>plot3(sin(t),cos(t),t);
%用plot3绘制三维螺旋线
图像如右:
Ø空间曲面的绘制
例7:
锥面:
[x,y]=meshgrid(-20:
0.5:
20);
z2=sqrt(x.^2+y.^2);
surf(x,y,z2);
title('锥面');
shadinginterp%使表面光滑
axisoff;%隐藏坐标轴及其标记
运行结果如下:
例8:
球面:
sphere(30);
axisequal
shadingintern
[x,y]=meshgrid(-8:
0.5:
8);
r=sqrt(x.^2+y.^2)+eps;
z=sin(r)./r;
surf(x,y,z)
运行结果如下:
6.特殊图形
例9:
作竖直条形图:
y=randn(10000,1);
hist(y,20);
运行结果如右:
例10:
作饼状图:
sc=[100170380250]
subplot(1,2,1)
pie(sc,[0100])
subplot(1,2,2)
pie3(sc,[0100])
运行结果如下:
例11:
二维等高线:
[x,y,z]=peaks(30);
subplot(2,2,1)
surf(x,y,z)
subplot(2,2,2)
contour(x,y,z,15)
subplot(2,2,3)
contour3(z,20)
运行结果如右:
7.简单动画
通过不同帧的连续显示来表现动画
例12:
二维动态轨迹图:
t=-pi:
pi/200:
pi;
comet(t,tan(sin(t))-sin(tan(t)))
运行结果如图:
(因为图形是动画呈现,故只给出最后结果)
例13:
三维动态轨迹图:
t=0:
0.05:
100;
x=t;y=sin(t);z=sin(2*t);
comet3(x,y,z)
运行结果如下:
例14:
简单动画:
[x,y,z]=peaks(30);
subplot(1,1,1)
surf(x,y,z)
axis([-33-33-1010])
m=moviein(15);
fori=1:
15
view(-37.5+24*(i-1),30)
m(:
i)=getfram;
end
movie(m)
运行结果如右:
四、matlab符号处理
8.符号变量和符号表达式
ØSym函数
用命令sym产生单个符号变量
(逐个变量定义)
>>sym('[a,b;c,d]')
ans=
[a,b]
[c,d]
(整体定义法)
>>eqen=sym('3*x^4-log(x)=0')
>>eqen=
3*x^4-log(x)=0
ØSyms函数
用命令syms产生多个符号变量及符号表达式。
Syms函数的输入参数必须以字母开头,并且只能包括字母和数字。
>>symsab
>>f=a+b
f=
a+b
ØSubs函数
Subs函数可以将符号表达式中的符号变量用数值代替
>>f=sym(‘x+sin(x)’)
f=
x=sin(x)
>>subs(f,pi/4)
ans=
1.4925
Ø符号表达式的次幂
>>f='2*x^2+3*x-5';
>>sympow(f,'3')
ans=
(2*x^2+3*x-5)^3
9.符号微积分
ØLimit(x)求极限
>>symsxh;
>>limit(sin(x)/x)
ans=
1
ØDiff(f)求导
>>f=‘sin(x)^2’%定义函数的符号表达式
f=
sin(x)^2
>>diff(f)
ans=
2*sin(x)*cos(x)
ØInt(f)求积分
>>f=‘sin(x)^2’;
>>int(f,'x')
ans=
-1/2*sin(x)*cos(x)+1/2*x
Øtaylortool(f)求泰勒级数
>>f='sin(x)^2';
>>taylortool(f);
运行结果如下:
10.符号方程求解
Ø代数符号方程的求解
>>R1=solve('x^2-x-1=0')
R1=
[1/2*5^(1/2)+1/2]
[1/2-1/2*5^(1/2)]
Ø微分方程的求解
>>dsolve(‘Dy=1+y^2’)%求微分方程通解
ans=
tan(t+C1)
>>dsolve(‘Dy=1+y^2’,‘y(0)=1’)%求微分方程特解
ans=
tan(t+1/4*pi)
Ø微分方程组的求解
>>[f,g]=dsolve('Df=3*f+4*g','Dg=-4*f+3*g')
f=
exp(3*t)*(cos(4*t)*C1+sin(4*t)*C2)
g=
-exp(3*t)*(sin(4*t)*C1-cos(4*t)*C2)
11.符号函数图形
例15:
二分法求函数零点
functionA=work6()
symsxqaby1y2y3;
f=x-sin(x)+1;
ezplot(f,[-8,8])
gridon;%画出图形找零点大概位置
q=input('输入一个精确值q\n');
f=sym('x-sin(x)+1');
a=input('输入一个大概区间左值a\n');
b=input('输入一个大概区间右值b\n');
y1=subs(f,a);
y2=subs(f,b);
whileb-a>q
c=(a+b)/2;
y3=subs(f,c);
ify1*y3>0
a=c;
y1=y3;
elseify1*y3<0
b=c;
else
break;
end
end
A=c;
end
代码解释:
首先将函数以图像显示在窗口里,然后根据坐标轴的网格线大致判断零点位置,根据提示输入大致的左范围和右范围。
二分法算法,即判断两坐标对应的值是否在同一侧如若在则跳出,如若不在则取两坐标的中间值代替一侧的坐标,中间值的函数值代替一侧坐标的函数值。
循环比较,根据输入的精度,步步逼近零点。
运行结果如下:
五、matlab编程初步
12.关系运算与逻辑运算
Ø关系运算符
>(大于)<(小于)>=(大于等于)
<=(小于等于)==(等于)~=(不等于)
Ø逻辑运算符
&(与)|(或)~(非)xor(异或)
13.M文件
M函数定义的注意点:
●函数名必须符合Matlab变量命名规则。
●M文件名必须与函数名相同。
●M函数文件第一行必须以funtion开头。
●函数可以调用其他函数,也可以调用自己。
●一个M文件可以定义多个函数,第一个出现的为主函数,其他的为子函数。
注意文件名与主函数名相同,子函数只能被主函数调用,而不能被该M文件外的函数或者M文件调用。
14.选择结构
例16:
分段函数的求解
function[y]=my_fun2(x)
ifx<0
y=x;
fprintf('x=%d\n',x);
fprintf('f(x)=%d\n',y);
elseifx<1&x>=0
y=x.^2;
fprintf('x=%d\n',x);
fprintf('f(x)=%d\n',y);
else
y=x.^3;
fprintf('x=%d\n',x);
fprintf('f(x)=%d\n',y);
end
注解:
分段函数的运算主要使用选择结构。
15.循环结构
例17:
求n的阶乘
function[j]=my_fun3(n)
j=1;
fori=1:
n
j=j*i;
end
end
注解:
此题主要运用了循环的思想,利用一个变量每循环一次叠加一次实现阶乘,但是需要在第一步循环开始前设置初始值。
例18:
判断一个数是不是素数
function[A]=work4(x)
x=input('请输入一个自然数x\n');
fori=2:
(x-1)
Y=mod(x,i);%x除以i取余
ifY==0
fprintf('%d不是素数!
\n',x)
break;
end
ifi==x-1
fprintf('%d是素数!
\n',x)
end
end
ifx==1||x==0
fprintf('%d不是素数!
\n',x)
end
ifx==2
fprintf('%d是素数!
\n',x)
end
end
注解:
判断素数主要是通过循环判断在2和它自身之间是否存在这个数的约数。
如果存在即不是,如果一直循环到最后都没有发现约数即返回显示这个数是素数。
例19:
行列式化成最简行列式(没有处理A(1,1)=0的情况)
functionB=work5(A)
n=size(A);%n是返回的行列数值组成的矩阵,n
(1)为行数,n
(2)为列数
fork=1:
(n
(2)-1)
fori=(k+1):
n
(1)
forj=1:
n
(2)
A(i,j)=A(i,j)+A(k,j)*(-A(i,k)/A(k,k));
end
end
end
B=A;
End
注解:
根据线性代数中所讲原理化最简行列式,本质是在化简为0时找到每一项的数与上一行的数的比值代换关系。
利用三个循环的嵌套从第一列开始,再向每一行化简。
但是此题默认第一行第一列数不为0,处理不够完善。
例20则考虑了第一行第一列数为0的情况,实用性更强。
例20:
行列式化成最简行列式(处理了A(1,1)=0的情况)
functionB=my_fun5(A)
a=size(A);
fork=1:
(a
(2)-1)
ifA(k,k)==0
i=k;
whileA(i,k)==0
i=i+1;
end
w=i;
ifw<=a
(1)
fori=1:
a
(2)
tem=A(w,i);
A(w,i)=A(k,i);
A(k,i)=tem;
end
end
end
fori=(k+1):
a
(1)
forj=1:
a
(2)
A(i,j)=A(i,j)+A(k,j)*(-A(i,k)/A(k,k));
end
end
end
B=A;
end
16.迭代结构
例21:
求n的阶乘
functionz=my_fun6(n)
iffloor(n)-n~=0
fprintf('请重新输入n的值\n');
elseifn<0
fprintf('请重新输入n的值\n');
else
ifn==0
z=1;
else
z=n*my_fun6(n-1);
end
end
end
注意:
可将此题与例17比较。
例17使用了一个变量来叠加,而此题则调用本身,其本质也是基于循环的算法。
因为阶乘的求解的实质是存在后一项需要调用前一项且计算方式都相同。
这也是迭代的存在基础。
此题还需要注意输入的数必须保证是大于0的整数否则报错!
例22:
求斐波那契数列第n项
functionf=work7(n)
iffloor(n)-n~=0
fprintf('请重新输入n的值\n');
elseifn<0
fprintf('请重新输入n的值\n');
else
ifn==0
f=0;
elseifn==1
f=1;
else
f=work7(n-1)+work7(n-2);
end
end
end
六、文件和数据的读取
Ø文本文件的读写
例:
计算当x=[01]时f(x)=e^x的值并将结果写入到文件my.txt中
x=0:
0.1:
1;
y=[x;exp(x)];%y有两行数据
fid=fopen('my.txt','w');
fprintf(fid,'%6.2f%12.8f\n',y);
fclose(fid);
例:
从上例中生成的文件中读取数据,并将结果输出到屏幕
fid=fopen('my.txt','r');
[a,count]=fscanf(fid,'%f%f',[2inf]);fprintf(1,'%f%f\n',a);
fclose(fid);
运行结果如下:
(命令行窗口显示)
Ø指针位置、文件大小
feof函数:
检测文件是否已经结束
frewind函数:
使位置指针重新返回文件的开头
fseek函数:
设置文件的位置指针
ftell函数:
用于查询当前文件指针的位置
例:
输出文件大小
fid=fopen('my.txt','r');
fseek(fid,0,'eof');%将位置指针设置到无穷远
x=ftell(fid);%查询此时指针位置
fprintf(1,'FileSize=%d\n',x);%输出的就是文件大小
frewind(fid);%将位置指针重新返回文件的开头
x=ftell(fid);
fprintf(1,'FilePosition=%d\n',x);%文件头的指针位置即0
fclose(fid);
Ø文件中的数据读取
例:
fid=fopen('my.txt','r');
while~feof(fid)%在文件没有结束时按行读取数据
s=fgets(fid);%s=fgetl(fid)显示成一行,没有读取分行符
fprintf(1,'%s',s);%s表示字符串形式
end
fclose(fid);
Ø图像、声音文件的读写
imread函数:
从文件中读入图像
A=imread(filename,fmt)
[A,map]=imread(filename,fmt)
image函数:
显示图像
imwrite函数:
将图像写入文件
imfinfo函数:
查询图像文件信息
innfo=imflnfo(filename)
wavread函数:
用于读取扩展名为“.wav”的声音文件
y=wavread(file)
[y,fs,nbits]=wavread(file)
wavwrite函数:
用于将数据写入到扩展名为“wav”的声音文件中
wavwrite(y,fs,nbits,wavefile)
wavplay函数:
利用windows音频输出设备播放声音
wavplay(y,fs)
注意:
上述几个函数中调用的文件路径要输全(包括文件名,格式)!
七、简单图形用户界面GUI
图形用户界面是指由窗口、菜单、图标、光标、按键、对话框和文本等各种图形对象组成的用户界面。
它让用户定制用户与Matlab的交互方式,而命令窗口不是唯一与Matlab的交互方式。
在命令输入窗口输入‘guide’即可打开GUI的创建与调用窗口。
选择BlankGUI(Default)(空白模板,默认)创建一个新的GUI。
界面初步设置步骤有:
将控件对象放置到布局区;
激活图形窗口;
运行GUI程序;
布局编辑器参数设置;
布局编辑器的弹出菜单;
菜单编辑器;
GUI控件有:
按钮、开关按钮、单选框、复选框、文本编辑器、静态文本框、滚动条、边框、列表框、弹出式菜单、坐标轴
八、课程总结答辩
课程总结的答辩旨在,呈现学生在这一学期对matlab课堂内容的总结,得到一个比较主观的反馈,也是自我提高的一部分。
为了达成目标,本人设计了一个关于判断并获取符合要求的素数,进行文件写入、读取和数据操作的功能。
详细代码如下:
functionb13461223()
%输入一个数,计算机筛选出这个数之前的所有素数,并将这些素数写入到文件中,根据提示对文件进行读写。
[A,k]=bb();
y=[k;A];%y有两行数据
fid=fopen('yepengfei.txt','w');%将结果写入到文件yepengfei.txt中
fprintf(fid,'%d%d\n',y);
fclose(fid);
a=input('请输入操作口令前的编号:
\n1--显示所有数据\n2--计算数据大小\n3--指定显示第几个数\n');
ifa==1
fid=fopen('yepengfei.txt','r');
while~feof(fid)%在文件没有结束时按行读取数据
s=fgets(fid);%s=fgetl(fid)显示成一行,没有读取分行符
fprintf(1,'%s',s);%s表示字符串形式
end
fclose(fid);
elseifa==2
fid=fopen('yepengfei.txt','r');
[B,count]=fscanf(fid,'%d%d',[2inf]);%count返回所读取的数据元素个数
c=count/2;
fprintf(1,'FileSize=%d\n',c);%显示数据大小
fclose(fid);
elseifa==3
d=input('请输入你要指定的数位置x\n');
fid=fopen('yepengfei.txt',