文档描述
1q学习目标q函数定义与调用的基本格式,局部变量与全局变量。q常用的函数定义与调用形式:具有一个函数的函数定义文件与主调脚本文件;函数定义文件内含多个子函数;匿名函数。q重点与难点q函数定义与调用的基本格式。q具有一个函数的函数文件与主调脚本文件。26.1 函数定义与调用的基本格式q自定义函数是用户自行创建的MATLAB程序,一般被保存为一个函数文件,以后可以通过函数调用反复使用该自定义函数。自定义函数可以是一个简单的数学表达式,也可以是包含复杂计算功能的一段相对独立的代码段。q在MATLAB系统中,文件(file)菜单项的新建(new)子菜单项下面,如果选择脚本(script),可以创建一般的脚本程序文件,如果选择函数(function),可以创建自定义函数文件,并生成如下格式的自定义函数头。函数定义完毕,在编辑窗口中的文件(file)菜单项下对函数进行保存。MATLAB要求自定义函数的文件名与函数名相同。3 函数定义与调用的基本格式function output_args =Untitled1(input_args)%UNTITLED1 Summary of this function goes here%Detailed explanation goes hereend其中,functionend是自定义函数必需的关键词,界定了函数的起止。functionend之间的代码行即实现函数功能的程序,如果没有则认为代码为脚本程序。Untitled1是自定义函数名,其命名规则与变量命名规则相同,最好与函数功能有一定关系,以英文字符开头且英文字符与数字、下画线相结合。input_args是函数的输入变量列表,又称为函数的形式参数。可以有多个输入变量,以逗号相间隔,输入变量可以是变量、向量或矩阵。output_args是函数的输出变量列表,又称为函数的返回值。可以有多个输出变量,以逗号相间隔、由方括号括起来,输出变量可以是变量、向量或矩阵。当仅有一个输出变量时,输出变量列表的方括号可以省略。当没有输出变量时,“output_args=”部分的内容可以省略。以%符号开始的内容是文本注释行,一般用于函数功能的注释。4 函数定义与调用的基本格式q【例6-1】等额本息还款是银行贷款的一种还款方式。其特点是每月还款额相同,从本质上来说,是本金所占比例逐月递增,利息所占比例逐月递减,每月还款数额不变,即在月供“本金与利息”的分配比例中,前期所还的利息比例大、本金比例小,后期逐步转为本金比例大、利息比例小。其计算公式为:q每月还款额=本金月利率(1+月利率)贷款月数/(1+月利率)贷款月数-1 q总还款额=贷款月数每月还款额q请根据上述模型,定义等额本息还款方式下,计算贷款的每月还款额及总还款额的用户自定义函数loanBX。5 函数定义与调用的基本格式%loanBX.mfunction monthPay,totalPay =loanBX(amount,yearRate,nYear)%计算等额本息还款的每月还款额和总还款额%amount:总贷款额或本金%yearRate:贷款年利率%nYear:贷款年限%monthPay:每月还款额%totalPay:总还款额monthRate=yearRate/12nMonth=nYear*12 monthPay=(amount*monthRate*(1+monthRate)nMonth)/(1+monthRate)nMonth-1)totalPay=monthPay*nMonthend6 函数定义与调用的基本格式q将上述用户自定义函数保存成函数文件loanBX.m,然后创建主调脚本程序文件main.m,就可通过函数调用反复使用loanBX函数了。譬如,贷款200 000元,年利率为10%,贷款期限20年,在main.m中输入如下函数调用:qmp,tp=loanBX(200000,0.1,20)q这里,200000,0.1,20是实际参数,可以是常量、变量、向量或矩阵,应与形式参数在数据类型和个数上一一对应。mp,tp是函数的返回值,也应该和函数定义的输出变量一一对应。函数调用后返回的结果如下:qmp=1.9300e+3qtp=4.6321e+0057 函数定义与调用的基本格式q在命令窗口中输入“help loanBX”,可显示该函数第2行到第7行的以%开头的注释信息,形成帮助文档,具体如下:q计算等额本息还款的每月还款额和总还款额q amount:总贷款额或本金q yearRate:贷款年利率q nYear:贷款年限q monthPay:每月还款额q totalPay:总还款额8 函数定义与调用的基本格式q【思考6-1】更改loanBX函数,添加一个形参type,用于判断是期初还是期末还款。修改函数主体,通过判断type值选择是计算期初形式的每月还款额和总还款额,还是期末形式的每月还款额和总还款额。q期初还款时,每月还款额=本金月利率(1+月利率)(贷款月数-1)/(1+月利率)贷款月数-1;期末还款时,每月还款额=本金月利率(1+月利率)贷款月数)/(1+月利率)贷款月数-1。9 变量的作用域q局部变量,即自定义函数的.m文件中的所有变量。主调脚本程序与自定义函数之间进行交互的唯一方式是利用输入变量(形式参数)和输出变量(返回值)。在函数体内定义的所有变量,以及输入输出变量都仅允许函数自己使用,不能保存在工作区中。在命令窗口和主调脚本程序中不能访问自定义函数的局部变量。在自定义函数中也不能访问工作区或主调脚本程序中定义的变量。q主调脚本程序中的信息仅能通过输入变量传递给自定义函数,自定义函数中的信息仅能通过输出变量传递给主调脚本程序。为避免混淆,初学者最好在自定义函数中或主调脚本程序中使用不同的变量名。10 变量的作用域q例如,【例6-1】中自定义函数loanBX中定义的变量monthRate、nMonth,形式参数amount、yearRate、nYear和返回值monthPay、totalPay,都只能被函数loanBX中的表达式和语句使用,而不能被主调程序main.m使用,都是该函数的局部变量。mp和tp是主调程序main.m的局部变量,只能被主调程序中的表达式和语句使用,而不能被函数loanBX使用。q全局变量,即用global声明的变量。声明某个变量为全局变量,必须在这个变量被使用之前。当某个变量在某行被声明为全局变量,此后的语句表达式都可引用。建议用较长的描述性名字或大写字母命名全局变量。虽然全局变量可以减少参数的传递,但会使程序的可读性降低。考虑到程序的封装性和模块化,应尽量减少对全局变量的使用。11 6.2 几种常用函数定义与调用形式qMATLAB支持的常用函数定义与调用形式包括:q仅具有一个自定义函数的函数文件与主调脚本程序文件;q具有多个自定义子函数的函数文件与主调脚本程序文件。q匿名函数。q该形式需要设计一个函数定义文件,一个函数调用文件。【例6-2】设计了一个函数调用文件myfile2.m,该文件是一个脚本程序文件,没有functionend作为界定,可以多次调用自定义函数。设计了一个函数文件loanBX.m,其中只有一个自定义函数loanBX,有functionend作为界定。函数调用文件与函数定义文件是两个不同的文件。12 一个自定义函数的函数文件+主调脚本程序文件q【例6-2】请设计一个脚本程序文件,用于多次调用loanBX函数,以计算贷款额是20万元、贷款年限从10年开始到30年结束,在等额本息还款形式下,每月还款额和总还款额。q%调用函数文件:myfile2.mqfor t=10:30qmp,tp=loanBX(200000,0.1,t);qfprintf(贷款%d年,每月还款%6.4f,总还款%12.4fn,t,mp,tp);qendq%自定义函数文件:loanBX.mqfunction monthPay,totalPay =loanBX(amount,yearRate,nYear)q%计算等额本息还款的每月还款额和总还款额qmonthRate=yearRate/12;qnMonth=nYear*12;qmonthPay=(amount*monthRate*(1+monthRate)nMonth)/(1+monthRate)nMonth-1);qtotalPay=monthPay*nMonth;qend13 一个自定义函数的函数文件+主调脚本程序文件q【思考6-2】请修改主调脚本程序文件,用于多次调用loanBX函数。计算贷款额是20万元,贷款年限为20年,年利率从5%变化到15%时,在等额本息还款形式下,每月还款额和总还款额。计算贷款额是20万元,贷款年限从10年开始、到20年结束,年利率从5%变化到15%时,在等额本息还款形式下,每月还款额和总还款额。14 多个自定义函数的函数文件+主调脚本程序文件q该形式设计一个函数定义文件,一个函数调用文件。函数定义文件中可以有多个自定义函数,但文件名只与其中一个函数名相同。与文件名相同的自定义函数,才可以被函数调用脚本程序调用。与文件名不相同的自定义函数,只能被函数定义文件中的其他函数调用。函数调用脚本文件只能调用与函数定义文件同名的函数。q【例6-3】设计一个用户自定义函数文件myfile3.m,其中有两个自定义函数myfile3和loanBX。loanBX函数用于计算等额本息还款形式下,某个贷款额、年利率和年限下,每月还款额和总还款额。myfile3函数用以计算某个贷款金额下贷款年限从startT年开始到endT年结束,每月还款额和总还款额。设计函数调用脚本文件main.m,计算贷款20万元由10年开始到20年结束的每月还款额和总还款额。15 多个自定义函数的函数文件+主调脚本程序文件%自定义函数文件:myfile3.m,包含myfile3和loanBX两个函数%自定义函数myfile3,计算若干期限内的每月还款额和总还款额function myfile3(JinE,YearRate,startT,endT)for t=startT:endT mp,tp=loanBX(JinE,YearRate,t);fprintf(贷款%d年,每月还款%6.4f,总还款%12.4fn,t,mp,tp);endend%自定义函数loanBX,计算某个还款额和还款年限下的每月还款额和总还款额function monthPay,totalPay =loanBX(amount,yearRate,nYear)monthRate=yearRate/12;nMonth=nYear*12;monthPay=(amount*monthRate*(1+monthRate)nMonth)/(1+monthRate)nMonth-1);totalPay=monthPay*nMonth;end%主调函数脚本文件:main.mclearclcmyfile3(200000,0.1,10,20)mp,tp=loanBX(200000,0.1,20)16 多个自定义函数的函数文件+主调脚本程序文件q可见,myfile3(200000,0.1,10,20)被正确执行了,而mp,tp=loanBX(200000,0.1,20)没有被正确执行。这是因为,myfile3函数与函数定义文件myfile3.m的文件名相同,loanBX与函数定义文件myfile3.m的文件名不同。因此,loanBX函数只能被同文件的myfile3函数调用,不能被main.m文件中的语句或表达式使用。main.m文件中的语句或表达式只能访问myfile3函数,不能访问和调用loanBX函数。17 匿名函数q使用MATLAB函数句柄操作符,可以定义指向MATLAB内置函数和自定义函数的函数句柄,函数句柄也可以像函数一样使用。它只包含一个表达式,多个输入变量和输出变量,不需要写成.m文件。可以在命令窗口、脚本文件和函数文件中定义匿名函数,格式为:qf=(arglist)expressionq等式右边必须以符号开始,arglist是匿名函数的输入变量列表,也可以是向量和矩阵;expression是匿名函数体,是需要计算的表达式。18 匿名函数q【例6-4】利用匿名函数计算 。q f=(x,y)(sin(x.2+y.2)q f(2,3)q ans=3.858922f(x,y)sin(xy)19 6.3 课堂实验:等额本金还款计算q等额本金还款方式的计算公式如下。q每月还款额=每月还款本金+每月还款利息q每月还款本金=贷款总额/贷款月数q每月还款利息=贷款本金余额贷款月利率(贷款月利率=年利率/12)q贷款本金余额=贷款总额-已还款月数每月还款本金q例如,贷款50万元,贷款20年,年利率5.9%,每月还款情况如下:q每月还款本金=500000/240=2083.33(元);q第一个月还利息=5000005.9%/12=2458.33(元);q第一个月还款额=2083.33+2458.33=4541.67(元);q第二个月还利息减少额:2083.335.9%/12=10.24(元);q第二个月还款额=4541.67-10.24=4531.43(元);q以后每月递减10.24元。总还款额为796229.17(元)。q请设计合适的输入变量和输出变量,编写等额本金计算函数loanDB。20 6.3 课堂实验:等额本金还款计算q根据上述模型,定义等额本金还款方式下,计算贷款每月还款额及总还款额的用户自定义函数loanDB。将该用户自定义函数保存成函数文件loanDB.m。q%自定义函数文件:loanDB.mqfunction monthPay,totalPay=loanDB(amount,yearRate,nYear)q%amount:总贷款额或本金q%yearRate:贷款年利率q%nYear:贷款总年限,以年为单位q%monthPay:每月还款额q%totalPay:总还款额qmonthRate=yearRate/12;qnMonth=nYear*12;qper=1:nMonth;qmonthBen=amount/nMonth.*ones(nMonth,1);%每期偿还的本金qmonthIns=(amount-monthBen.*(per-1).*monthRate;%每期偿还的利息qmonthPay=monthBen+monthIns;%每期偿还额qtotalPay=sum(monthPay);%总还款额qend21 6.3 课堂实验:等额本金还款计算q创建主调脚本程序文件myfile4.m,就可通过函数调用反复使用loanDB函数。例如,贷款500000元,年利率为5.9%,贷款20年,在myfile4.m中输入如下函数调用:qmp,tp=loanDB(500000,0.059,20)
展开阅读全文