第8章MATLAB程序設(shè)計(jì)
《第8章MATLAB程序設(shè)計(jì)》由會(huì)員分享,可在線閱讀,更多相關(guān)《第8章MATLAB程序設(shè)計(jì)(31頁(yè)珍藏版)》請(qǐng)?jiān)谘b配圖網(wǎng)上搜索。
1、第8章 MATLAB程序設(shè)計(jì) 8.1腳本文件和函數(shù)文件 M文件有兩種形式:M腳本文件和M函數(shù)文件。 8.1.1 M文本編輯器 MATLAB的M文件是通過(guò)M文件編輯/調(diào)試器窗口(Editor/Debugger)來(lái)創(chuàng)建的。 圖8.1 M文件編輯/調(diào)試器窗口 單擊MATLAB桌面上的圖標(biāo),或者單擊菜單“File”——“New”——“M-file”,可打開(kāi)空白的M文件編輯器,也可以通過(guò)打開(kāi)已有的M文件來(lái)打開(kāi)M文件編輯器。如圖8.1所示為打開(kāi)已創(chuàng)建的M文件。 8.1.2 M文件的基本格式 下面介紹繪制二階系統(tǒng)時(shí)域曲線的M文件,欠阻尼系統(tǒng)的時(shí)域輸出y與x的關(guān)系為,【例8.1】為M腳本文件
2、,【例8.2】為M函數(shù)文件。 【例8.1】用M腳本文件繪制二階系統(tǒng)時(shí)域曲線。 %EX0801 二階系統(tǒng)時(shí)域曲線 %畫(huà)阻尼系數(shù)為0.3的曲線 x=0:0.1:20; y1=1-1/sqrt(1-0.3^2)*exp(-0.3*x).*sin(sqrt(1-0.3^2)*x+acos(0.3)) plot(x,y1,r) 【例8.2】創(chuàng)建一個(gè)畫(huà)二階系統(tǒng)時(shí)域曲線的函數(shù),阻尼系數(shù)zeta為函數(shù)的輸入?yún)?shù)。 function y=Ex0802(zeta) % EX0802 Step response of quadratic system. % 二階系統(tǒng)時(shí)
3、域響應(yīng)曲線 % zeta 阻尼系數(shù) % y 時(shí)域響應(yīng) % % copyright 2003-08-01 x=0:0.1:20; y=1-1/sqrt(1-zeta^2)*exp(-zeta*x).*sin(sqrt(1-zeta^2)*x+acos(zeta)) plot(x,y) M函數(shù)文件的基本格式: 函數(shù)聲明行 H1行(用%開(kāi)頭的注釋行) 在線幫助文本(用%開(kāi)頭) 編寫(xiě)和修改記錄(用%開(kāi)頭) 函數(shù)體 例如,在命令窗口輸入help和lookfor命令查看幫助信息: help Ex0802 EX0802 S
4、tep response of quadratic system. 二階系統(tǒng)時(shí)域響應(yīng)曲線 zeta 阻尼系數(shù) y 時(shí)域響應(yīng) lookfor 二階系統(tǒng)時(shí)域響應(yīng) Ex0802.m: %二階系統(tǒng)時(shí)域響應(yīng) 8.1.3 M腳本文件 腳本文件的特點(diǎn): (1) 腳本文件中的命令格式和前后位置,與在命令窗口中輸入的沒(méi)有任何區(qū)別。 (2) MATLAB在運(yùn)行腳本文件時(shí),只是簡(jiǎn)單地按順序從文件中讀取一條條命令,送到MATLAB命令窗口中去執(zhí)行。 (3) 與在命令窗口中直接運(yùn)行命令一樣,腳本文件運(yùn)行產(chǎn)生的變量都是駐留在MATLAB的工作空間(workspace)中,可以很
5、方便地查看變量,除非用clear命令清除;腳本文件的命令也可以訪問(wèn)工作空間的所有數(shù)據(jù),因此要注意避免變量的覆蓋而造成程序出錯(cuò)。 【例8.1續(xù)】在M文件編輯/調(diào)試器窗口中編寫(xiě)M腳本文件繪制二階系統(tǒng)的多條時(shí)域曲線。 (1) 單擊MATLAB桌面上的圖標(biāo)打開(kāi)M文件編輯器。 (2) 將命令全部寫(xiě)入M文件編輯器中,為了能標(biāo)志該文件的名稱,在第一行寫(xiě)入包含文件名的注釋。保存文件為Ex0801.m。 %EX0801 二階系統(tǒng)時(shí)域曲線 x=0:0.1:20; y1=1-1/sqrt(1-0.3^2)*exp(-0.3*x).*sin(sqrt(1-0.3^2)*x+acos(0.3))
6、plot(x,y1,r) %畫(huà)阻尼系數(shù)為0.3的曲線 hold on y2=1-1/sqrt(1-0.707^2)*exp(-0.707*x).*sin(sqrt(1-0.707^2)*x+acos(0.707)) plot(x,y2,g) %畫(huà)阻尼系數(shù)為0.707的曲線 y3=1-exp(-x).*(1+x) plot(x,y3,b) %畫(huà)阻尼系數(shù)為1的曲線 圖8.2 運(yùn)行界面 (3) 選擇M文件編輯器菜單“Debug”——“Run”,就可以在圖形窗中看到如圖8.2所示的曲線。 查看工作空間的變量: whos Name
7、 Size Bytes Class x 1x201 1608 double array y1 1x201 1608 double array y2 1x201 1608 double array y3 1x201 1608 double array Grand total is 804 elements using
8、6432 bytes 8.1.4 M函數(shù)文件 函數(shù)文件的特點(diǎn): (1) 第一行總是以“function”引導(dǎo)的函數(shù)聲明行; 函數(shù)聲明行的格式: function [輸出變量列表] = 函數(shù)名(輸入變量列表) (2) 函數(shù)文件在運(yùn)行過(guò)程中產(chǎn)生的變量都存放在函數(shù)本身的工作空間; (3) 當(dāng)文件執(zhí)行完最后一條命令或遇到“return”命令時(shí),就結(jié)束函數(shù)文件的運(yùn)行,同時(shí)函數(shù)工作空間的變量就被清除; (4) 函數(shù)的工作空間隨具體的M函數(shù)文件調(diào)用而產(chǎn)生,隨調(diào)用結(jié)束而刪除,是獨(dú)立的、臨時(shí)的,在MATLAB運(yùn)行過(guò)程中可以產(chǎn)生任意多個(gè)臨時(shí)的函數(shù)空間。 【例8.2續(xù)】在M文件編輯/調(diào)試
9、器窗口編寫(xiě)計(jì)算二階系統(tǒng)時(shí)域響應(yīng)的M函數(shù)文件,并在MATLAB命令窗口中調(diào)用該文件。 創(chuàng)建M函數(shù)文件并調(diào)用的步驟如下: (1) 編寫(xiě)函數(shù)代碼 function y=Ex0802(zeta) %EX0802 畫(huà)二階系統(tǒng)時(shí)域曲線 x=0:0.1:20; y=1-1/sqrt(1-zeta^2)*exp(-zeta*x).*sin(sqrt(1-zeta^2)*x+acos(zeta)) plot(x,y) (2) 將函數(shù)文件保存為“Ex0802.m”。 (3) 在MATLAB命令窗口輸入以下命令,則會(huì)出現(xiàn)f的計(jì)算值和繪制的曲線: f=Ex0802(0.3) 程序分析:
10、第一行指定該文件是函數(shù)文件,文件名為“Ex0802”,輸入?yún)?shù)為阻尼系數(shù)zeta,輸出參數(shù)為時(shí)域響應(yīng)y。 當(dāng)函數(shù)文件調(diào)用結(jié)束,查看x、y: x ??? Undefined function or variable x. y ??? Undefined function or variable y. 注意:M腳本文件和M函數(shù)文件的文件名及函數(shù)名的命名規(guī)則與MATLAB變量的命名規(guī)則相同。 8.2程序流程控制 8.2.1 for ... end循環(huán)結(jié)構(gòu) 語(yǔ)法: for 循環(huán)變量=array 循環(huán)體 end 說(shuō)明:循環(huán)體被循環(huán)執(zhí)行,執(zhí)行的次數(shù)就是ar
11、ray的列數(shù),array可以是向量也可以是矩陣,循環(huán)變量依次取array的各列,每取一次循環(huán)體執(zhí)行一次。 【例8.3】使用for ... end循環(huán)的array向量編程求出 1+3+5...+100 的值。 % EX0803 使用向量for循環(huán) sum=0; for n=1:2:100 sum=sum+n; end sum sum = 2500 計(jì)算的結(jié)果為:sum =2500。 程序說(shuō)明:循環(huán)變量為n,n對(duì)應(yīng)為向量1:2:100,循環(huán)次數(shù)為向量的列數(shù),每次循環(huán)n取一個(gè)元素。 【例8.4】使用for ... end循環(huán)的arr
12、ay矩陣編程將單位陣轉(zhuǎn)換為列向量。 % EX0804 使用矩陣for循環(huán) sum=zeros(6,1); for n=eye(6,6) sum=sum+n; end sum sum = 1 1 1 1 1 1 程序分析:循環(huán)變量n對(duì)應(yīng)為矩陣eye(6,6)的每一列,即第一次n為[1;0;0;0;0;0],第一次n為[0;1;0;0;0;0];循環(huán)次數(shù)為矩陣的列數(shù)6。 8.2.2 while ... end循環(huán)結(jié)構(gòu) 語(yǔ)法: while 表達(dá)式 循環(huán)體 en
13、d 說(shuō)明:只要表達(dá)式為邏輯真,就執(zhí)行循環(huán)體;一旦表達(dá)式為假,就結(jié)束循環(huán)。表達(dá)式可以是向量也可以是矩陣,如果表達(dá)式為矩陣則當(dāng)所有的元素都為真才執(zhí)行循環(huán)體,如果表達(dá)式為nan,MATLAB認(rèn)為是假,不執(zhí)行循環(huán)體。 【例8.5】與【例8.3】相同,計(jì)算1+3+5...+100 的值。 % EX0805 使用while循環(huán) sum=0; n=1; while n<=100 sum=sum+n; n=n+2 ; end sum n sum = 2500 n = 101 程序分析:可以看出while ... end循
14、環(huán)的循環(huán)次數(shù)由表達(dá)式來(lái)決定,當(dāng)n=101就停止循環(huán)。
8.2.3 If…else…end條件轉(zhuǎn)移結(jié)構(gòu)
語(yǔ)法:
if 條件式1
語(yǔ)句段1
elseif 條件式2
語(yǔ)句段2
...
else
語(yǔ)句段n+1
end
說(shuō)明:當(dāng)有多個(gè)條件時(shí),條件式1為假再判斷elseif的條件式2,如果所有的條件式都不滿足,則執(zhí)行else的語(yǔ)句段n+1,當(dāng)條件式為真則執(zhí)行相應(yīng)的語(yǔ)句段;If…else…end結(jié)構(gòu)也可以是沒(méi)有elseif和else的簡(jiǎn)單結(jié)構(gòu)。
【例8.6】用If結(jié)構(gòu)執(zhí)行二階系統(tǒng)時(shí)域響應(yīng),根據(jù)阻尼系數(shù)0 15、同的時(shí)域響應(yīng)表達(dá)式。
function y=Ex0806(zeta)
% EX0806 使用if結(jié)構(gòu)的二階系統(tǒng)時(shí)域響應(yīng)
x=0:0.1:20;
if (zeta>0)&(zeta<1)
y=1-1/sqrt(1-zeta^2)*exp(-zeta*x).*sin(sqrt(1-zeta^2)*x+acos(zeta));
elseif zeta==1
y=1-exp(-x).*(1+x);
end
plot(x,y)
8.2.4 switch…case開(kāi)關(guān)結(jié)構(gòu)
語(yǔ)法:
switch 開(kāi)關(guān)表達(dá)式
case 表達(dá)式1
語(yǔ)句段1
16、case表達(dá)式2
語(yǔ)句段2
...
otherwise
語(yǔ)句段n
end
說(shuō)明:
(1) 將開(kāi)關(guān)表達(dá)式依次與case后面的表達(dá)式進(jìn)行比較,如果表達(dá)式1不滿足,則與下一個(gè)表達(dá)式2比較,如果都不滿足則執(zhí)行otherwise后面的語(yǔ)句段n;一旦開(kāi)關(guān)表達(dá)式與某個(gè)表達(dá)式相等,則執(zhí)行其后面的語(yǔ)句段。
(2) 開(kāi)關(guān)表達(dá)式只能是標(biāo)量或字符串。
(3) case后面的表達(dá)式可以是標(biāo)量、字符串或元胞數(shù)組,如果是元胞數(shù)組則將開(kāi)關(guān)表達(dá)式與元胞數(shù)組的所有元素進(jìn)行比較,只要某個(gè)元素與開(kāi)關(guān)表達(dá)式相等,就執(zhí)行其后的語(yǔ)句段。
【例8.7】用switch…case開(kāi)關(guān)結(jié)構(gòu)得出各月份的 17、季節(jié)。
% EX0807 使用switch結(jié)構(gòu)
for month=1:12;
switch month
case{3,4,5}
season=spring
case{6,7,8}
season=summer
case{9,10,11}
season=autumn
otherwise
season=winter
end
end
season =
winter
season =
winter
season =
spring
seas 18、on =
spring
season =
spring
season =
summer
season =
summer
season =
summer
season =
autumn
season =
autumn
season =
autumn
season =
winter
程序分析:開(kāi)關(guān)表達(dá)式為向量1:12,case后面的表達(dá)式為元胞數(shù)組,當(dāng)元胞數(shù)組的某個(gè)元素與開(kāi)關(guān)表達(dá)式相等,就執(zhí)行其后的語(yǔ)句段。
8.2.5 try... catch... end試探結(jié)構(gòu)
語(yǔ)法:
try
語(yǔ)句段1
catch
語(yǔ)句段2
19、end
說(shuō)明:首先試探性地執(zhí)行語(yǔ)句段1,如果在此段語(yǔ)句執(zhí)行過(guò)程中出現(xiàn)錯(cuò)誤,則將錯(cuò)誤信息賦給保留的lasterr變量,并放棄這段語(yǔ)句,轉(zhuǎn)而執(zhí)行語(yǔ)句段2中的語(yǔ)句,當(dāng)執(zhí)行語(yǔ)句段2又出現(xiàn)錯(cuò)誤,則終止該結(jié)構(gòu)。
【例8.8】用try... catch... end結(jié)構(gòu)來(lái)進(jìn)行矩陣相乘運(yùn)算。
% EX0808 try結(jié)構(gòu)
n=4;
a=magic(n);
m=3;
b=eye(3);
try
c=a*b
catch
c=a(1:m,1:m)*b
end
lasterr
c =
16 2 3
5 11 20、10
9 7 6
ans =
Error using ==> *
Inner matrix dimensions must agree.
程序分析:試探出矩陣的大小不匹配時(shí),矩陣無(wú)法相乘,則再執(zhí)行catch后面的語(yǔ)句段,將a的子矩陣取出與b矩陣相乘??梢酝ㄟ^(guò)這種結(jié)構(gòu)靈活地實(shí)現(xiàn)矩陣的乘法運(yùn)算。
8.2.6流程控制語(yǔ)句
1. break命令
break命令可以使包含break的最內(nèi)層的for或while語(yǔ)句強(qiáng)制終止,立即跳出該結(jié)構(gòu),執(zhí)行end后面的命令,break命令一般和If結(jié)構(gòu)結(jié)合使用。
【例8.9】將【例8.5】增加條件用If與break命令結(jié) 21、合,停止while循環(huán)。計(jì)算1+3+5...+100 的值,當(dāng)和大于1000時(shí)終止計(jì)算。
% EX0809 用break終止while循環(huán)
sum=0;
n=1;
while n<=100
if sum<1000
sum=sum+n;
n=n+2;
else
break
end
end
sum
n
sum =
1024
n =
65
程序分析:while…end循環(huán)結(jié)構(gòu)嵌套If…else…end分支結(jié)構(gòu),當(dāng)sum為1024時(shí)跳出while循環(huán)結(jié)構(gòu) 22、,終止循環(huán)。
2. continue命令
continue命令用于結(jié)束本次for或while循環(huán),只結(jié)束本次循環(huán)而繼續(xù)進(jìn)行下次循環(huán)。
【例8.10】將If命令與continue命令結(jié)合,計(jì)算的1~100中所有素?cái)?shù)的和,判斷是否為素?cái)?shù)是將100以內(nèi)的每個(gè)數(shù)都被2~整除,不能被整除的就是素?cái)?shù)。
% EX0810 用continue終止while循環(huán)
sum=2;ss=0;
for n=3:100
for m=2:fix(sqrt(n))
if mod(n,m)==0
ss=1; %能被整除就用ss為1表示 23、
break; %能被整除就跳出內(nèi)循環(huán)
else
ss=0; %不能被整除就用ss為0表示
end
end
if ss==1
continue; %能被整除就跳出本次外循環(huán)
end
sum=sum+n;
end
sum
sum =
1060
程序分析:fix(sqrt(n))是將取整;本程序?yàn)殡p重循環(huán),兩個(gè)for循環(huán)嵌套還嵌套一個(gè)if結(jié)構(gòu);當(dāng)mod(n 24、,m)==0時(shí)就用break跳出判斷是否為素?cái)?shù)的內(nèi)循環(huán),并繼續(xù)用continue跳出求素?cái)?shù)和的外循環(huán)而繼續(xù)下次外循環(huán)。
3. return命令
return命令是終止當(dāng)前命令的執(zhí)行,并且立即返回到上一級(jí)調(diào)用函數(shù)或等待鍵盤(pán)輸入命令,可以用來(lái)提前結(jié)束程序的運(yùn)行。
注意:當(dāng)程序進(jìn)入死循環(huán),則按Ctrl+break鍵來(lái)終止程序的運(yùn)行。
4. pause命令
pause命令用來(lái)使程序運(yùn)行暫停,等待用戶按任意鍵繼續(xù)。
語(yǔ)法:
pause %暫停
pause(n) %暫停n秒
5. keyboard命令
keyboard命令用來(lái)使程序暫停運(yùn)行,等待鍵盤(pán)命令 25、,執(zhí)行完自己的工作后,輸入return語(yǔ)句,程序就繼續(xù)運(yùn)行。
6. input命令
input命令用來(lái)提示用戶應(yīng)該從鍵盤(pán)輸入數(shù)值、字符串和表達(dá)式,并接受該輸入。
a=input(input a number:) %輸入數(shù)值給a
input a number:45
a =
45
b=input(input a number:,s) %輸入字符串給b
input a number:45
b =
45
input(input a number:) %將輸入值進(jìn)行運(yùn)算
input a number:2+3
ans =
5
8.3函數(shù) 26、調(diào)用和參數(shù)傳遞
8.3.1子函數(shù)和私有函數(shù)
1. 子函數(shù)
在一個(gè)M函數(shù)文件中,可以包含一個(gè)以上的函數(shù),其中只有一個(gè)是主函數(shù),其它則為子函數(shù)。
(1) 在一個(gè)M文件中,主函數(shù)必須出現(xiàn)在最上方,其后是子函數(shù),子函數(shù)的次序無(wú)任何限制;
(2) 子函數(shù)不能被其它文件的函數(shù)調(diào)用,只能被同一文件中的函數(shù)(可以是主函數(shù)或子函數(shù))調(diào)用;
(3) 同一文件的主函數(shù)和子函數(shù)變量的工作空間相互獨(dú)立;
(4) 用help和lookfor命令不能提供子函數(shù)的幫助信息。
【例8.11】將【例8.2】畫(huà)二階系統(tǒng)時(shí)域曲線的函數(shù)作為子函數(shù),編寫(xiě)畫(huà)多條曲線的程序。
function Ex0811()
% EX 27、0811 使用函數(shù)調(diào)用繪制二階系統(tǒng)時(shí)域響應(yīng)
z1=0.3;
Ex0802(z1); %調(diào)用Ex0802
hold on
z1=0.5
Ex0802(z1) %調(diào)用Ex0802
z1=0.707;
Ex0802(z1) %調(diào)用Ex0802
function y=Ex0802(zeta)
%子函數(shù),畫(huà)二階系統(tǒng)時(shí)域曲線
x=0:0.1:20;
y=1-1/sqrt(1-zeta^2)*exp(-zeta*x).*sin(sqrt(1-zeta^2)*x+acos(zeta))
plot(x,y)
程序分析:主函數(shù)是Ex0811,子函數(shù)是Ex 28、0802,在主函數(shù)中三次調(diào)用子函數(shù)。程序保存為Ex0811.m文件。
2. 私有函數(shù)
私有函數(shù)是指存放在private子目錄中的M函數(shù)文件,具有以下性質(zhì):
(1) 在private目錄下的私有函數(shù),只能被其父目錄的M函數(shù)文件所調(diào)用,而不能被其它目錄的函數(shù)調(diào)用,對(duì)其它目錄的文件私有函數(shù)是不可見(jiàn)的,私有函數(shù)可以和其它目錄下的函數(shù)重名;
(2) 私有函數(shù)父目錄的M腳本文件也不可調(diào)用私有函數(shù);
(3) 在函數(shù)調(diào)用搜索時(shí),私有函數(shù)優(yōu)先于其它MATLAB路徑上的函數(shù)。
3. 調(diào)用函數(shù)的搜索順序
在MATLAB中調(diào)用一個(gè)函數(shù),搜索的順序如下:
查找是否子函數(shù);
查找是否私有函數(shù) 29、;
從當(dāng)前路徑中搜索此函數(shù);
從搜索路徑中搜索此函數(shù)。
8.3.2局部變量和全局變量
1. 局部變量
局部變量(Local Variables)是在函數(shù)體內(nèi)部使用的變量,其影響范圍只能在本函數(shù)內(nèi),只在函數(shù)執(zhí)行期間存在。
2. 全局變量
全局變量(Global Variables)是可以在不同的函數(shù)工作空間和MATALB工作空間中共享使用的變量。
【例8.12】修改【例8.11】在主函數(shù)和子函數(shù)中使用全局變量。
function Ex0812()
% EX0812 使用全局變量繪制二階系統(tǒng)時(shí)域響應(yīng)
global X
X=0:0.1:20;
z1=0.3;
30、
Ex0802(z1);
hold on
z1=0.5;
Ex0802(z1);
z1=0.707;
Ex0802(z1);
function Ex0802(zeta)
%子函數(shù),畫(huà)二階系統(tǒng)時(shí)域曲線
global X
y=1-1/sqrt(1-zeta^2)*exp(-zeta*X).*sin(sqrt(1-zeta^2)*X+acos(zeta));
plot(X,y);
程序分析:X變量為全局變量,在需要使用的主函數(shù)和子函數(shù)中都需要用global定義;同樣如果在工作空間中定義X為全局變量后也可以使用:
global X
who
Your variables 31、 are:
X
注意:由于全局變量在任何定義過(guò)的函數(shù)中都可以修改,因此不提倡使用全局變量;必須使用時(shí)應(yīng)十分小心,建議把全局變量的定義放在函數(shù)體的開(kāi)始,全局變量用大寫(xiě)字符命名。
8.3.3函數(shù)的參數(shù)
1. 參數(shù)傳遞規(guī)則
function Ex0813()
% EX0813 參數(shù)傳遞繪制二階系統(tǒng)時(shí)域響應(yīng)
z1=0.3;
[x1,y1]=Ex0802(z1);
plot(x1,y1)
hold on
z1=0.5;
[x2,y2]=Ex0802(z1);
plot(x2,y2)
z1=0.707;
[x3,y3]=Ex0802(z1);
plot(x3,y3);
32、
function [x,y]=Ex0502(zeta)
%子函數(shù),畫(huà)二階系統(tǒng)時(shí)域曲線
x=0:0.1:20;
y=1-1/sqrt(1-zeta^2)*exp(-zeta*x).*sin(sqrt(1-zeta^2)*x+acos(zeta));
function [x,y]=Ex0802(zeta)
%子函數(shù),畫(huà)二階系統(tǒng)時(shí)域曲線
x=0:0.1:20;
y=1-1/sqrt(1-zeta^2)*exp(-zeta*x).*sin...
(sqrt(1-zeta^2)*x+acos(zeta));
圖8.3 參數(shù)傳遞
【例8.13】將【例8.11】畫(huà)二階系統(tǒng)時(shí) 33、域的函數(shù)修改,使用輸入輸出參數(shù)來(lái)實(shí)現(xiàn)參數(shù)傳遞,如圖8.3所示。
程序分析:主函數(shù)Ex0813調(diào)用子函數(shù)Ex0802,子函數(shù)中的zeta為輸入?yún)?shù),函數(shù)調(diào)用時(shí)將z1傳遞給子函數(shù)zeta,子函數(shù)計(jì)算后將輸出參數(shù)x和y傳回給主函數(shù)的x1、y1;主函數(shù)調(diào)用子函數(shù)三次,后面兩次參數(shù)的傳遞也是同樣。
2. 函數(shù)參數(shù)的個(gè)數(shù)
(1) nargin和nargout變量
函數(shù)的輸入輸出參數(shù)的個(gè)數(shù)可以通過(guò)變量nargin和nargout獲得,nargin用于獲得輸入?yún)?shù)的個(gè)數(shù),nargout用于獲得輸出參數(shù)的個(gè)數(shù)。
語(yǔ)法:
nargin %在函數(shù)體內(nèi)獲取實(shí)際輸入變量的個(gè)數(shù)
narg 34、out %在函數(shù)體內(nèi)獲取實(shí)際輸出變量的個(gè)數(shù)
nargin(’fun’) %在函數(shù)體外獲取定義的輸入?yún)?shù)個(gè)數(shù)
nargout(‘fun’) %在函數(shù)體外獲取定義的輸出參數(shù)個(gè)數(shù)
【例8.14】計(jì)算兩個(gè)數(shù)的和,根據(jù)輸入的參數(shù)個(gè)數(shù)不同使用不同的運(yùn)算表達(dá)式。
function [sum,n]=Ex0814(x,y)
% EX0814 參數(shù)個(gè)數(shù)可變,計(jì)算x和y的和
if nargin==1
sum=x+0; %輸入一個(gè)參數(shù)就計(jì)算與0的和
elseif nargin==0
sum=0; %無(wú)輸入?yún)?shù)就輸出0
else
su 35、m=x+y; %輸入的是兩個(gè)數(shù)則就計(jì)算和
end
n=nargin;
在命令窗口調(diào)用Ex0814函數(shù),分別使用2個(gè)、1個(gè)和無(wú)輸入?yún)?shù)結(jié)果如下:
[y,n]=Ex0814(2,3)
y =
5
n =
2
[y,n]=Ex0814(2)
y =
2
n =
1
[y,n]=Ex0814
y =
0
n =
0
注意:如果輸入的參數(shù)多于輸入?yún)?shù)個(gè)數(shù),則會(huì)出錯(cuò)。
[y,n]=Ex0814(1,2,3)
??? Error using ==> Ex081 36、4
Too many input arguments.
也可以在工作空間查看函數(shù)體定義的輸入?yún)?shù)個(gè)數(shù):
nargin(Ex0814)
ans =
2
【例8.14續(xù)】添加以下程序,查看用nargout變量獲取輸出參數(shù)個(gè)數(shù)。
if nargout==0 %當(dāng)輸出參數(shù)個(gè)數(shù)為0時(shí),運(yùn)算結(jié)果為0
sum=0;
end
在命令窗口調(diào)用Ex0814函數(shù),當(dāng)輸出參數(shù)格式不同時(shí),結(jié)果如下:
Ex0814(2,3) %當(dāng)輸出參數(shù)個(gè)數(shù)為0時(shí)
ans =
0
y=Ex0814(2,3) %當(dāng)輸出參數(shù)個(gè)數(shù)為1時(shí)
y =
37、 5
[y,n,x]=Ex0814 %當(dāng)輸出參數(shù)個(gè)數(shù)為太多時(shí)
??? Error using ==> Ex0814
Too many output arguments.
程序分析:當(dāng)輸出參數(shù)個(gè)數(shù)為0時(shí),即使有兩個(gè)輸入?yún)?shù),運(yùn)算結(jié)果也為0,結(jié)果送給ans變量;當(dāng)輸出的參數(shù)個(gè)數(shù)太多,也會(huì)出錯(cuò)。
(2) varargin和varargout變量
varargin和varargout可以獲得輸入輸出變量的各元素內(nèi)容。
【例8.15】計(jì)算所有輸入變量的和。
function [y,n]=Ex0815(varargin)
% EX0815 使用可變參數(shù)varar 38、gin
if nargin==0 %當(dāng)沒(méi)有輸入變量時(shí)輸出0
disp(No Input variables.)
y=0;
elseif nargin==1 %當(dāng)一個(gè)輸入變量時(shí),輸出該數(shù)
y=varargin{1};
else
n=nargin;
y=0;
for m=1:n
y=varargin{m}+y; %當(dāng)有多個(gè)輸入變量時(shí),取輸入變量循環(huán)相加
end
end
n=nargin;
在MATLAB的命令窗口中輸入不同個(gè)數(shù)的變量調(diào)用函數(shù)Ex0815,結(jié)果如下:
[y 39、,n]=Ex0815(1,2,3,4) %輸入4個(gè)參數(shù)
y =
10
n =
4
[y,n]=Ex0815(1) %輸入1個(gè)參數(shù)
y =
1
n =
1
[y,n]=Ex0815 %無(wú)輸入?yún)?shù)
No Input variables.
y =
0
n =
0
程序分析:n為輸入?yún)?shù)的個(gè)數(shù);y為求和運(yùn)算的結(jié)果。
8.3.4程序舉例
【例8.16】根據(jù)阻尼系數(shù)繪制不同二階系統(tǒng)的時(shí)域響應(yīng),當(dāng)欠阻尼時(shí),當(dāng)臨界阻尼時(shí),當(dāng)過(guò)阻尼時(shí)。
M文件的程序代碼如下:
f 40、unction y=Ex0816(z1)
% EX0816 主函數(shù)調(diào)用子函數(shù),根據(jù)阻尼系數(shù)繪制二階系統(tǒng)時(shí)域曲線
t=0:0.1:20;
if (z1>=0)&(z1<1)
y=plotxy1(z1,t);
elseif z1==1
y=plotxy2(z1,t);
else
y=plotxy3(z1,t);
end
function y1=plotxy1(zeta,x)
%畫(huà)欠阻尼二階系統(tǒng)時(shí)域曲線
y1=1-1/sqrt(1-zeta^2)*exp(-zeta*x).*sin(sqrt(1-zeta^2)*x+acos(zeta));
41、
plot(x,y1)
function y2=plotxy2(zeta,x)
%畫(huà)臨界阻尼二階系統(tǒng)時(shí)域曲線
y2=1-exp(-x).*(1+x);
plot(x,y2)
function y3=plotxy3(zeta,x)
%畫(huà)過(guò)阻尼二階系統(tǒng)時(shí)域曲線
y3=1-1/(2*sqrt(zeta^2-1))*(exp(-((zeta-sqrt(zeta^2-1))*x))./(zeta-sqrt(zeta^2-1))...
-exp(-((zeta+sqrt(zeta^2-1))*x))./(zeta+sqrt(zeta^2-1)));
plot(x,y3)
42、
程序分析:主函數(shù)名為Ex0816,三個(gè)子函數(shù)名分別為plotxy1、plotxy2、plotxy3,文件保存為Ex0816.m。當(dāng)在命令窗口中輸入以下命令:
y=Ex0816(0.3);
hold on
y=Ex0816(0.707);
y=Ex0816(1);
y=Ex0816(2);
則產(chǎn)生如圖8.4所示時(shí)域響應(yīng)曲線。
圖8.4 不同阻尼系數(shù)的時(shí)域響應(yīng)曲線
【例8.17】編寫(xiě)M函數(shù)文件,通過(guò)流程控制語(yǔ)句,建立如下的矩陣。
function y=Ex0817(m)
% EX0817 用循環(huán)流程控制語(yǔ)句創(chuàng)建矩陣
y=0;
m= 43、m-1;
for n=1:m
y=[0,y]; %創(chuàng)建全0行
end
for n=1:m
a=[1:1:n];
b=a;
for k=m:-1:n
b=[0,b];
end
y=[b;y];
n=n+1;
end
程序分析:將矩陣的行列數(shù)用輸入?yún)?shù)m來(lái)確定,輸出參數(shù)為矩陣y。使用雙重循環(huán)來(lái)創(chuàng)建矩陣,將文件保存為Ex0817.m。
在命令窗口中調(diào)用Ex0817函數(shù):
y=Ex0817(5)
y =
0 1 2 3 4
44、 0 0 1 2 3
0 0 0 1 2
0 0 0 0 1
0 0 0 0 0
8.4 M文件性能的優(yōu)化和加速
8.4.1 P碼文件
1. P碼文件的生成
P碼文件使用pcode命令生成,生成的P碼文件與原M文件名相同,其擴(kuò)展名為“.p”。
語(yǔ)法:
pcode Filename.m %在當(dāng)前目錄生成Filename.p
pcode Filename.m -inplace %在Filename 45、.m所在目錄生成Filename.p
pcode Ex0817.m
則在當(dāng)前目錄就生成了P碼文件Ex0817.p。
2. P碼文件的特點(diǎn)
(1) P碼文件的運(yùn)行速度比原M文件速度快
(2) 存在同名的M文件和P碼文件時(shí)則P碼文件被調(diào)用
(3) P碼文件保密性好
用字處理軟件打開(kāi)Ex0817.p文件,看到的是亂碼。
8.4.2 M文件性能優(yōu)化
1. 使用循環(huán)時(shí)提高速度的措施
循環(huán)語(yǔ)句及循環(huán)體是MATLAB編程的瓶頸問(wèn)題,改進(jìn)這種狀況有三種方法:
(1) 盡量用向量的運(yùn)算來(lái)代替循環(huán)操作。
(2) 在必須使用多重循環(huán)的情況下,如果兩個(gè)循環(huán)執(zhí)行的次數(shù)不同,則建議在循環(huán) 46、的外環(huán)執(zhí)行循環(huán)次數(shù)少的,內(nèi)環(huán)執(zhí)行循環(huán)次數(shù)多的,也可以顯著提高速度。
(3) 應(yīng)用Mex技術(shù)
如果耗時(shí)的循環(huán)不可避免,就應(yīng)該考慮用其他語(yǔ)言,如C或Fortran語(yǔ)言,按照Mex技術(shù)要求的格式編寫(xiě)相應(yīng)部分的程序,然后通過(guò)編譯聯(lián)接,形成在MATLAB可以直接調(diào)用的動(dòng)態(tài)鏈接庫(kù)(DLL)文件,這樣就可以顯著地加快運(yùn)算速度(在8.1.1小節(jié)介紹)。
2. 大型矩陣的預(yù)先定維
給大型矩陣動(dòng)態(tài)地定維是個(gè)很費(fèi)時(shí)間的事。
【例8.18】將【例8.17】中的雙重循環(huán)改為單循環(huán),并先用zeros函數(shù)定維來(lái)提高運(yùn)行速度,創(chuàng)建矩陣。
function y=Ex0818(m)
% EX0818 先定維再 47、創(chuàng)建矩陣
m=m-1;
y=zeros(m);
for n=1:m-1
a=1:m-n;
y(n,n+1:m)=a;
end
y
在命令窗口中分別調(diào)用Ex0817和Ex0818函數(shù),比較其運(yùn)行速度的不同:
y=Ex0817(200)
y=Ex0818(200)
3. 優(yōu)先考慮內(nèi)在函數(shù)
矩陣運(yùn)算應(yīng)該盡量采用MATLAB的內(nèi)在函數(shù),因?yàn)閮?nèi)在函數(shù)是由更底層的C語(yǔ)言構(gòu)造的,其執(zhí)行速度顯然很快。
4. 采用高效的算法
在實(shí)際應(yīng)用中,解決同樣的數(shù)學(xué)問(wèn)題經(jīng)常有各種各樣的算法。因此,應(yīng)尋求更高效的算法。
5. 盡量使用M函數(shù)文件代替M腳本文件
48、
由于M腳本文件每次運(yùn)行時(shí),都必須把程序裝入內(nèi)存,然后逐句解釋執(zhí)行,十分費(fèi)時(shí)。
8.4.3 JIT和加速器
1. JIT和加速器的加速范圍
JIT和加速器的應(yīng)用范圍如下:
只對(duì)維數(shù)不超過(guò)3的“非稀疏”數(shù)組起作用;
只對(duì)“雙精度”、“整數(shù)”、“字符串”和“邏輯”等四種數(shù)據(jù)類(lèi)型起作用;
只對(duì)內(nèi)部函數(shù)的調(diào)用起作用,對(duì)用戶的M函數(shù)或MEX文件不起作用;
只對(duì)控制語(yǔ)句for、while、if、elseif、switch中標(biāo)量運(yùn)算的條件表達(dá)式起作用;
當(dāng)一行程序中含有“不可加速的”命令或變量時(shí),整行都不被加速;
當(dāng)變量改變數(shù)據(jù)類(lèi)型或維數(shù),則該語(yǔ)句不被加速;
如果i和j不以 49、虛數(shù)單位形式使用,則該語(yǔ)句不被加速;
在Intel系列CPU硬件上,Windows和Linux系統(tǒng)加速能力最強(qiáng)。
2. 使用程序性能剖析窗口
(1) 打開(kāi)程序性能剖析窗口
指示燈
命令輸入欄
時(shí)間指示器
開(kāi)始剖析
圖8.5 程序性能剖析窗口
選擇菜單“View”——“Profiler”;或使用在命令窗口輸入“profile viewer”命令都可以打開(kāi)程序性能剖析窗口,如圖8.5所示。
(2) 對(duì)MATLAB的命令進(jìn)行剖析
對(duì)MATLAB的命令進(jìn)行剖析有兩種方式:
在上圖中的“命令輸入欄”中輸入需要剖析的命令,然后單擊“Start Profiling”按鈕,則 50、指示燈變?yōu)榫G色,“Start Profiling”按鈕變灰色,時(shí)間指示器的計(jì)時(shí)在累加;當(dāng)命令運(yùn)行結(jié)束時(shí),狀態(tài)恢復(fù),并出現(xiàn)剖析報(bào)告。
將“命令輸入欄”清空,然后單擊“Start Profiling”按鈕開(kāi)始剖析,則“Start Profiling”按鈕變?yōu)椤癝top Profiling”,指示燈變?yōu)榫G色表示啟動(dòng)剖析,時(shí)間指示器的計(jì)時(shí)在累加;然后在MATLAB命令窗口中輸入需要剖析的命令,進(jìn)行剖析;當(dāng)命令運(yùn)行結(jié)束,單擊“Stop Profiling”按鈕停止剖析,則狀態(tài)恢復(fù),并出現(xiàn)剖析報(bào)告。這種方式的時(shí)間指示器顯示的只是單擊按鈕“Stop Profiling”開(kāi)始到單擊“Stop Profil 51、ing”按鈕的時(shí)間,并不表示命令的運(yùn)行時(shí)間。
(3) 查看剖析報(bào)告
在程序性能分析窗口中以表格顯示“剖析分析匯總表”(Profile Summary),從上到下按占用時(shí)間的多少排列。
將第三章的例題進(jìn)行剖析,【例3.24】求微分方程組的解,保存為“Ex0324.m”文件,內(nèi)容如下:
%符號(hào)微分方程組求解
[x,y]=dsolve(Dx=y,Dy=-x)
[x,y]=dsolve(Dx=y,Dy=-x,t)
圖8.6 剖析報(bào)告
將該文件進(jìn)行剖析,在“命令輸入欄”中輸入“Ex0324”,然后單擊“Start Profiling”按鈕開(kāi)始剖析,則“剖析分析匯總表”如圖8.6所示,單擊 52、“Ex0324”超鏈接則顯示詳細(xì)的列表:
3. JIT和加速器的開(kāi)關(guān)函數(shù)
在MATLAB6.5版總是把JIT和加速器置于開(kāi)啟狀態(tài),可以使用命令來(lái)控制JIT和加速器的開(kāi)啟和關(guān)閉。
語(yǔ)法:
feature JIT on %開(kāi)啟JIT
feature JIT off %關(guān)閉JIT
feature accel on %開(kāi)啟加速器
feature accel off %關(guān)閉加速器
將【例8.18】創(chuàng)建矩陣的程序在開(kāi)啟或關(guān)閉JIT和加速器時(shí),查看其運(yùn)行速度。
在圖8.6的“命令輸入欄”中輸入“y=Ex0818(200)”
當(dāng)默認(rèn)狀態(tài)時(shí)JIT和加速器置 53、于開(kāi)啟狀態(tài),在程序性能剖析窗口中查看運(yùn)行時(shí)間為0.43;當(dāng)使用“feature JIT off”命令關(guān)閉JIT時(shí),運(yùn)行時(shí)間為0.451;當(dāng)將JIT和加速器都關(guān)閉時(shí)則運(yùn)行時(shí)間為0.481。
注意:JIT和加速器對(duì)于不同的M文件作用不同,而不同的運(yùn)行環(huán)境、不同軟件、不同機(jī)器都會(huì)得出不同的運(yùn)行時(shí)間,上面的運(yùn)行時(shí)間只作為參考。
8.5內(nèi)聯(lián)函數(shù)
1. 內(nèi)聯(lián)函數(shù)的創(chuàng)建
創(chuàng)建內(nèi)聯(lián)函數(shù)可以使用inline命令實(shí)現(xiàn)。
語(yǔ)法:
inline(‘string’,arg1,arg2,…) %創(chuàng)建內(nèi)聯(lián)函數(shù)
說(shuō)明:’string’必須是不帶賦值號(hào)(“=”)的字符串;arg1和arg2是函數(shù)的輸入變 54、量。
【例8.19】創(chuàng)建內(nèi)聯(lián)函數(shù)實(shí)現(xiàn)。
f=inline(sin(x)*exp(-z*x),x,z) %創(chuàng)建內(nèi)聯(lián)函數(shù)
f =
Inline function:
f(x,z) = sin(x)*exp(-z*x)
y=f(5,0.3) %調(diào)用函數(shù)f
y =
-0.2140
2. 查看內(nèi)聯(lián)函數(shù)
MATLAB可以用char、class和argnames命令方便地查看內(nèi)聯(lián)函數(shù)的信息。
語(yǔ)法:
char(inline_fun) %查看內(nèi)聯(lián)函數(shù)的內(nèi)容
class(inline_fun) 55、 %查看內(nèi)聯(lián)函數(shù)的類(lèi)型
argnames(inline_fun) %查看內(nèi)聯(lián)函數(shù)的變量
【例8.19續(xù)】查看內(nèi)聯(lián)函數(shù)的信息。
char(f)
ans =
sin(x)*exp(-z*x)
class(f)
ans =
inline
argnames(f)
ans =
x
z
3. 使內(nèi)聯(lián)函數(shù)適用于數(shù)組運(yùn)算
內(nèi)聯(lián)函數(shù)的輸入變量不能是數(shù)組,但可以使用vectorize命令將內(nèi)聯(lián)函數(shù)適用于數(shù)組運(yùn)算。
語(yǔ)法:
vectorize(inline_fun) %使內(nèi)聯(lián)函數(shù)適用于數(shù)組運(yùn)算
【例 56、8.19續(xù)】使內(nèi)聯(lián)函數(shù)適用于數(shù)組運(yùn)算。
ff=vectorize(f) %使內(nèi)聯(lián)函數(shù)f轉(zhuǎn)換為適合數(shù)組運(yùn)算
ff =
Inline function:
ff(x,z) = sin(x).*exp(-z.*x)
x=0:0.1:20;
y=ff(x,0.3);
4. 執(zhí)行內(nèi)聯(lián)函數(shù)
內(nèi)聯(lián)函數(shù)還可以直接使用feval命令執(zhí)行。
語(yǔ)法:
[y1,y2,…]=feval(inline_fun,arg1,arg2…)
【例8.19續(xù)】執(zhí)行內(nèi)聯(lián)函數(shù)。
x=0:0.1:20;
z=0:0.05:10;
y=feval(f 57、f,x,z)
8.6利用函數(shù)句柄執(zhí)行函數(shù)
8.6.1函數(shù)句柄的創(chuàng)建
1. 函數(shù)句柄的創(chuàng)建
語(yǔ)法:
h_fun=@fun %創(chuàng)建函數(shù)句柄
h_fun=str2func(‘fun’) %創(chuàng)建函數(shù)句柄
h_array=str2func({‘fun1’,’fun2’,…}) %創(chuàng)建函數(shù)句柄數(shù)組
說(shuō)明:fun是函數(shù)名,h_fun是函數(shù)句柄,h_array是函數(shù)句柄數(shù)組。
【例8.20】創(chuàng)建MATLAB內(nèi)部函數(shù)的句柄。
h_sin=@sin; %創(chuàng)建函數(shù)句柄
h_cos=str2func(cos); %創(chuàng)建函 58、數(shù)句柄數(shù)組
h_array=str2func({sin,cos,tan})
h_array =
@sin @cos @tan
2. 使用函數(shù)句柄的優(yōu)點(diǎn)
(1) 在更大范圍調(diào)用函數(shù)
函數(shù)句柄包含了函數(shù)文件的路徑和函數(shù)類(lèi)型,即函數(shù)是否為內(nèi)部函數(shù)、M或P文件、子函數(shù)、私有函數(shù)等,因此無(wú)論函數(shù)所在的文件是否在搜索路徑上,是否是當(dāng)前路徑,是否是子函數(shù)或私有函數(shù),只要函數(shù)句柄存在,函數(shù)就能執(zhí)行。
(2) 提高函數(shù)調(diào)用的速度
不使用函數(shù)句柄時(shí),對(duì)函數(shù)的每次調(diào)用都要為該函數(shù)進(jìn)行全面的路徑搜索,直接影響了速度。
(3) 使函數(shù)調(diào)用象使用變量一 59、樣方便、簡(jiǎn)單。
(4) 可迅速獲得同名重載函數(shù)的位置、類(lèi)型信息。
8.6.2用feval命令執(zhí)行函數(shù)
函數(shù)也可以使用feval命令直接執(zhí)行,feval命令可以使用函數(shù)句柄或函數(shù)名。
語(yǔ)法:
[y1,y2,…]=feval(h_fun,arg1,arg2…)
[y1,y2,…]=feval(‘funname’,arg1,arg2…)
說(shuō)明:h_fun是函數(shù)句柄,’funname’是函數(shù)名,arg1、arg2…是輸入?yún)?shù),y1、y2…是輸出參數(shù)。
【例8.21】將【例8.17】編寫(xiě)的繪制二階系統(tǒng)時(shí)域響應(yīng)曲線中的調(diào)用各子函數(shù)改為利用函數(shù)句柄實(shí)現(xiàn)。
function y=Ex 60、0821(z1)
% EX0821 利用函數(shù)句柄執(zhí)行函數(shù),二階系統(tǒng)時(shí)域響應(yīng)
t=0:0.1:20;
h_plotxy1=str2func(plotxy1) %創(chuàng)建函數(shù)句柄
h_plotxy2=str2func(plotxy2) %創(chuàng)建函數(shù)句柄
h_plotxy3=str2func(plotxy3) %創(chuàng)建函數(shù)句柄
if (z1>=0)&(z1<1)
y=feval(h_plotxy1,z1,t); %執(zhí)行函數(shù)
elseif z1==1
y=feval(h_plotxy2,z1,t); %執(zhí)行函數(shù)
else
y=feval(h_plo 61、txy3,z1,t); %執(zhí)行函數(shù)
end
function y1=plotxy1(zeta,x)
%畫(huà)欠阻尼二階系統(tǒng)時(shí)域曲線
y1=1-1/sqrt(1-zeta^2)*exp(-zeta*x).*sin(sqrt(1-zeta^2)*x+acos(zeta));
plot(x,y1)
function y2=plotxy2(zeta,x)
%畫(huà)臨界阻尼二階系統(tǒng)時(shí)域曲線
y2=1-exp(-x).*(1+x);
plot(x,y2)
function y3=plotxy3(zeta,x)
%畫(huà)過(guò)阻尼二階系統(tǒng)時(shí)域曲線
y3=1-1/(2*sqrt(zeta 62、^2-1))*(exp(-((zeta-sqrt(zeta^2-1))*x))./(zeta-sqrt(zeta^2-1))...
-exp(-((zeta+sqrt(zeta^2-1))*x))./(zeta+sqrt(zeta^2-1)));
plot(x,y3)
程序分析:在主函數(shù)中使用函數(shù)句柄執(zhí)行各子函數(shù),運(yùn)行的結(jié)果與【例8.17】相同。
在MATLAB的命令窗口調(diào)用該Ex0821函數(shù)有三種格式:
(1) 用feval命令利用函數(shù)句柄執(zhí)行
h_Ex0821=str2func(Ex0821)
h_Ex0821 =
@Ex0821
y=f 63、eval(h_Ex0821,1);
h_plotxy1 =
@plotxy1
h_plotxy2 =
@plotxy2
h_plotxy3 =
@plotxy3
(2) 用feval命令利用函數(shù)名執(zhí)行
y=feval(Ex0821,1);
(3) 直接調(diào)用函數(shù)
y=Ex0821(1);
8.7利用泛函命令進(jìn)行數(shù)值分析
在MATLAB中,所有以函數(shù)為輸入變量的命令,都稱為泛函命令。
常見(jiàn)語(yǔ)法:
[輸出變量列表]=函數(shù)名(h_fun,輸入變量列表)
[輸出變量列表]=函數(shù)名(‘funname’,輸入 64、變量列表)
說(shuō)明:h_fun是要被執(zhí)行的M函數(shù)文件的句柄,或者是內(nèi)聯(lián)函數(shù)和字符串;‘funname’是M函數(shù)文件名。
8.7.1求極小值
1. fminbnd函數(shù)
fminbnd函數(shù)用來(lái)計(jì)算單變量非線性函數(shù)的最小值。
語(yǔ)法:
[x,y]=fminbnd(h_fun,x1,x2,options)
[x,y]=fminbnd(‘funname’,x1,x2,options)
說(shuō)明:h_fun是函數(shù)句柄,’funname’是函數(shù)名,必須是單值非線性函數(shù);options是用來(lái)控制算法的參數(shù)向量,默認(rèn)值為0可省略;x是fun函數(shù)在區(qū)間x1 65、的最小值。
【例8.22】用fminbnd求解humps函數(shù)的極小值。
[x,y]=fminbnd(@humps,0.5,0.8) %求在0.5—0.8之間極小值
x =
0.6370
y =
11.2528
程序分析:humps函數(shù)是MATLAB提供的M文件,保存為humps.m文件,@humps 表示humps函數(shù)的句柄,humps的曲線如圖8.7所示,最小值為圖中的圓點(diǎn)(0.6370,11.2528),誤差小于10-4。
圖8.7 求humps函數(shù)最小值
2. fminsearch函數(shù)
fminsearch函數(shù)是求多變量無(wú)束縛 66、非線性最小值。
語(yǔ)法:
x=fminsearch(h_fun,x0)
x=fminsearch(‘funname’,x0)
說(shuō)明:x0是最小值點(diǎn)的初始猜測(cè)值。
【例8.23】求著名的Banana測(cè)試函數(shù)f(x,y)=100(y-x2)2+(1-x)2的最小值,它的理論最小值是x=1,y=1。該測(cè)試函數(shù)有一片淺谷,很多算法都難以逾越。
fn=inline(100*(x(2)-x(1)^2)^2+(1-x(1))^2 ,x) %用inline產(chǎn)生內(nèi)聯(lián)函數(shù),x和y用二元數(shù)組表示
fn =
Inline function:
fn(x) = 100*(x(2)-x(1)^2)^2+(1-x(1))^2
y=fminsearch(fn,[0.5,-1]) %從(0.5,-1)為初始值開(kāi)始搜索求最小值
- 溫馨提示:
1: 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
2: 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
3.本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
5. 裝配圖網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2023年六年級(jí)數(shù)學(xué)下冊(cè)6整理和復(fù)習(xí)2圖形與幾何第7課時(shí)圖形的位置練習(xí)課件新人教版
- 2023年六年級(jí)數(shù)學(xué)下冊(cè)6整理和復(fù)習(xí)2圖形與幾何第1課時(shí)圖形的認(rèn)識(shí)與測(cè)量1平面圖形的認(rèn)識(shí)練習(xí)課件新人教版
- 2023年六年級(jí)數(shù)學(xué)下冊(cè)6整理和復(fù)習(xí)1數(shù)與代數(shù)第10課時(shí)比和比例2作業(yè)課件新人教版
- 2023年六年級(jí)數(shù)學(xué)下冊(cè)4比例1比例的意義和基本性質(zhì)第3課時(shí)解比例練習(xí)課件新人教版
- 2023年六年級(jí)數(shù)學(xué)下冊(cè)3圓柱與圓錐1圓柱第7課時(shí)圓柱的體積3作業(yè)課件新人教版
- 2023年六年級(jí)數(shù)學(xué)下冊(cè)3圓柱與圓錐1圓柱第1節(jié)圓柱的認(rèn)識(shí)作業(yè)課件新人教版
- 2023年六年級(jí)數(shù)學(xué)下冊(cè)2百分?jǐn)?shù)(二)第1節(jié)折扣和成數(shù)作業(yè)課件新人教版
- 2023年六年級(jí)數(shù)學(xué)下冊(cè)1負(fù)數(shù)第1課時(shí)負(fù)數(shù)的初步認(rèn)識(shí)作業(yè)課件新人教版
- 2023年六年級(jí)數(shù)學(xué)上冊(cè)期末復(fù)習(xí)考前模擬期末模擬訓(xùn)練二作業(yè)課件蘇教版
- 2023年六年級(jí)數(shù)學(xué)上冊(cè)期末豐收?qǐng)@作業(yè)課件蘇教版
- 2023年六年級(jí)數(shù)學(xué)上冊(cè)易錯(cuò)清單十二課件新人教版
- 標(biāo)準(zhǔn)工時(shí)講義
- 2021年一年級(jí)語(yǔ)文上冊(cè)第六單元知識(shí)要點(diǎn)習(xí)題課件新人教版
- 2022春一年級(jí)語(yǔ)文下冊(cè)課文5識(shí)字測(cè)評(píng)習(xí)題課件新人教版
- 2023年六年級(jí)數(shù)學(xué)下冊(cè)6整理和復(fù)習(xí)4數(shù)學(xué)思考第1課時(shí)數(shù)學(xué)思考1練習(xí)課件新人教版