中南大学自动化胡杨系统仿真实验报告完整版.docx
《中南大学自动化胡杨系统仿真实验报告完整版.docx》由会员分享,可在线阅读,更多相关《中南大学自动化胡杨系统仿真实验报告完整版.docx(57页珍藏版)》请在冰豆网上搜索。
中南大学自动化胡杨系统仿真实验报告完整版
--------------------------------------------------------------------------作者:
_____________--------------------------------------------------------------------------日期:
_____________
中南大学自动化胡杨系统仿真实验报告完整版
中南大学
系统仿真实验报告
指导老师:
实验者:
学号:
专业班级:
完成时间:
实验一MATLAB中矩阵与多项式的基本运算
基本命令训练:
1.eye(m)
取n=3,程序如下:
>>eye(3)
ans=
100
010
001
结论:
eye(n)用于产生n×n维的单位矩阵,在这里n取3,故产生3×3维单位矩阵。
2.one(n)、ones(m,n)
对ones(n)取n=5,对ones(m,n)取m=3,n=5,程序如下:
>>ones(5)
ans=
11111
11111
11111
11111
11111
>>ones(3,5)
ans=
11111
11111
11111
结论:
ones(n)用于产生n×n维的全1矩阵,在这里n取5,故产生5行5列全1矩阵。
ones(m,n)用于产生m×n维的全1矩阵,在这里m取3,n取5,故产生3行5列的全1矩阵。
3.zeros(m,n)
取m=3,n=2,程序如下:
>>zeros(3,2)
ans=
00
00
00
结论:
zeros(m,n)用于产生m×n维全0矩阵,在这里m取3,n取2,故产生3行2列全0矩阵。
4.rand(m,n)
取m=3,n=4,程序如下:
>>rand(3,4)
ans=
0.95010.48600.45650.4447
0.23110.89130.01850.6154
0.60680.76210.82140.7919
结论:
rand(m,n)用于产生m×n维平均分布的随机矩阵,在这里m取3,n取4,故产生了3行4列的随机矩阵
5.diag(v)
先创建3×3的魔方矩阵v,在进行diag(v)运算,程序如下:
>>v=magic(3)
diag(v)
v=
816
357
492
ans=
8
5
2
结论:
diag(v)用于得到矩阵v的对角元素
6.A\B、A/B、inv(A)*B、B*inv(A)
先创建A、B两个矩阵,在进行运算,程序如下:
>>A=[1,2;3,4];
>>B=[5,6;7,8];
>>a=A\B
b=A/B
c=inv(A)*B
d=B*inv(A)
a=
-3-4
45
b=
3.0000-2.0000
2.0000-1.0000
c=
-3.0000-4.0000
4.00005.0000
d=
-1.00002.0000
-2.00003.0000
结论:
’/’表示矩阵右除,’\’表示矩阵左除,inv(A)表示求A的逆矩阵,由实验结果可知,矩阵左除与右除结果不一样,矩阵左乘与右乘结果也不一样,A\B是求AX=B的解,A/B是求XB=A的解。
所以编程求解的时候要注意区分他们的区别。
7、roots(p)
>>symsx;
>>a=3*x.^3+2*x+5;
>>p=[3,0,2,5]
>>roots(p)
p=
3025
ans=
0.5000+1.1902i
0.5000-1.1902i
-1.0000
结论:
roots(p)函数用于求多项式的根,以向量形式输入多项式的系数,对应降幂排列,然后调用函数,即可求得对应多项式的根。
8、poly
>>A=[1,2;3,4];
>>poly(A)
ans=
1.0000-5.0000-2.0000
结论:
poly(A)用于求矩阵A的特征多项式的系数
9.conv、deconv
>>A=[1,2];
>>B=[3,4];
>>a=conv(A,B)
b=deconv(A,B)
a=
3108
b=
0.3333
结论:
使用conv函数对多项式进行乘法运算,其使用格式为c=conv(a,b),其中a和b为两个多项式的系数向量,c为相乘所生成的多项式的系数向量。
使用deconv(a,b)完成除法运算。
10.A*B与A.*B的区别
>>A=[1,2];
>>B=[5,6]';
>>a=A*B
A=[1,2];
B=[5,6];
b=A.*B
a=
17
b=
512
结论:
A.*B称为“点乘”、“位乘“,即为两个行列数相同的矩阵,对应位置一一相乘,得到的结果依位置对应到结果矩阵中,而A*B为矩阵乘法,要求前者A的列数与后者B行数对应。
11.who与whos的使用
>>A=[1,2;3,4];
>>who
whos
Yourvariablesare:
A
NameSizeBytesClassAttributes
A2x232double
结论:
who给出变量的名称清单;而whos给出所有变量的详细信息。
12.disp、size(a)、length(a)的使用
>>a='helloworld';
>>disp(a)
a=[1,2,3,4];
B=size(a)
C=length(a)
helloworld
B=
14
C=
4
结论:
disp函数的作用是直接将内容输出在Matlab命令窗口中,size(a)表示矩阵每个维度的长度,length(a)表示矩阵a的最大的长度。
实验二MATLAB绘图命令
基本命令训练
1.plot2.loglog3.semilogx4.semilogy
5.polar6.title7.xlabel8.ylabel
9.text10.grid11.bar12.stairs
13.contour
1.>>t=[0:
pi/360:
2*pi*22/3];
x=93*cos(t)+36*cos(t*4.15);
y=93*sin(t)+36*sin(t*4.15);
plot(y,x),grid;
实验结果为:
>>t=[0:
pi/360:
2*pi*22/3];
x=93*cos(t)+36*cos(t*4.15);
y=93*sin(t)+36*sin(t*4.15);
plot(y,x)
实验结果为:
实验结论:
plot()用于绘制二维曲线,grid用于切换有无网格的状态。
2.t=0:
0.05:
100;
x=t;y=2*t;z=sin(2*t);
plot3(x,y,z,'b:
')
实验结果为:
实验结论:
plot3(x,y,z)用于绘制三维曲线,b表示设置曲线的颜色为蓝色,:
表示曲线线型为点线,格式为plot3(函数参数,函数参数,’曲线参数设置’)
3.t=0:
pi/20:
2*pi;
y=sin(x);
stairs(x,y)
实验结果为:
实验结论:
stairs(x,y)表示绘制出的二维曲线为阶梯图。
4.th=[pi/200:
pi/200:
2*pi]';
r=cos(2*th);
polar(th,r),grid
实验结果为:
实验结论:
polar()用于绘制二维曲线的极坐标图。
5.th=[0:
pi/10:
2*pi];
x=exp(j*th);
plot(real(x),imag(x),'r*');
grid;
实验结果为:
实验结论:
r表示设置曲线颜色为红色,*表示曲线的数据点形为星号。
6、>>x=0:
1000;
>>y=0:
1000;
>>loglog(x,y);
title('Loglog');gridon;
实验结果为:
实验结论:
loglog()用于绘制横纵轴均为对数刻度的图形,title()用于为图形添加标题,本例为添加Loglog作为标题。
7、>>x=0:
1000;
>>y=0:
1000;
>>semilogx(x,y);
title('Loglog');
gridon;
实验结果为:
将semilogx换成semilogy程序如下:
>>x=0:
1000;
>>y=0:
1000;
>>semilogy(x,y);
title('Loglog');
gridon;
实验结果为:
实验结论:
semilogx()用于绘制半对数图,其中x轴坐标为对数,若换成semilogy则表示y轴坐标为对数。
8、>>x=0:
1000;
>>y=0:
1000;
>>plot(x,y);
>>x=0:
1000;
>>y=0:
1000;
>>plot(x,y);
gridon;
xlabel('\fontsize{20}\itx\rm');
ylabel('\fontsize{20}y');
text(500,500,'中点')
实验结果为:
实验结论:
xlabel和ylabel分别表示给x轴和y轴添加标注,text(x,y,’string’)用于给图形坐标(x,y)处书写注释,本程序给x轴和y轴分别标注x,y,,在(500,500)坐标处注释“中点”。
9、>>t=0:
pi/100:
2*pi;
>>alpha=3;
>>y=sin(alpha*t);
>>bar(t,y);
gridon;
实验结果为:
实验结论:
bar(x,y)用于绘制二维条形图。
10、>>x=-8:
0.5:
8;
>>y=-8:
0.5:
8;
>>[xx,yy]=meshgrid(x,y);
>>c=sqrt(xx.^2+yy.^2)+eps;
>>z=sin(c)./c;
>>contour(xx,yy,z)
实验结果为:
实验结论:
contour(x,y,z)用于绘制等高线。
补充实验:
多窗口绘制图形subplot()
>>subplot(2,2,1);
t=[0:
pi/200:
2*pi];
y=sin(t);
plot(t,y);
subplot(2,2,2);
t=[0:
pi/200:
2*pi];
y=cos(t);
plot(t,y);
subplot(2,2,4);
t=[0:
pi/200:
2*pi];
y=t;
plot(t,y);
实验结果为:
实验结论:
本实验测试subplot()函数,由实验结果可知,subplot()函数中某一个未编写并不会影响整个函数的运行,只是未编写的那个部分不显示,其他的照常显示,比如编写了subplot(2,2,1),subplot(2,2,2),subplot(2,2,4),但是未编写subplot(2,2,3),那么结果只显示subplot(2,2,1),subplot(2,2,2),subplot(2,2,4)中的结果,而且顺序按原位置,而subplot(2,2,3)的不会显示。
实验三MATLAB程序设计
1.计算1~1000之内的斐波那契亚数列
>>f=[1,1];
>>i=1;
>>whilef(i)+f(i+1)<1000
f(i+2)=f(i)+f(i+1);
i=i+1;
end
>>f,i
f=
Columns1through10
11235813213455
Columns11through16
89144233377610987
i=
15
2.>>m=3;
>>n=4;
>>fori=1:
m
forj=1:
n
a(i,j)=1/(i+j-1);
end
end
>>formatrat
>>a
a=
11/21/31/4
1/21/31/41/5
1/31/41/51/6
3.>>m=3;
n=4;
fori=1:
m
forj=1:
n
a(i,j)=1/(i+j-1);
end
end
a
a=
10.50.333330.25
0.50.333330.250.2
0.333330.250.20.16667
实验2用了formatrat,结果为分数表示,实验3没有则用小数表示。
4、>>x=input('请输入x的值:
');
ifx<=10;
y=cos(x+1)+sqrt(x*x+1);
elseifx>15
y=x*sqrt(x+sqrt(x));
elsey=x;
end
y
请输入x的值:
10
y=
10.054
>>x=input('请输入x的值:
');
ifx<=10;
y=cos(x+1)+sqrt(x*x+1);
elseifx>15
y=x*sqrt(x+sqrt(x));
elsey=x;
end
y
请输入x的值:
11
y=
11
5、去掉多项式或数列开头的零项
.>>p=[0001302009];
fori=1:
length(p),ifp
(1)==0,p=p(2:
length(p));
end;
end;
p
p=
1302009
6、建立MATLAB的函数文件,程序代码如下,以文件名ex2_4.m存盘
点击File-New-Function建立文件,文件名为ex2_4.m,结果如下:
在MATLAB的命令窗口输入ex2_4(200),得到运行结果:
>>ex2_4(200)
ans=
1123581321345589144
在MATLAB的命令窗口输入lookforffibno,得到结果:
>>lookforffibno
ex2_4-ffibno计算斐波那契亚数列的函数文件
在MATLAB的命令窗口输入helpex2_4,得到结果:
>>helpex2_4
ffibno计算斐波那契亚数列的函数文件
n可取任意自然数
程序如下
3、程序设计题
functionsushu
n=input('请输入一个数n:
');
if(n==1)
fprintf('1既不是素数也不是合数\n');
disp('是否继续?
');
disp('1.是;2.否');
b=input('');
ifb==1
sushu;
else
disp('谢谢使用!
');
break;
end
end
if(n==2)
fprintf('2是素数\n');
disp('是否继续?
');
disp('1.是;2.否');
b=input('');
ifb==1
sushu;
else
disp('谢谢使用!
');
break;
end
end
if(n==3)
fprintf('3是素数\n');
disp('是否继续?
');
disp('1.是;2.否');
b=input('');
ifb==1
sushu;
else
disp('谢谢使用!
');
break;
end
end
if(n>3)
fori=2:
(n-1)
ifmod(n,i)==0
a=n/i;
t=0;
fprintf('%d=%d*%d\n',n,a,i);
elset=1;
end
end
if(t==1)
cleart;
fprintf('%d不是素数\n',n);
else
fprintf('%d是素数\n',n);
cleart;
end
disp('是否继续?
');
disp('1.是;2.否');
b=input('');
ifb==1
sushu;
else
disp('谢谢使用!
');
end
end
运行结果为:
>>sushu
请输入一个数n:
1
1既不是素数也不是合数
是否继续?
1.是;2.否
1
请输入一个数n:
2
2是素数
是否继续?
1.是;2.否
1
请输入一个数n:
38
38=19*2
38=2*19
38不是素数
是否继续?
1.是;2.否
1
请输入一个数n:
23
23不是素数
是否继续?
1.是;2.否
2
谢谢使用!
实验四MATLAB的符号计算与SIMULINK的使用
程序举例
1.求矩阵对应的行列式和特征根
>>a=sym('[1001]');
>>da=det(a)
ea=eig(a)
da=
1
ea=
1
实验结论:
det()函数用于计算矩阵对于的行列式的值,eig()函数用于计算矩阵的特征值和特征向量
2.求方程的解(包括精确解和一定精度的解)
>>r1=solve('x^2-x-1')
rv=vpa(r1)
rv4=vpa(r1,4)
rv20=vpa(r1,20)
r1=
1/2-5^(1/2)/2
5^(1/2)/2+1/2
rv=
rv4=
-0.618
1.618
rv20=
实验结论:
vpa(s,n)称为变精度算法函数,表示将s表示为n位有效数的符号对象
3、>>a=sym('a');b=sym('b');c=sym('c');d=sym('d');%定义4个符号变量
w=10;x=5;y=-8;z=11;%定义4个数值变量
A=[a,b;c,d]%建立符号矩阵A
B=[w,x;y,z]%建立数值矩阵B
det(A)%计算符号矩阵A的行列式
det(B)%计算数值矩阵B的行列式
A=
[a,b]
[c,d]
B=
105
-811
ans=
a*d-b*c
ans=
150
4、>>symsxy;
s=(-7*x^2-8*y^2)*(-x^2+3*y^2);
expand(s)%对s展开
collect(s,x)%对s按变量x合并同类项(无同类项)
factor(ans)%对ans分解因式
ans=
7*x^4-13*x^2*y^2-24*y^4
ans=
7*x^4+(-13*y^2)*x^2-24*y^4
ans=
(7*x^2+8*y^2)*(x^2-3*y^2)
实验结论:
expand函数用于多项式的展开运算,collect函数用于符号表达式的展开运算和合并同类项,factor用于对函数进行因式分解。
5、对方程AX=b求解
>>A=[34,8,4;3,34,3;3,6,8];
b=[4;6;2];
X=linsolve(A,b)%调用linsolve函数求解
A\b%用另一种方法求解
X=
0.067482
0.16137
0.10367
ans=
0.067482
0.16137
0.10367
实验结论:
运用linsove(A,b)与A\b结果一样,都用于对AX=b进行求解
6、对方程组求解
>>a11*x1+a12*x2+a13*x3=b1
a21*x1+a22*x2+a23*x3=b2
a31*x1+a32*x2+a33*x3=b3
A=[a11,a12,a13;a21,a22,a23;a31,a32,a33];
b=[b1;b2;b3];
XX=A\b
XX=
(a12*a23*b3-a12*b2*a33+a13*a32*b2-a13*a22*b3+b1*a22*a33-b1*a32*a23)/(a11*a22*a33-a11*a32*a23-a21*a12*a33+a32*a21*a13-a22*a31*a13+a31*a12*a23)-(a11*a23*b3-a11*b2*a33-a21*a13*b3-a23*a31*b1+b2*a31*a13+a21*b1*a33)/(a11*a22*a33-a11*a32*a23-a21*a12*a33+a32*a21*a13-a22*a31*a13+a31*a12*a23)(a32*a21*b1-a11*a32*b2+a11*a22*b3-a22*a31*b1-a21*a12*b3+a31*a12*b2)/(a11*a22*a33-a11*a32*a23-a21*a12*a33+a32*a21*a13-a22*a31*a13+a31*a12*a23)
7、>>symsabtxyz;
f=sqrt(1+exp(x));
diff(f)%未指定求导变量和阶数,按缺省规则处理
f=x*cos(x);
diff(f,x,2)%求f对x的二阶导数
diff(f,x,3)%求f对x的三阶导数
f1=a*cos(t);f2=b*sin(t);
diff(f2)/diff(f1)%按参数方程求导公式求y对x的导数
ans=
exp(x)/(2*(exp(x)+1)^(1/2))
ans=
-2*sin(x)-x*cos(x)
ans=
x*sin(x)-3*cos(x)
ans=
-(b*cos(t))/(a*sin(t))
3、SIMULINK的使用
选择合适子模块构造控制系统如下:
选择Simulation菜单下的start命令运行仿真,在示波器(Scope)中观察结果:
R(s)为阶跃输入,C(s)为输出
实验结果为:
实验五MATLAB在控制系统分析中的应用
基本命令
1.step2.impulse3.initial4.lsim5.rlocfind
6.bode7.margin8.nyquist9.Nichols10.cloop
1、求下面系统的单位阶跃响应
>