【Matlab基礎】04. 自定義函數

前言

函數——是編程的核心概念之一,是能夠完成相對獨立功能的代碼封裝成的模塊。

在主程序中通過函數名和實參調用它,通過介面(即函數的輸入、輸出參數)來實現「通訊」。所以在調用函數時,你只要知道「被調用的函數是用來做什麼的」,以及「如何對應它的輸入、輸出參數」就行了。

關於形參(形式參數)和實參(實際參數):函數定義中的參數就是形參,只是用來限定函數所接收的數據類型的,「泛指該數據類型下任一元素」;函數調用中的參數就是實參,是「特指的具體數值」來代入函數體執行代碼。例如(C語言):

int max(int x, int y){ if (x >= y) return x;elsereturn y; }……int a = 5, b = 4;max(2,3);max(a,b);……

其中,x,y是形參,2, 3,a, b是實參。

使用函數的好處:增加程序的可讀性(函數可獨立放在主程序之外)和重用性(一個函數可以多次被調用)。

Matlab的自定義函數,常用的有:m文件定義函數、inline(內聯)函數、匿名函數。

一、m文件定義函數(m-函數)

1. Matlab函數的基本結構

function[輸出形參表: output1, ...,outptn] = 函數名(輸入形參表: input1, ... , inputn)注釋說明部分函數體代碼部分end

說明:function:表示編寫的是一個函數;

輸出形參表,即函數的返回值,各返回值間用逗號隔開;(不需要像C語言那樣,通過return到返回值來賦值,outp_args相應的參數可以直接使用)

函數名:需要和m文件名保持一致

輸入形參列表:即函數的各輸入參數,用逗號隔開;

函數體:完成函數的具體功能,是根據具體需要編寫的;通過使用「函數的輸入參數」、「自定義變數」、「流程式控制制結構」來實現;

end:表示此函數結束,也可省略。

2. 函數調用

定義完的函數保存為同函數名的m文件,放置在Matlab的當前路徑之下(或修改當前路徑為m-函數文件所在路徑),然後就和使用Matlab自帶的函數一樣,直接在命令窗口或程序代碼中使用該函數就是調用它了。調用函數時,只需要知道函數是完成什麼功能的,以及它的輸入參數、輸出參數。

函數調用的一般格式為:

[輸出實參表]=函數名(輸入實參表)

注1:函數中遇return語句時,將退出函數體,此函數調用結束;

注2:函數體裡面也可以定義一個或幾個函數,稱為子函數;注意:子函數只能存在於主函數體內,不獨立存在;子函數在主函數體內的位置可以任意,不影響使用;子函數只能被主函數以及其他位於同一主函數體下的子函數調用,但子函數「句柄」例外;

注3:在調用函數時,Matlab用兩個永久變數nargin和nargout分別記錄調用該函數時的輸入實參和輸出實參的個數。只要在函數文件中包含這兩個變數,就可以準確地知道該函數文件被調用時的輸入輸出參數個數,從而決定函數如何進行處理。

1 函數(子函數)定義與調用示例,求向量的最大、最小值。

編寫m-函數文件:max_min_values.m

function [max,min] = max_min_values(X)%輸入參數X為數值向量,返回其最大值和最小值max=mysubfun1(X);min=mysubfun2(X);function r=mysubfun1(X) %子函數1x1=sort(X, descend);r=x1(1);endfunction r=mysubfun2(X) %子函數2x1=sort(X);r=x1(1);endend

調用函數(命令窗口):

A = [34,56,23,11,2,39];[m,n]=max_min_values(A)

運行結果: m = 56

n = 2

二、內聯函數

可以讓用戶編寫簡單的函數而不需要創建M文件。語法格式:

f=inline(函數表達式, 變數1, 變數2, ……)

調用方式:y=f(實參列表)

注意:實參列表順序應與inline()定義中形參列表的順序一致。

這種函數定義方式是將它作為一個內部函數調用。好處是,它是基於Matlab的數值運算內核的,所以它的運算速度較快,程序效率更高。缺點是,該方法只能對數值進行代入,不支持符號代入,且對定義後的函數不能進行求導等符號運算。

內聯函數示例:

f=inline(x^2+y,x,y)z=f(2,3)

運行結果: f = Inline function: f(x,y) =x^2 + y

z = 7

二、匿名函數

1.匿名函數基本語法

匿名函數具有內聯的所有優點,並且效率比更高。匿名函數的主要功能是:

(1)可以代替「將函數編寫為單獨的m-文件」;

(2)可以實現符號函數的賦值運算;

(3)很方便地對含參變數函數進行操作。

基本格式:

f=@(參數1, 參數2, …) 函數表達式

其中,@為句柄操作符,可以定義指向函數的句柄,函數句柄,可以理解成函數的「代號」,適用於函數名比較長,用「代號」代替函數操作更方便。

匿名函數示例:

f=@(x,y)x^2+y^2;f(2,3)a=1:5;b=5:-1:1;c=0.1:0.1:0.5;g=@(x,y)x.^2+y.^2+c;g(a,b)

運行結果: ans = 13

ans = 26.1000 20.2000 18.3000 20.4000 26.5000

也可以定義二重匿名函數:例如,

f=@(a, b) @(x) a*x+b;

其中,「a, b」是外層變數,「x」是內層變數。

這樣理解:每個「@」符號後面括弧里的變數的作用域一直到表達式的結尾。例如對於「a=2, b=3」, f(2, 3)是以x為變數的匿名函數:

(f(2, 3))(x)=2*x+3

類似的可以定義多重匿名函數。

2. 匿名函數的應用

(1) 求解參數方程

2 對帶參數a的參數方程:

e^x+x^a+x^{sqrt{x}}=100

要求針對a在[0,2]上的不同取值求解方程,並繪製方程的解x與a的關係的圖像。

代碼

f=@(a) @(x) exp(x)+x^a+x^(sqrt(x))-100;%相當於(f(a))(x)=exp(x)+x^a+x^(sqrt(x))-100format longfzero(f(1),4) % a=1時,求解方程的根x,初始值為4A=0:0.01:2;x=@(a) fzero(f(a),4); %帶著參數a求解方程的根x,得到x=x(a)X=@(A) arrayfun(@(a) x(a),A);% x(a)只能接受標量a,處理成能接受向量AY=X(A);plot(A,Y)xlabel(a)ylabel(x)

運行結果:ans = 4.315274301739397

:f(x)只能接受標量的自變數x,arrayfun函數對f做向量化處理使得f作用到向量自變數X上得到F(X). 語法:

F=arrayfun(f, X)

相當於用f作用到向量X的每個分量上。示例:

f=@(x) 2*x; %f(x)=2*xF=@(X) arrayfun(f,X); %F(X)=2*XF(1:4)

輸出:ans = 2 4 6 8

(2) 「顯式」表示隱函數

隱函數一般無法給出顯式表達式,但藉助匿名函數和求根函數fzero()可以實現「已知隱函數表達式,對於給定的自變數x,通過數值方法求出因變數y」。

4顯式」表示下列隱函數:

z=sinig((zx-0.5)^2+2xy^2-frac{z}{10}ig)expBig{-ig[x-0.5-exp(-y+z)ig]^2+y^2-frac{z}{5}+3 Big}

其「顯式表示」為:

z=@(x,y) fzero(@(z)z-sin((z*x-0.5)^2+2*x*y^2-z/10) *exp(-((x-0.5-exp(-y+z))^2+y^2-z/5+3)),rand)

相當於求解滿足該隱函數方程的z=z(x,y), 其中rand生成隨機數作為初始值。

代碼:

z=@(x,y) fzero(@(z) z-sin((z*x-0.5)^2+2*x*y^2-z/10) *exp(-((x-0.5-exp(-y+z))^2+y^2-z/5+3)),rand);z(2,0.5) %求x=2, y=0.5時的z值%繪製z(x,y)的圖像[X,Y]=meshgrid(-1:0.1:7,-2:0.1:2);Z=arrayfun(@(x,y) z(x,y),X,Y);surf(X,Y,Z)xlabel(x)ylabel(y)zlabel(z)title(函數z(x,y)的圖像)

運行結果:ans = 0.016721201334182

主要參考文獻

  1. 張志涌,精通Matlab2011a, 北京航空航天大學出版社

  2. 吳鵬, MATLAB高效編程技巧與應用25個案例分析, 北京航空航天大學出版社

作者:張敬信

著作權歸作者所有。商業轉載請聯繫作者獲得授權,非商業轉載請註明出處。

推薦閱讀:

理工科女生筆記本選購諮詢?
[MATLAB R2017a 搶鮮報道] : 自動駕駛工具箱(1)
MATLAB圖像處理:把照片變成動漫風格
Matlab小練習:按斜線方向依次賦值矩陣

TAG:MATLAB | 自定义函数 | 匿名函数 |