西南科技大学本科生课程备课教案计算机技术在安全工程中的应用——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)拉力测试装置在测试过程中,被测样本受均匀外力的作用产生形变。下图中显示的是一组拉力测试数据。根据以下公式计算应力与形变:00llFAl和=其中,是产生的应力,单位为lbf/in2(psi);F为施加的外力,单位为lbf;A为样本的截面积,单位为in2;为产生的形变,单位为in/in;l为样本的长度;0l为样本的原始长度。(a)测试样本是直径为0.505in的金属杆,根据直径可以计算出金属杆的截面积,进一步利用所提供的数据计算金属杆的应力和形变。(b)以形变为x轴,应力为y轴,作x-y线图。用黑色实线连接各数据点,并用圆圈标出各实测数据点。(c)添加标题和坐标轴的标注。(d)屈服应力或屈服点是指图形从陡峭的直线变成平滑曲线所对应的点,在屈服点附近测试样本的特性会发生显著变化。在屈服点之前,测试样本发生弹性形变,即当外力消失时,形变也消失,与橡皮筋类似。若继续增大外力作用,则测试样本会发生永久变形,也称塑性变形。在图中对屈服点做出标注。拉力测试数据负载长度负载长度0277502.01016502.00286502.02034002.00493002.04052002.006101002.08068502.008104002.120程序代码:%%定义已知变量F=[16503400520068507750865093001010010400];L=[2.0022.0042.0062.0082.0102.0202.0402.0802.120];L0=2;A=0.505^2*pi/4;%%oneyinli=F./Axinbian=(L-L0)./L0%%twoplot(yinli,xinbian,'-ok')%%threetitle('应力应变变化图'),xlabel('yinli'),ylabel('xinbian')%%fourgtext('屈服点')(2)创建矢量x,范围在0~20之间,步长为/100。矢量y和z分别等于sin()cos()yxxzxx①在x-y坐标系中画出x和y的关系曲线。②在极坐标系中画出x和y的关系曲线。③画出x、y和z的三维曲线,并在图中添加标题和坐标轴标注。④为了产生如下图所示的类似龙卷风的曲线应如何调整plot3中的输入参数,用comet3代替plot3绘制曲线。%%onex=0:pi/100:20*pi;y=x.*sin(x);z=x.*cos(x);plot(x,y)%%twofigure(2)polar(x,y)%%threefigure(3)plot3(x,y,z)xlabel('x'),ylabel('y'),zlabel('z'),title('三维曲线')%%fourfigure(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:22sin()ZXY①用函数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));%%onemesh(Z)%%twofigure(2)subplot(2,2,1)surf(Z)subplot(2,2,2)surf(X,Y,Z)%%threeshadinginterp%%foursubplot(2,2,3)contour(X,Y,Z)%%fivesubplot(2,2,4)surfc(X,Y,Z)(1)导入课堂内容Matlab是一种基于函数的编程语言。函数就是用户输入参数,返回输出结果的程序。Matlab的有内置函数和自定义函数。内置函数主要包括三角函数、对数函数、统计分析函数等。Eg:三角函数sin、cos、asin、acos等Eg:sin(pi/2)ans=1sin(90)ans=0.8940由以上两段小程序可以看出matlab内置的三角函数sin的输入参数形式只能是弧度,若输入角度则会显示错误的输出结果。在matlab软件的低版本内里没有自带输入参数为角度形式的内置正弦函数。我们可以通过编写matlab自定义函数即创建函数M文件来实现这一功能。(2)函数M文件创建的语法自定义函数和matlab自定义函数的内置函数一样,具有相同的结构。函数中必须包括函数名、输入参数和输出结果三项。自定义函数在M文件中编写代码。第一行是函数的定义行,它应包括:引导词function输出变量函数名称输入变量一个函数的定义如下:functionoutput=my_function(input)Matlab中函数的命名应遵循如下规则:函数名必须以字母开头可以包括字母、数字和下划线不能使用预留的名称长度没有限制,但是最好不要太长由此我们可以创建函数M文件来解决前一部分的遗留问题:functionoutput=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中的实体模型函数,可以产生一个三维球体,查看其程序代码,输入typesphere或type(‘sphere’)(6)应用实例①例题:个人住房公积金贷款买房,还款额及利息计算个人买房申请住房公积金贷款,还款形式选择等额本金还款。5年以上贷款年利率为4.5%,贷款本金为10万元,还款期限为10年。编写函数M文件计算每月还款额、总还款额和总利息,并将每月还款额输出到一个txt文件中等额本金还款计算公式:每月还款金额=(贷款本金/还款月数)+(本金—已归还本金累计额)×每月利率输入:贷款本金,贷款利率,贷款期限输出:每月还款额,总还款额,总利息②流程图和伪码通常在编写程序之前,要先画出程序的流程图或编写伪码,对程序进行设计。流程图就是以图形化的方法表现编程思路,伪码是用文字的形式对程序算法进行描述。在编写程序时,可以任意选择其中一种或两种方法对程序进行设计。在编写简单程序中,最好使用伪码的方法:用句子描述程序实现的步骤将步骤转换成程序中的注释信息在注释行之间国入恰当的matlab程序代码③程序实现的步骤定义函数M文件计算每月应还本金额计算每月的剩余本金计算每月还款额计算总还款额计算总利息输出计算结果到已经定义的txt文件中④将程序步骤转换为伪码%definefunctionalM-file%calculatemonthlyprincipalforpayment%calculatemonthlysurplusprincipal%calculatemonthlypayment%calculatethetotalpayment%calculatethetotalinterest%outputcalculatedresults⑤matlab程序代码%definefunctionalM-filefunction[ZHK,ZLX]=DEBJHK(BJ,DK_interestrate,DK_duration)%calculatemonthlyprincipalforpaymentBJ_permonth=BJ./DK_duration;%calculatemonthlysurplusprincipalx=1:DK_duration;surplus_BJ=BJ-BJ_permonth.*x;%calculatemonthlypaymentMYHK=BJ_permonth+surplus_BJ.*DK_interestrate/12;%calculatethetotalpaymentZHK=sum(MYHK);%calculatethetotalinterestZLX=ZHK-BJ;%outputcalculatedresultsy=fopen('result.txt','wt');fprintf(y,'Zonghuankuaner:%8.3fyuan\n',ZHK);fprintf(y,'Zonglixi:%8.3fyuan\n',ZLX);fprintf(y,'Di%2.0fgeyuehuankuanerwei:%8.3fyuan\n',[x;MYHK]);注:格式化输出函数fprintf的用法Eg:cows=2:5;fprintf('Thereare%5.2fcowsinthepasture\n',cows)Thereare2.00cowsinthepastureThereare3.00cowsinthepastureThereare4.00cowsinthepastureThereare5.00cowsinthepasture上述代码中,函数fprintf的第一个参数包含一个占位符(%)。占位符不但指定了输出的格式,还表明了变量输出的位置。程序代码中的%5.2f表明变量cows输出的格式。f表示用定点数格式显示。在使用函数fprintf时,初学者常犯的错误是忘记在占位符后输入类型域标识,如f,这样函数将不会正常工作,而且还不会给出错误提示。类型域还有其它显示格式:使用可选项widthfield和precisionfield可以控制数据输出宽度和精度。Widthfield必须是正的十进制整数,用于控制字符显示的最小宽度。Precisionfield必须以点(.)开始,用于确定指数或定点数中小数点后的数字位数。例如:上例中%5.2