成绩:______
实验报告
课程名称: 现代控制理论基础
实验名称:线性系统理论上机实验
院 (系): 信控学院
专业班级: 自动化1001
姓 名:
学 号:
指导教师: 嵇启春
年 月 日
实验一:MATLAB运算基础
日期: 20## 年 3月 9日
评分:_________ 批阅教师签字:________
班级:自动化1001
姓名:韩永龙 学号:100610106
一、实验目的
1. 熟悉启动和退出MATLAB的方法。
2. 熟悉MATLAB命令窗口的组成。
3. 掌握建立矩阵的方法。
4. 掌握MATLAB各种表达式的书写规则以及常用函数的使用。
二、实验环境
MATLAB 6.5 开发平台
三、实验内容
1. 先求下列表达式的值,然后显示MATLAB工作空间的使用情况并保存全部变量。
(1)z=(2)z=ln(x+) , 其中x=
(3)z=sin(a+0.3)+ln ,a=-3.0,-2.9,-2.8,…,2.8,2.9,3.0(提示:利用冒号表达式生成a向量,求个点的函数值时用点乘运算。)
(4)z= ,其中t=0:0.5:2.5(提示:用逻辑表达式求分段函数值。)
2. 已知:
A= B=
求下列表达式的值:
(1) A+6*B和A-B+I(其中I为单位矩阵)
(2) A*B和A.*B
(3) A^3和A.^3
(4) A/B及B\A
(5) [A,B]和[A([1,3], : );B^2]
3. 设有矩阵A和B
A= B=
(1) 求它们的乘积C。
(2) 将矩阵C的右下角3*2子矩阵赋给D。
(3) 查看MATLAB工作空间的使用情况。
4. 完成下列操作:
(1) 求[100,999]之间能被21整除的数的个数。
提示:先利用冒号表达式,再利用find和length函数。
(2) 建立一个字符串向量,删除其中的大写字母。
提示:利用find函数和空矩阵。
四、实验的程序代码
先求下列表达式的值,然后显示MATLAB工作空间的使用情况并保存全部变量。
(1)z1=2*sin(85*pi/180)/(1+exp(2))
z1 =
0.2375
(2)x=[2 1+2i;-0.45 5];
z2=log(x+sqrt(1+x.^2))/2
z2 =
0.7218 0.7347 + 0.5317i
-0.2180 1.1562
(3)a=-3:0.1:3
z3=(exp(0.3*a)-exp(-0.3*a)).*sin(a+0.3)+log((0.3+a)/2)
(4)t=0:0.5:2.5
z4=(0<=t&t<1).*t.*t+(1<=t&t<2).*(t.^2-1)+(2<=t&t<3).*(t.^2-2*t+1)
显示工作空间的变量和变量值
a 1x61 488 double array
t 1x6 48 double array
x 2x2 64 double array (complex)
z1 1x1 8 double array
z2 2x2 64 double array (complex)
z3 1x61 976 double array (complex)
z4 1x6 48 double array
保存全部变量
save mydata %将工作空间全部变量保存到mydata.mat文件中
2.已知
A=[12 34 -4;34 7 87;3 65 7]
B=[1 3 -1;2 0 3;3 -2 7]
(1)
A+6*B
ans =
18 52 -10
46 7 105
21 53 49
A-B+eye(size(A))
ans =
12 31 -3
32 8 84
0 67 1
(2)
A*B
ans =
68 44 62
309 -72 596
154 -5 241
A.*B
ans =
12 102 4
68 0 261
9 -130 49
(3)
A^3
ans =
37226 233824 48604
247370 149188 600766
78688 454142 118820
A.^3
ans =
1728 39304 -64
39304 343 658503
27 274625 343
(4)
A/B
ans =
16.4000 -13.6000 7.6000
35.8000 -76.2000 50.2000
67.0000 -134.0000 68.0000
B\A
ans =
109.4000 -131.2000 322.8000
-53.0000 85.0000 -171.0000
-61.6000 89.8000 -186.2000
(5)
[A,B]
ans =
12 34 -4 1 3 -1
34 7 87 2 0 3
3 65 7 3 -2 7
[A([1,3],:);B^2]
ans =
12 34 -4
3 65 7
4 5 1
11 0 19
20 -5 40
3.已知矩阵:
A=[1 2 3 4 5;6 7 8 9 10;11 12 13 14 15;16 17 18 19 20;21 22 23 24 25]
B=[3 0 16;17 -6 9;0 23 -4;9 7 0;4 13 11]
(1)
C=A*B
C =
93 150 77
258 335 237
423 520 397
588 705 557
753 890 717
(2)
D=C(3:5,2:3)
D =
520 397
705 557
890 717
4.完成下列操作:
(1)
ind=find(rem(x,21)==0)
length(ind)
ans =
43
或者用一下程序
x=x(find(rem(x,21)==0))
x =
Columns 1 through 21
105 126 147 168 189 210 231 252 273 294 315 336 357 378 399 420 441 462 483 504 525
Columns 22 through 42
546 567 588 609 630 651 672 693 714 735 756 777 798 819 840 861 882 903 924 945 966
Column 43
987
length(x)
ans =
43
(2)
str='adodfjoAWEREOTPET'
k=find(str>='A'&str<='Z')
str(k)=[]
五、实验小结
通过这次实验我熟悉了启动和退出MATLAB的方法,熟悉了MATLAB命令窗口的组成,掌握了建立矩阵的方法掌握MATLAB各种表达式的书写规则以及常用函数的使用。熟练启动、退出MATLAB的方法以及MATLAB命令窗口的组成。而且熟悉了建立矩阵的方法和MATLAB各种表达式的书写规则以及常用函数的使用。
实验二:MATLAB矩阵分析与处理
日期: 20## 年 3月11 日
评分:_________ 批阅教师签字:________
班级:自动化1001
姓名:韩永龙 学号:100610106
一、实验目的
1.掌握生成特殊矩阵的方法。
2.掌握矩阵分析的方法。
3.用矩阵求逆发解线性方程组。
二、实验环境
MATLAB6.5开发平台
三、实验内容
1.设有分块矩阵A=,其中E、R、O、S分别为单位矩阵、随机矩阵、零矩阵和对角阵,试通过数值计算验证A=。
3.建立一个55矩阵,求它的行列式、迹、秩和范数。
4.已知A=,求A的特征值及特征向量,并分析其数学意义。
5.下面是一个线性方程组:=
(1)求方程组的解。
(2)将方程组右边元素b改为0.53,在求解,并比较b的变化和解的相对变化。
(3)计算系数矩阵A的条件数并分析结论。
四、实验的程序代码
1.
E=eye(3,3)
R=rand(3,2)
O=zeros(2,3)
S=diag([1,1]) 或者S=diag(1:2)
A=[E R;O S]
A =
1.0000 0 0 0.4103 0.3529
0 1.0000 0 0.8936 0.8132
0 0 1.0000 0.0579 0.0099
0 0 0 1.0000 0
0 0 0 0 1.0000
>> A^2
ans =
1.0000 0 0 0.8205 0.7057
0 1.0000 0 1.7873 1.6263
0 0 1.0000 0.1158 0.0197
0 0 0 1.0000 0
0 0 0 0 1.0000
[E R+R*S;O S*S]
ans =
1.0000 0 0 0.8205 0.7057
0 1.0000 0 1.7873 1.6263
0 0 1.0000 0.1158 0.0197
0 0 0 1.0000 0
0 0 0 0 1.0000
3.
A=rand(5,5)
A =
0.1389 0.1988 0.4660 0.6721 0.8318
0.2028 0.0153 0.4186 0.8381 0.5028
0.1987 0.7468 0.8462 0.0196 0.7095
0.6038 0.4451 0.5252 0.6813 0.4289
0.2722 0.9318 0.2026 0.3795 0.3046
>> det(A)
ans =
-0.0627
>> trace(A)
ans =
1.9863
rank(A)
ans =
5
>> a1=norm(A,1)
a1 =
2.7776
a2=norm(A,2)
a2 =
2.3766
>> ainf=norm(A,inf)
ainf =
2.6842
4、
A=[-29 6 18;20 5 12;-8 8 5]
A =
-29 6 18
20 5 12
-8 8 5
>> [V,D]=eig(A)
V =
0.7130 0.2803 0.2733
-0.6084 -0.7867 0.8725
0.3487 0.5501 0.4050
D =
-25.3169 0 0
0 -10.5182 0
0 0 16.8351
5.
A=[1/2 1/3 1/4;1/3 1/4 1/5;1/4 1/5 1/6]
b=[0.95 0.67 0.52]'
A =
0.5000 0.3333 0.2500
0.3333 0.2500 0.2000
0.2500 0.2000 0.1667
b =
0.9500
0.6700
0.5200
x=A\b
x =
1.2000
0.6000
0.6000
(2)
b(3)=0.53
b =
0.9500
0.6700
0.5300
>> x=inv(A)*b
x =
3.0000
-6.6000
6.6000
(3)
cond(A,1)
ans =
2.0150e+003
cond(A,2)
ans =
1.3533e+003
>> cond(A,inf)
ans =
2.0150e+003
分析:矩阵A的条件数远远大于1,说明矩阵A是个病态矩阵,矩阵元素的轻微变化会引起解的很大变化
五、实验小结
通过这次试验我掌握了生成特殊矩阵的方法和矩阵分析的方法并且会用矩阵求逆法解线性方程组,熟悉了生成特殊矩阵的方法以及矩阵分析的方法,还有用矩阵求逆发解线性方程组。
实验三:选择结构程序设计
日期: 20## 年 3月16日
评分:_________ 批阅教师签字:________
班级:自动化1001
姓名:韩永龙 学号:100610106
一、实验目的
1.掌握建立和执行M文件的方法。
2.掌握利用if语句事先选择结构的方法。
3.掌握利用switch语句实现多分支选择结构的方法。
4.掌握try语句的使用。
二、实验环境
MATLAB6.5开发平台
三、实验内容
1.求分段函数的值。
y= ,用if语句实现,分别输出x=-5.0,-3.0,1.0,2.0,2.5,3.0,5.0时的y值。
2.输入一个百分制成绩,要求输出成绩等级A、B、C、D、E。其中90分~100分为A,80分~89分为B,70分~79分为C,60分~69分为D,60分已下为E。
要求:(1)分别用if语句和switch语句实现。
a) 输入百分制成绩后要判断该成绩的合理性,对不合理的成绩应输出错误信息。
3. 硅谷公司员工的工资计算方法如下:
(1) 工资时数超过120小时者,超过部分加分15%。
(2) 工资时数低于60小时者,扣发700元。
(3) 其余按每小时84元计发。
试编程按输入的工号和该号员工的工时数,计算应发工资。
4. 设计程序,完成俩位数的加、减、乘、除四则运算,即产生俩个俩位随机整数,在输入一个运算符号,做相应的运算,并显示相应的结果。
建立56矩阵,要求输出矩阵第n行元素。当n值超过矩阵的行数时,自动转化为输出矩阵最后一行元素,并给出出错信息。
四、实验的程序代码
1.
for x=[-5,-3,1,2,2.5,3,5]
if x<0 & x~=-3
y=x.*x+x-6;
elseif x>=0 & x<5 & x~=2 & x~=3
y=x.*x-5*x+6;
else
y=x.^2-x-1;
end
y
end
y =
14
y =
11
y =
2
y =
1
y =
-0.2500
y =
5
y =
19
2.
(1)用if语句实现:
x=input('请输入一个成绩');
if x<=100 & x>=90
disp('成绩等级为:A');
elseif x<90 & x>=80
disp('成绩等级为:B');
elseif x<80 & x>=70
disp('成绩等级为:C');
elseif x>=60 & x<70
disp('成绩等级为:D');
elseif x>=0 & x<60
disp('不及格');
else
disp('输入的成绩不合理')
end
用switch语句实现:
x=input('请输入一个成绩');
switch floor(x/10)
case {9,10}
disp('成绩等级为:A');
case {8}
disp('成绩等级为:B');
case {7}
disp('成绩等级为:C');
case {6}
disp('成绩等级为:D');
case {0,1,2,3,4,5}
disp('不及格');
otherwise
disp('输入的成绩不合理')
end
3.
x=input('请输入工号');
y=input('请输入该员工工时数');
if y>120
gongzi=120*84+(y-120)*84*(1+0.15)
elseif y<60
gongzi=y*84-700;
else
gongzi=y*84;
end
if gongzi<0
gongzi=0;
end
disp('应发的工资是')
gongzhi
4.
(1)
x=floor(rand(2,1)*89)+10;
sign=input('请输入标点符号:');
x=int2str(x);
expression=strcat(x(1),sign, x(2))
eval(expression)
(2)
x=floor(rand(2,1)*89)+10;
sign=input('请输入标点符号:');
switch sign
case {'+'}
result=x(1)+x(2);
case {'-'}
result=x(1)-x(2);
case {'*'}
result=x(1)*x(2);
case {'/'}
result=x(1)/x(2);
otherwise
disp('输入错误')
end
disp([num2str(x(1)) sign num2str(x(2)),'的结果是',num2str(result)])
5.
A=rand(5,6)
n=input('please enter number n')
if (n>size(A,1))
n=size(A,1)
disp('n larger than the row of matrix A')
end
B=A(n,:)
六、实验小结
通过这次试验我掌握了建立和执行M文件的方法;掌握了利用if语句实现选择结构的方法;掌握了利用switch语句实现多分支选择结构的方法和try语句的使用。
实验四:循环结构程序设计
日期: 20## 年 3月18日
评分:_________ 批阅教师签字:________
班级:自动化1001
姓名:韩永龙 学号:100610106
一、实验目的
1.掌握for语句实现循环结构的方法。
2.掌握利用while语句实现循环结构的方法。
3.熟悉利用向量运算来代替循环操作的方法。
二、实验环境
MATLAB6.5开发平台
三、实验内容
1.根据=+++…+,求的近似值。当n分别取100、1000、10 000时,结果是多少?(要求:分别用循环结构和向量运算(使用sum函数)来实现。)
2.根据y=1+++…+,求:
(1)y<3时的最大n值。(2)与(1)对应的y值。
4.已知
求f~f中:
(1)最大值、最小值、各数之和。(2)正数、零、负数的个数
四、实验的程序代码
1.
(1)
for n=[100,1000,10000]
sum=0;
for x=1:n
sum=sum+1/(x.^2);
end
value=sqrt(6*sum)
end
value =
3.1321
value =
3.1406
value =
3.1415
(2)
for n=[100,1000,10000]
x=1:n;
value=sqrt(6*sum(1./x./x))
end
2.
y=0;
n=1;
while y<3
y=y+1/(2*n-1);
n=n+1;
end
y=y-1/(n-1)
n=n-1
y =
2.9946
n =
113
4.
f1=1;
f2=0;
f3=1;
f=[f1,f2,f3];
for n=4:100
f4=f3-2*f2+f1;
f=[f f4];
f1=f2;
f2=f3;
f3=f4;
end
f
maxvalue=max(f);
minvalue=min(f);
sumvalue=sum(f);
disp(['最大值是:',num2str(maxvalue)])
disp(['最小值是:',num2str(minvalue)])
disp(['各数和是:',num2str(sumvalue)])
zhengshu=length(find(f>0))
fushu=length(find(f<0))
zeroshu=length(find(f==0))
五、实验小结
通过这次实验我掌握了利用for和while语句来实现循环结构的方法并且熟悉了利用向量运算来代替循环操作的方法,熟悉了for语句实现循环结构的方法以及利用while语句实现循环结构的方法,还有利用向量运算来代替循环操作的方法。
实验五:函数文件
日期: 20## 年 3月23日
评分:_________ 批阅教师签字:________
班级:自动化1001
姓名:韩永龙 学号:100610106
一、实验目的
1.理解函数文件的概念。
2.掌握定义和调用MATLAB函数的方法。
二、实验环境
MATLAB6.5开发平台
三、实验内容
1.定义一个函数文件,求给定复数的指数、对数、正弦和余弦,并在命令文件中调用该函数文件。
2.一个物理系统可用下列方程组来表示:
=
从键盘收入m、m和的值,求a、a、N和N的值。其中g取9.8,输入时以角度为单位。(要求:定义一个求解线性方程组AX=B的函数文件,然后在命令文件中调用该函数文件。
3.一个自然数是素数,且它的数字位置经过任意对换后仍为素数,则称是绝对素数。例如13是绝对素数。试求所有俩位绝对素数。(要求:定义一个判断素数的函数文件。)
四、实验的程序代码
1. 函数文件如下:
function [expval,logval,sinval,cosval]=fushu(x)
%FUSHU compute fushu value
expval=exp(x);
logval=log(x);
sinval=sin(x);
cosval=cos(x);
disp(['复数e的指数是:',num2str(expval)])
disp(['复数e的对数是:',num2str(logval)])
disp(['复数e的正弦是:',num2str(sinval)])
disp(['复数e的余弦是:',num2str(cosval)])
命令文件diaoyongfushu.m
x=1+2i
[expval,logval,sinval,cosval]=fushu(x)
2.
function J=jiefangcheng(m1,m2,m3)
H=[m1*cos(m3*pi/180) -m1 -sin(m3*pi/180) 0
m1*sin(m3*pi/180) 0 cos(m3*pi/180) 0
0 m2 -sin(m3*pi/180) 0
0 0 -cos(m3*pi/180) 1];
K=[0;m1*9.8;0;m2*9.8];
J=inv(H)*K;
disp(['方程组的解是:',num2str(J')])
主程序:
m1=input('m1=');
m2=input('m2=');
m3=input('m3=');
J=jiefangcheng(m1,m2,m3);
3.
function a=sushu(b)
%juedui sushu
x=fix(b/10);
y=rem(b,10);
a=10*y+x;
signab=0;
a2=floor(a/2);
b2=floor(b/2);
for m=2:b2
if rem(b,m)==0
signab=signab+1;
end
end
for n=2:a2
if rem(a,n)==0
signab=signab+1;
end
end
if signab==0
a=b;
else
a=0; %这里赋值0,表示不是素数
end
命令文件
liangweisushu=[];
for n=10:99
[a]=sushu(n);
if a>0
liangweisushu=[liangweisushu,a];
end
end
disp(['所有的两位绝对素数是:',num2str(liangweisushu)])
五、实验小结
通过这次实验我掌握了函数文件的概念以及定义和调用MATLAB函数的方法。
在实验过程中我发现了自己存在的问题以及自己在哪些地方不熟悉的需要加强,实验可以发现一些平时没有的知识,找到哪些地方需要巩固。
多上机。多学些实践操作的知识。
实验六:高层绘图操作
日期: 20## 年 3月20日
评分:_________ 批阅教师签字:________
班级:自动化1001
姓名:韩永龙 学号:100610106
一、实验目的
1.掌握绘制二维图形的常用函数。
2.掌握绘图三维图形的常用函数。
3.掌握绘制图形的辅助操作。
二、实验环境
MATLAB6.5开发平台
三、实验内容
1.cosx,在x=0~2区间取101点,绘制函数的曲线。
2.已知y1=x,y2=cos(2x),y3=y1y2,完成下列操作:
(1)在同一坐标系下用不同的颜色和线型绘制三条曲线。
(2)以子图形式绘制三条曲线。
(3)分别用条形图、阶梯图、杆图和填充图绘制三条曲线。
3.已知
y= 在-5x5区间绘制函数曲线。
4.绘制极坐标曲线=asin(b+n),并分析参数a、b、n对曲线形状的影响。
四、实验的程序代码
1.
x=linspace(0,2*pi,101)
y=(0.5+3*sin(x)./(1+x.*x)).*cos(x)
plot(x,y)
2.
(1)
clear all
x=linspace(-2*pi,2*pi,500);
y1=x.^2;
y2=cos(2*x);
y3=y1.*y2;
plot(x,y1,'r:',x,y2,'b-',x,y3,'k.-')
(2)
clear all
x=linspace(-2*pi,2*pi,500);
y1=x.^2;
y2=cos(2*x);
y3=y1.*y2;
subplot(3,1,1);
plot(x,y1);
subplot(3,1,2);
plot(x,y2);
subplot(3,1,3);
plot(x,y3);
3.
x=-5:0.01:5
y=(x+sqrt(pi))/exp(2).*(x<=0)+1/2*log(x+sqrt(1+x.^2)).*(x>0)
plot(x,y)
4.
clear all
a=input('请输入一个数a:');
b=input('请输入一个数b:');
n=input('请输入一个数n:');
theta=linspace(0,2*pi,500);
rho=a*sin(b+n.*theta);
polar(theta,rho);
五、实验小结
通过这次实验我掌握了绘制二维图形的常用函数和
绘制三维图形的常用函数以及绘制图形的辅助操作。