(完整版)matlab第六讲教案
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
西南科技大学本科生课程备课教案
计算机技术在安全工程中的应用
——Matlab入门及应用
授课教师:徐中慧
班级:
专业:安全技术及工程
第六章 逻辑函数与控制结构
课型:新授课
教具:多媒体教学设备,matlab 教学软件
一、目标与要求
能够正确使用函数find ,正解和正确使用if/else 系列命令,理解switch/case 结构,正确使用for 循环和while 循环。
二、教学重点与难点
本堂课教学的重点在于引导学生在编写matlab 程序时能够熟练运用控制结构的相关函数实现相应的功能。
三、教学方法
本课程主要通过讲授法、演示法、练习法等相结合的方法来引导学生掌控本堂课的学习内容。
四、教学内容
上机内容回顾
(1)创建温度换算表。
下列等式描述了华氏温度(T F )、摄氏温度(T C )、开氏温度(T K )和兰金温度(T R )之间的换算关系:
00959
5459.6732F R F C R K
T T R
T T F T T =-=+=
根据表达式解答以下问题:
(a )创建数据表,把00F 到2000F 的华氏温度换算成开氏温度。
由用户输入华氏温度的步长,用disp 和fprintf 给表格添加标题和表头并输出格式化数据。
x=input('请输入步长');
tf=0:x:200;
tk=5/9*(tf+459.67);
disp(' 温度换算表');disp('华氏 开氏');
fprintf('%3.0f %6.2f\n',[tf;tk])
请输入步长20
温度换算表
华氏 开氏
0 255.37
20 266.48
40 277.59
60 288.71
80 299.82
120 322.04
140 333.15
160 344.26
180 355.37
200 366.48
>>
(b)创建一个有25行数据的表,把摄氏温度换算成兰金温度。
由用户输入起始温度和合适的步长,用disp和fprintf给表格添加标题和表头并输出格式化数据。
x=input('请输入起始摄氏温度');
y=input('请输入步长');
tc=x:y:x+24*y;
tr=9/5*tc+32+459.67;
disp(' 温度换算表');disp('摄氏兰金');
fprintf('%3.0f %6.2f\n',[tc;tr])
请输入起始摄氏温度0
请输入步长20
温度换算表
摄氏兰金
0 491.67
20 527.67
40 563.67
60 599.67
80 635.67
100 671.67
120 707.67
140 743.67
160 779.67
180 815.67
200 851.67
220 887.67
240 923.67
260 959.67
280 995.67
300 1031.67
320 1067.67
340 1103.67
360 1139.67
380 1175.67
400 1211.67
420 1247.67
440 1283.67
460 1319.67
480 1355.67
>>
(c)创建数据表,把摄氏温度换算成华氏温度。
由用户输入起始温度、步长和数据的行数。
用disp
m=input('请输入起始摄氏温度');
n=input('请输入步长');
w=input('请输入数据的行数')
tc=m:n:m+(w-1)*n;
tf=9/5*tc+32;
disp(' 温度换算表');disp('摄氏 华氏');
fprintf('%3.0f %6.2f\n',[tc;tf])
请输入起始摄氏温度0
请输入步长10
请输入数据的行数5
w =
5
温度换算表
摄氏 华氏
0 32.00
10 50.00
20 68.00
30 86.00
40 104.00
>>
(2)在t=0时刻,火箭的发动机关闭,此时火箭的海拔高度为500m ,提升速度为125m/s 。
考虑重力加速度,火箭的高度是时间的函数:
29.8
2()125500,0h t t t t =-++f
计算时间在0到30秒内火箭的高度,并画出曲线:
● 用函数ginput 估算火箭的最大高度和火箭返回地面的时间。
● t=0:30;
● h=-9.8/2*t.^2+125*t+500;
● plot(t,h)
● axis([0,30,0,1500])
● [x,y]=ginput(4)
● m=max(y)
● [a,b]=ginput(4)
● n=mean(a)
x =
11.9931
12.5461
12.7535
12.4770
y =
1.0e+003 *
1.2917
1.2917
1.2961
1.2961
1.2961e+003
a =
29.0668
29.0668
28.9286
29.2742
b =
-2.1930
2.1930
2.1930
2.1930
n =
29.0841
●用disp把结果在命令窗口显示出来。
disp('火箭的最大高度(单位/m):');disp(m)
disp('火箭返回地面的时间(单位/s):');disp(n)
火箭的最大高度(单位/m):
1.2961e+003
火箭返回地面的时间(单位/s):
29.0841
(3)完成下面的问题,用ginput在图形上截取数据:
●绘制一个圆形并定义角度数组,范围在0到2π之间,步长为π/100。
●用ginput在圆周上截取两个点。
●用hold on保持图形,用直线连接刚刚截取两个点。
●用勾股定理计算两点间距离。
m=0:pi/100:2*pi;
x=sin(m);y=cos(m);
plot(x,y)
hold on
axis([-1,1,-1,1])
[a1,b1]=ginput(1);
[a2,b2]=ginput(1);
c=[a1 a2];d=[b1 b2];
plot(c,d)
z =
1.9928
一、逻辑函数——find
命令find用于查找矩阵中符合某种条件的元素。
例如,美国海军学院要求招收学员的身高必须高于66,假设拟招学员的身高为:
height=[63 67 65 72 69 78 75];
用find命令查找符合身高要求的元素序号:
accept=find(height>=66)
accept =
2 4 5 6 7
函数find输出矩阵中符合要求的元素序号。
若需要查看身高的数值,可以用元素序号调出该元素height(accept)
ans =
67 72 69 78 75
为了增加输出结果的可读性,使用函数disp和fprintf显示输出结果:
The following candidates meet the height requirement
Candidate # 2 is 67 inches tall
Candidate # 4 is 72 inches tall
Candidate # 5 is 69 inches tall
Candidate # 6 is 78 inches tall
Candidate # 7 is 75 inches tall
完整代码:
height=[63 67 65 72 69 78 75];
accept=find(height>=66)
height(accept)
disp('The following candidates meet the height requirement');
fprintf('Candidate # %4.0f is %4.0f inches tall\n',[accept;height(accept)])
使用逻辑运算符可以创建更加复杂的搜索条件。
例如:除身高外,还要求学员的年龄必须在18岁到35岁之间。
身高,英寸年龄身高,英寸年龄
63 18 69 36
67 19 78 34
65 18 75 12
程序代码:
applicants=[63 18;67 19;65 18;72 20;69 36;78 34;75 12];
pass=find(applicants(:,1)>=66 & applicants(:,2)>=18 & applicants(:,2)<=35)
result=[pass,applicants(pass,1),applicants(pass,2)]';
fprintf('Application # %4.0f is %4.0f inches tall and %4.0f years old\n',result)
在前面的例题中,只输出了符合条件元素的单一序号。
如果采用下面的语法结构调用函数find 可以输出符合条件元素的行、列号。
[row,col]=find(criteria)
假设用一个矩阵表示门诊病人的体温。
查找体温高于98.6的病人的序号
95.3100.298.697.499.298.9100.199.397.0temp ⎧⎫⎪⎪=⎨⎬⎪⎪⎩⎭
程序代码:
temp=[95.3 100.2 98.6 97.4 99.2 98.9 100.1 99.3 97]
element=find(temp>98.6)
[row,col]=find(temp>98.6)
fprintf('Patient %4.0f at station %4.0f had a temp of %6.1f \n',[row,col,temp(element)]')
二、选择结构
(1)简单的if 语句
if 语句的语法结构:
if 逻辑表达式
程序行
end
如果比较结果(逻辑表达式)为true ,那么执行if 语句和end 语句之间的程序代码。
若比较结果为false ,则程序直接跳转到end 之后的语句。
(2)if/else 结构
在if/else 结构中,若条件满足,则执行某段程序;若条件不满足,则执行另外一段程序。
例如:在编写计算变量x 对数的程序。
根据初等数学中的概念可知函数log 的输入参数必须大于0。
在程序中使用if/else 结构,保证输入参数为正数时才计算x 的对数值。
若输入参数为0或负数,则输出错误信息: if x>0
y=log(x) else
disp('The input to the log function must be postive')
end
如果x 为矩阵,则只有当矩阵中所有元素都满足条件时,比较结果才为true 。
Eg: 如果输入
x=0:0.5:2;
则因为输入向量并非所有元素都大于0,因此则Matlab 会跳转到else 部分,输出错误信息。
在if/else 语句中使用矢量会有很大的局限性,因此最好使用标量
提示
在程序中,使用函数beep可以发出‘‘嘟嘟’’,用于提示用户出现错误。
x=input('Enter a value of x greater than 0: ');
if x>0
y=log(x)
else
beep
disp('The input to the log function must be positive')
end
(3)elseif结构
在if/else结构中如果有多层嵌套,就会很难判断到底应该执行哪段程序。
如果在程序中使用函数elseif,程序代码就会变得更容易理解。
下面这段程序可以根据申请人的年龄判定是否发放驾驶执照:age=input('Enter a value of age: ')
if age<16
disp('Sorry-You''ll have to wait')
elseif age<18
disp('You may have a youth license')
elseif age<70
disp('You may have a standard license')
else disp('Drivers over 70 require a special license')
end
在这个例子中,Matlab首先检查申请人年龄是否小于16岁即age<16。
如果表达式为true,则执行下一条语句,显示信息Sorry-You''ll have to wait,然后退出if结构。
如果比较结果为false,Matlab对后面的elseif语句进行判断,检查年龄是否小于18岁即age<18。
如果elseif比较结果为true,则显示You may have a youth license,………………。
注:在这段程序中,如果age是标题就很容易理解。
如果age为矩阵,则要求矩阵中所有元素必须都满足条件。
假如:年龄矩阵为
age=[15 17 25 55 75]
矩阵中并非所有元素都满足条件,因此第一个判断语句if age<16为false。
同理,第二个判断语句esleif age<18和第三个判断语句esleif age<70都是false。
最后只能输出Drivers over 70 require a special license,这样结果就会使符合条件的申请人得不到驾驶执照。
提示
初学者常常会把if语句中的条件写得过于烦琐。
在前面的例子中,第二个条件语句用age<18表示就足够了,不需要表示成age<18和age>=16,因为当程序运行到这种语句时,申请人的年龄不可能小于16岁。
如果非要按照类似的方式书写条件语句,就会得到错误的结果。
age=input('Enter a value of age: ')
if age<16
disp('Sorry-You''ll have to wait')
elseif age<18&age>16
disp('You may have a youth license')
elseif age<70&age>18
disp('You may have a standard license')
elseif age>70
disp('Drivers over 70 require a special license')
当age=16,18或70时,会输出错误结果。
一般来说,elseif结构适用于标量,find适用于矩阵。
在下面的例子中,用find对年龄矩阵进行分类,结果用数据表格的形式输出:
age=input('Enter a value of age: ')
set1=find(age<16);
set2=find(age>=16&age<18);
set3=find(age>=18&age<70);
set4=find(age>=70);
fprintf('Sorry-You''ll have to wait-you''re only %3.0f\n',age(set1))
fprintf('You may have a youth license because you''re %3.0f\n',age(set2))
fprintf('You may have a standard license because you''re %3.0f\n',age(set3))
fprintf('Drivers over 70 require a special license.You''re %3.0f\n',age(set4))
[15 17 65 75]
Sorry-You'll have to wait-you're only 15
You may have a youth license because you're 17
You may have a standard license because you're 65
Drivers over 70 require a special license.You're 75
(4)switch/case结构
在Matlab中,switch/case结构可以根据一个给定参数的不同取值,执行不同的命令。
它和if/else/elseif类似,都属于条件分支结构。
凡是能够用if/else/elseif结构实现的程序功能都可以用switch/case结构实现。
而且用switch/case结构实现程序代码更容易理解。
switch/case结构和elseif 结构的最大区别在于判断的条件既可以是标题也可以是字符串,在实际情况下,字符串形式的判断条件比数字形式要常用。
Switch/case的语法结构如下:
switch variable
case option1
code to be executed if variable is equal to option1
case option2
code to be executed if variable is equal to option2
………………
case option n
code to be executed if variable is equal to option n
otherwise
code to be executed if variable is not equal to any of the options
end
实例
创建函数用来显示三个城市的飞机票价格
city=input('Enter the name of a city: ','s')
switch city
case'Boston'
disp('$345')
case'Denver'
disp('$150')
case'Honolulu'
disp('Stay home and study')
otherwise
end
语句中otherwise不是必需的,这条语句表示当所有的情况都不满足时,程序的输出结果。
在C语言中也有switch/case结构。
Matlab和C语言的不同之处在于当某一条件为true时,Matlab不再验证其它条件是否满足。