(完整版)Matlab第十讲教案
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
西南科技大学本科生课程备课教案
计算机技术在安全工程中的
应用
——Matlab入门及应用
授课教师:徐中慧
班级:
专业:安全技术及工程
第十章 MATLAB自定义函数
课型:新授课
教具:多媒体教学设备,matlab教学软件
一、目标与要求
✧通过解说与实例练习,掌握matlab创建函数M文件的方法
✧掌握matlab中全局变量与局部变量的定义与用法
✧通过解说与实例练习,掌握在matlab主函数M文件中创建子函数
✧在实例练习过程中,回顾利用伪码编写简单程序的方法
✧掌握通过创建matlab函数M文件解决生活中的计算问题
二、教学重点与难点
本堂课教学的重点在于引导学生掌握matlab中函数M文件的创建及应用。
本堂课的难点在于理解matlab中函数M文件主函数与子函数的区别及调用,局部变量与全局变量的定义与应用范围的区别。
三、教学方法
本课程主要通过讲授法、演示法、练习法等相结合的方法来引导学生掌控本堂课的学习内容。
1)通过讲授法向学生讲述创建matlab函数M文件的基本方法、全局变量与局部变量
的定义及用法等。
2)通过运用多媒体设备现场演示matlab创建函数M文件的应用实例。
3)在掌握创建matlab函数M文件基本方法的基础上,采用练习法引导学生创建函数
M文件解决实际问题。
四、教学内容
课后习题五
(1)拉力测试装置在测试过程中,被测样本受均匀外力的作用产生形变。
下图中显示的是一组拉力测试数据。
根据以下公式计算应力与形变:
00
l l F A l σε-=和= 其中,σ是产生的应力,单位为lbf/in 2(psi);F 为施加的外力,单位为lbf;A 为样本的截面积,单位为in 2;ε为产生的形变,单位为in/in ;l 为样本的长度;0l 为样本的原始长度。
(a )测试样本是直径为0.505in 的金属杆,根据直径可以计算出金属杆的截面积,进一步利用所提供的数据计算金属杆的应力和形变。
(b )以形变为x 轴,应力为y 轴,作x-y 线图。
用黑色实线连接各数据点,并用圆圈标出各实测数据点。
(c )添加标题和坐标轴的标注。
(d )屈服应力或屈服点是指图形从陡峭的直线变成平滑曲线所对应的点,在屈服点附近测试样本的特性会发生显著变化。
在屈服点之前,测试样本发生弹性形变,即当外力消失时,形变也消失,与橡皮筋类似。
若继续增大外力作用,则测试样本会发生永久变形,也称塑性变形。
在图中对屈服点做出标注。
拉力测试数据
负 载 长 度 负 载 长 度
0 2 7750 2.010
1650 2.002 8650 2.020
3400 2.004 9300 2.040
5200 2.006 10100 2.080
6850 2.008 10400 2.120
程序代码:
%% 定义已知变量
F=[1650 3400 5200 6850 7750 8650 9300
10100 10400];
L=[2.002 2.004 2.006 2.008 2.010 2.020
2.040 2.080 2.120];
L0=2;
A=0.505^2*pi/4;
%% one
yinli=F./A
xinbian=(L-L0)./L0
%% two
plot(yinli,xinbian,'-ok')
%% three
title('应力应变变化图
'),xlabel('yinli'),ylabel('xinbian')
%% four
gtext('屈服点')
(2)创建矢量x ,范围在0~20 π之间,步长为π/100。
矢量y 和z 分别等于 sin()
cos()y x x z x x ==
①在x-y坐标系中画出x和y的关系曲线。
②在极坐标系中画出x和y的关系曲线。
③画出x、y和z的三维曲线,并在图中添加标题和坐标轴标注。
④为了产生如下图所示的类似龙卷风的曲线应如何调整plot3中的输入参数,用comet3代替plot3绘制曲线。
%% one
x=0:pi/100:20*pi;
y=x.*sin(x);
z=x.*cos(x);
plot(x,y)
%% two
figure(2)
polar(x,y)
%% three
figure(3)
plot3(x,y,z)
xlabel('x'),ylabel('y'),zlabel('z'),title('三维曲线')
%% four
figure(4)
plot3(z,y,x)
xlabel('z'),ylabel('y'),zlabel('x'),title('三维曲线')
figure(5)
comet3(z,y,x)
(3)创建矢量x和y,数据变化范围从-5到+5,步长为0.5.用函数meshgrid将矢量x 和y映射为两上新的二维矩阵X和Y,根据下述公式计算矢量Z:
22
=+
sin()
Z X Y
①用函数mesh创建Z的三维图。
②用函数surf创建Z的三维图。
比较单个输入变量和三个输入变量(X,Y,Z)时输
入结果的区别。
③给输出的曲面图增加渲染阴影效果。
④绘制Z的等高线图。
⑤绘制Z的曲面图并加上等高线。
%% 变量定义
x=-5:0.5:5;
y=-5:0.5:5;
[X,Y]=meshgrid(x,y);
Z=sin(sqrt(X.^2+Y.^2))
;
%% one
mesh(Z)
%% two
figure(2)
subplot(2,2,1)
surf(Z)
subplot(2,2,2)
surf(X,Y,Z)
%% three
shading interp
%% four
subplot(2,2,3)
contour(X,Y,Z)
%% five
subplot(2,2,4)
surfc(X,Y,Z)
(1)导入课堂内容
Matlab是一种基于函数的编程语言。
函数就是用户输入参数,返回输出结果的程序。
Matlab的有内置函数和自定义函数。
内置函数主要包括三角函数、对数函数、统计分析函
数等。
Eg: 三角函数sin、cos、asin、acos等
Eg: sin(pi/2) ans = 1
sin(90) ans = 0.8940
由以上两段小程序可以看出matlab内置的三角函数sin的输入参数形式只能是弧度,若输入角度则会显示错误的输出结果。
在matlab软件的低版本内里没有自带输入参数为角度形式的内置正弦函数。
我们可以通过编写matlab自定义函数即创建函数M文件来实现这一功能。
(2)函数M文件创建的语法
自定义函数和matlab自定义函数的内置函数一样,具有相同的结构。
函数中必须包括函数名、输入参数和输出结果三项。
自定义函数在M文件中编写代码。
第一行是函数的定义行,它应包括:
⏹引导词function
⏹输出变量
⏹函数名称
⏹输入变量
一个函数的定义如下:
function output=my_function(input)
Matlab中函数的命名应遵循如下规则:
函数名必须以字母开头
可以包括字母、数字和下划线
不能使用预留的名称
长度没有限制,但是最好不要太长
由此我们可以创建函数M文件来解决前一部分的遗留问题:
function output=sin_degree(x)
output=sin(pi.*x./180);
(3)多输入多输出函数
自定义函数也可以有多个输入参数和输出结果。
一个函数的定义如下:
function [a,b,c,……]=my_function(x,y,z,……)
Eg: 余项函数rem(x,y)就是一个多输入函数。
余项函数就是求除法运算中余数的函数,需要输入除数和被除数两个选项。
(4)全局变量与局部变量
全局变量是整个程序的变量。
在命令窗口或脚本M文件中定义的变量都是全局变量。
函数的M文件中所有变量都称为局部变量。
在命令窗口或脚本M文件中不能访问自定义函数定义的变量。
同理自定义函数中也不能访问工作区定义的变量。
也就是说函数必须是自包含的,即:程序中的信息仅能通过输入变量传递给函数,函数中的信息仅能通过输出变量传递给程序。
(5)查看M文件代码
Matlab中提供了两种函数类型。
一种是内置函数,其程序代码是看不见的。
另一种是M文件函数,它存储在程序提供的工具箱中,使用type命令可以查看M文件代码。
函数sphere 是Matlab中的实体模型函数,可以产生一个三维球体,查看其程序代码,输入type sphere
或type (‘sphere’)
(6)应用实例
①例题:个人住房公积金贷款买房,还款额及利息计算
⏹个人买房申请住房公积金贷款,还款形式选择等额本金还款。
5年以上贷款年利率为
4.5%,贷款本金为10万元,还款期限为10年。
编写函数M文件计算每月还款额、总还款额和总利息,并将每月还款额输出到一个txt文件中
⏹等额本金还款计算公式:每月还款金额= (贷款本金/ 还款月数)+(本金—已归还本金累计额)×每月利率
⏹输入:贷款本金,贷款利率,贷款期限
⏹输出:每月还款额,总还款额,总利息
②流程图和伪码
通常在编写程序之前,要先画出程序的流程图或编写伪码,对程序进行设计。
流程图就是以图形化的方法表现编程思路,伪码是用文字的形式对程序算法进行描述。
在编写程序时,可以任意选择其中一种或两种方法对程序进行设计。
在编写简单程序中,最好使用伪码的方法:
◆用句子描述程序实现的步骤
◆将步骤转换成程序中的注释信息
◆在注释行之间国入恰当的matlab程序代码
③程序实现的步骤
✧定义函数M文件
✧计算每月应还本金额
✧计算每月的剩余本金
✧计算每月还款额
✧计算总还款额
✧计算总利息
✧输出计算结果到已经定义的txt文件中
④将程序步骤转换为伪码
%define functional M-file
%calculate monthly principal for payment
% calculate monthly surplus principal
% calculate monthly payment
% calculate the total payment
% calculate the total interest
% output calculated results
⑤matlab程序代码
%define functional M-file
function [ZHK,ZLX]=DEBJHK(BJ,DK_interestrate,DK_duration) %calculate monthly principal for payment
BJ_permonth=BJ./DK_duration;
% calculate monthly surplus principal
x=1:DK_duration;
surplus_BJ=BJ-BJ_permonth.*x;
% calculate monthly payment
MYHK=BJ_permonth+surplus_BJ.*DK_interestrate/12;
% calculate the total payment
ZHK=sum(MYHK);
% calculate the total interest
ZLX=ZHK-BJ;
% output calculated results
y=fopen('result.txt','wt');
fprintf(y,'Zong huan kuan er:%8.3f yuan\n ',ZHK);
fprintf(y,'Zong li xi:%8.3f yuan\n ',ZLX);
fprintf(y,'Di %2.0f ge yue huan kuan er wei: %8.3f yuan\n',[x;MYHK]);
注:格式化输出函数fprintf的用法
Eg : cows=2 :5 ;
fprintf('There are %5.2f cows in the pasture \n',cows)
There are 2.00 cows in the pasture
There are 3.00 cows in the pasture
There are 4.00 cows in the pasture
There are 5.00 cows in the pasture
上述代码中,函数fprintf的第一个参数包含一个占位符(%)。
占位符不但指定了输出的格式,还表明了变量输出的位置。
程序代码中的%5.2f表明变量cows输出的格式。
f表示用定点数格式显示。
在使用函数fprintf时,初学者常犯的错误是忘记在占位符后输入类型域标识,如f,这样函数将不会正常工作,而且还不会给出错误提示。
类型域还有其它显示格式:
使用可选项width field和precision field 可以控制数据输出宽度和精度。
Width field 必
须是正的十进制整数,用于控制字符显示的最小宽度。
Precision field 必须以点(.)开始,用于确定指数或定点数中小数点后的数字位数。
例如:上例中%5.2f 说明字符显示的最小宽度是5位,小数点后有2位数字。
上例中\n是一种特殊格式命令,用于换行显示。
还有一些其它的特殊格式命令:
除了可以在命令窗口中输出格式化数据外,函数fprintf还可以把数据输出到文件中。
首先创建输出文件,然后用函数fopen打开该文件,同时给打开的文件分配一个文件标识符(即文件的别名):
file_id =fopen(‘my_output_file.txt’,’wt’);
其中,函数fopen的第一个输入参数是要打开的文件名。
第二个输入参数是字符串’wt’,表示要对文件进行写操作。
如果能正确打开这个输出文件,并且已经给该文件分配了文件标识符,就可以把这个文件标识符作为函数fprintf的第一个输入参数按照指定格式把数据写入到文件中:
fprintf(file_id, ‘Some example output is %4.2f \n’ , pi*1000)
并在命令窗口返回写入数据的字节数。
(7)子函数
⏹在同一个文件中,除了主函数外还可以创建多个子函数。
子函数只能被主函数调用。
使用子函数有利于程序的模块化,能够使程序的可读性更强。
⏹每一个matlab的M文件只能有一个主函数,并且M文件名必须和主函数名相同。
主函数之后可以定义任何合法的子函数,子函数的命名规则和变量的命名规则相同。
%define functional M-file
function [ZHK,ZLX]=DEBJHK00(BJ,DK_interestrate,DK_duration)
%calculate monthly principal for payment
a=BJ./DK_duration;
% calculate monthly surplus principal
x=1:DK_duration;
b=BJ-a.*x;
% calculate monthly interestrate
c= DK_interestrate/12;
% calculate monthly payment
MYHK=zhihanshu(a, b,c);
% calculate the total payment
ZHK=sum(MYHK);
% calculate the total interest
ZLX=ZHK-BJ;
% output calculated results
y=fopen('result.txt','wt');
fprintf(y,'Zong huan kuan er:%8.3f yuan\n ',ZHK);
fprintf(y,'Zong li xi:%8.3f yuan\n ',ZLX);
fprintf(y,'Di %2.0f ge yue huan kuan er wei: %8.3f yuan\n',[x;MYHK]);
function output=zhihanshu(BJ_permonth, surplus_BJ,interestrate_permonth)
output=BJ_permonth+surplus_BJ.* interestrate_permonth;
(8)匿名函数和函数句柄、复合函数
一般情况下,创建用户自定义函数,需要把函数存储起来以便将来编程使用。
匿名函数是Matlab7中一种新的、简单的函数构造方法。
用户可以直接在命令窗口或脚本M文件中定义和使用匿名函数。
匿名函数更像一个定义的变量,只要不清空工作区,匿名函数都是有效的。
下面的程序代码给出了一个匿名函数的例子:
ln=@(x) log(x)
●@符号提示Matlab,ln是一个函数
●在@符号后面紧接着定义了函数的输入参数
●最后定义函数
关键概念:用户可以在M文件或命令窗口中定义匿名函数
在程序中,匿名函数的用法和其它函数的用法相同。
ln(10)
ans=
2.3026
用户还可以给函数M文件创建函数句柄。
创建函数M文件如下:
function result=distance(t)
result=1/2*9.8*t.^2;
创建函数句柄:distance_handle=@(t) distance(t)
把函数句柄distance_handle分配给函数distance。
函数句柄可以视为函数的别称。
使用函数句柄有什么好处呢?
1、提高运行速度。
因为matlab对函数的调用每次都是要搜索所有的路径,从set path 中我们可以看到,路径是非常的多的,所以如果一个函数在你的程序中需要经常用到的话,使用函数句柄,对你的速度会有提高的。
2、使用可以与变量一样方便。
比如说,我再这个目录运行后,创建了本目录的一个函数句柄,当我转到其他的目录下的时候,创建的函数句柄还是可以直接调用的,而不需要把那个函数文件拷贝过来。
因为你创建的function handles中,已经包含了路径。
复合函数
如果某个函数的输入也是一个函数(函数的函数、或称复合函数)时,Matlab经常使用匿名函数和函数句柄。
绘图函数fplot就是Matlab中的内置复合函数,它要求有两个输入参数:一个输入参数是函数或函数句柄,另一个输入参数是函数的取值范围
poly5=@(x) -5*x.^5+400*x.^4+3*x.^3+20*x.^2-x+5;
fplot(poly5,[-30,90])
许多matlab函数都可以将函数句柄作为输入参数。
例如:fzero用于求方程f(x)=0的解,方程中x可以是函数句柄也可以是一个估计值。
fzero(function,x)就是求接近到x,使函数function=0的解。
poly5=@(x) -5*x.^5+400*x.^4+3*x.^3+20*x.^2-x+5;
fplot(poly5,[-30,90])
fzero(poly5,75)。