金融數(shù)值計算課件章matlab_第1頁
金融數(shù)值計算課件章matlab_第2頁
金融數(shù)值計算課件章matlab_第3頁
金融數(shù)值計算課件章matlab_第4頁
金融數(shù)值計算課件章matlab_第5頁
已閱讀5頁,還剩139頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1金融數(shù)值計算與應(yīng)用軟件

--MATLAB王輝中央財經(jīng)大學(xué)金融學(xué)院E-mail:2第2章MATLAB數(shù)值計算32.1

矩陣及向量運算

2.1.1向量的建立及運算向量的生成:(1)直接輸入:如a=[1,2,5,3](2)利用冒號表達(dá)式生成,如b=[2:2:10](3)線性等份向量生成

y=linspace(x1,x2,n),生成n維向量,使得y(1)=x1,y(n)=x2。列向量4向量的基本運算(1)向量的加減:用+、-。同維向量才可以加、減。相應(yīng)元素加減。向量與數(shù)可以加、減。用+、-。數(shù)與向量的每個元素進(jìn)行作用。(2)向量與數(shù)可以相乘(乘方),用*;向量與數(shù)可以相除,向量/數(shù),數(shù)./向量。(3)兩個向量點乘(點除),必須是同維向量。(4)向量內(nèi)積用dot(a,b)。5向量的基本運算的例子例2.1.1向量的生成x=[1234];y=[0:1:15];z=linspace(1,100,6)例2.1.2向量的運算x=[1352];y=2*x+1;z=x+y;w1=x./y;w2=x.*y;w3=dot(x,y)6向量的基本運算的例子例2.1.3:下表是邯鄲鋼鐵、ST東北高速、恒瑞醫(yī)藥和深達(dá)聲2007年9月13日的收盤價及成交量,計算其各自的成交金額及總成交額。項目邯鄲鋼鐵ST東北高速恒瑞醫(yī)藥深達(dá)聲收盤價/元8.566.5142.137.99成交量/股86384700958090091900027229007答案見ex2_1_3.m8向量編址向量元素用下標(biāo)訪問,如x(1)表示向量x的第一個元素向量元素可以成塊訪問,如x([13])例2.1.4令向量x=(0.95010.23110.60680.48600.8913)

(1)尋訪數(shù)組x的第三個元素(2)尋訪數(shù)組x的第一、二、五個元素組成的子數(shù)組

(3)尋訪前三個元素組成的子數(shù)組(更多內(nèi)容參見講義)9查找滿足一定條件的向量元素例2.1.4(續(xù))

求由大于0.5的元素構(gòu)成的子數(shù)組

可以隨意更改、增加或刪除向量的元素例2.1.4(續(xù))把上例中x的第三個元素重新賦值為0;將x的第1、4個元素都賦值為1;刪除x的第2個元素答案見ex2_1_4.m不論是行向量或列向量,我們均可用相同的函數(shù)找出其元素個數(shù)、最大值、最小值10適用于向量的常用函數(shù)

min(x):

向量x的元素的最小值max(x):

向量x的元素的最大值mean(x):

向量x的元素的平均值,c語言中要用循環(huán)median(x):

向量x的元素的中位數(shù)std(x):

向量x的元素的標(biāo)準(zhǔn)差diff(x):

向量x的相鄰元素的差sort(x):

對向量x的元素進(jìn)行排序(Sorting)length(x):

向量x的元素個數(shù)norm(x):

向量x的歐氏(Euclidean)長度sum(x):

向量x的元素總和prod(x):

向量x的元素總乘積

11向量運算的練習(xí)例2.1.5:創(chuàng)建一個8維行(列)向量x。(1)輸出其第2個元素(2)輸出其第1、3、5、7個元素(3)找出其小于零的元素并賦值為11

(4)找出該向量元素的最大值、最小值以及元素平均值和元素個數(shù)(5)求lnx2122.1.2矩陣的建立及運算

——矩陣的建立(1)直接輸入:如:a=[1,3,4;4,3,2].(例2.1.6)(2)大型矩陣一般創(chuàng)建M文件,便于修改

(i)啟動有關(guān)編輯程序或MATLAB文本編輯器,并輸入待建矩陣:

(ii)把輸入的內(nèi)容以純文本方式存盤(設(shè)文件名為mymatrix.m)。

(iii)在MATLAB命令窗口中輸入mymatrix,即運行該M文件,就會自動建立一個名為MYMAT的矩陣,可供以后使用。13矩陣的生成(二)(3)多維數(shù)組的創(chuàng)建函數(shù)cat,格式

A=cat(n,A1,A2,…,Am)說明:n=1和n=2時分別構(gòu)造[A1;A2]和[A1,A2],都是二維數(shù)組,而n=3時可以構(gòu)造出三維數(shù)組。例2.1.7

A1=[1,2,3;4,5,6;7,8,9];A2=A1';A3=A1-A2;A4=cat(3,A1,A2,A3)A4(:,:,1)=123456789A4(:,:,2)=147258369A4(:,:,3)=

0-2-420-242014特殊矩陣的生成單位矩陣:eye:產(chǎn)生單位矩陣??站仃嚕篈=[]全零矩陣:zeros:產(chǎn)生全0矩陣(零矩陣)。全1矩陣:

ones:產(chǎn)生全1矩陣(幺矩陣)。隨機(jī)矩陣:rand:產(chǎn)生0~1間均勻分布的隨機(jī)矩陣。randn:產(chǎn)生均值為0,方差為1的標(biāo)準(zhǔn)正態(tài)分布隨機(jī)矩陣?yán)?.1.9(1)建立一個3×3零矩陣。(2)建立一個3×2×4零矩陣。(3)設(shè)A=[123;456],建立一個與矩陣A同樣大小零矩陣。答案見ex2_1_9.m15例2.1.10建立隨機(jī)矩陣

(1)在區(qū)間[20,50]內(nèi)均勻分布的5階隨機(jī)矩陣(2)均值為0.6、方差為0.1的5階正態(tài)分布隨機(jī)矩陣。

答案見ex2_1_10.m16矩陣的合并和拆分(一)(1)建立大矩陣:大矩陣可由方括號中的小矩陣或向量建立起來。x=[1:1:8];y=[-10:1:-3];z=[x;y](2)矩陣元素:通過下標(biāo)引用矩陣的元素,例如A(3,2)=200。采用矩陣元素的序號來引用矩陣元素。矩陣元素的序號就是相應(yīng)元素在內(nèi)存中的排列順序。在MATLAB中,矩陣元素按列存儲,先第一列,再第二列,依次類推。矩陣元素A(i,j)的序號為(j-1)*m+i。例如A=[1,2,3;4,5,6];A(3)=2。

17矩陣的合并和拆分(二)(3)利用冒號表達(dá)式獲得子矩陣①A(:,j)表示取A矩陣的第j列全部元素;A(i,:)表示A矩陣第i行的全部元素;A(i,j)表示取A矩陣第i行、第j列的元素。②A(i:i+m,:)表示取A矩陣第i~i+m行的全部元素;A(:,k:k+m)表示取A矩陣第k~k+m列的全部元素,A(i:i+m,k:k+m)表示取A矩陣第i~i+m行內(nèi),并在第k~k+m列中的所有元素。

18矩陣的合并和拆分(三)(4)在MATLAB中,定義[]為空矩陣。給變量X賦空矩陣的語句為X=[]。注意,X=[]與clearX不同,clear是將X從工作空間中刪除,而空矩陣則存在于工作空間中,只是維數(shù)為0。reshape(A,m,n),它在矩陣總元素保持不變的前提下,將矩陣A重新排成m×n的二維矩陣。

A=rand(4),B=reshape(A,8,2)19矩陣的合并和拆分(四)例2.1.11

(1)建立2×4均勻隨機(jī)矩陣x、4×4單位矩陣y、6×2全4矩陣z;(2)將上述三個矩陣合并成一個矩陣H;(3)分別用下標(biāo)法和序號法引用H(4,2)和H(2,6);(4)求H的第3行和第5列的元素;(5)矩陣B表示由H的第2行到第6行且在第1列到第4列的元素組成的矩陣;(6)將矩陣H變?yōu)?×9階矩陣,并令其第1行為空.20答案見ex2_1_11.m21矩陣分析(一)——對角陣提取矩陣的對角線元素

設(shè)A為m×n矩陣,diag(A)函數(shù)用于提取矩陣A主對角線元素,產(chǎn)生一個具有min(m,n)個元素的列向量diag(A)函數(shù)還有一種形式diag(A,k),其功能是提取第k條對角線的元素。構(gòu)造對角矩陣

設(shè)V為具有m個元素的向量,diag(V)將產(chǎn)生一個m×m對角矩陣,其主對角線元素即為向量V的元素。

diag(V)函數(shù)也有另一種形式diag(V,k),其功能是產(chǎn)生一個n×n(n=m+k)對角陣,其第k條對角線的元素即為向量V的元素。22矩陣分析例2.1.12例2.1.12

先建立5×5矩陣A,然后將A的第一行元素乘以1,第二行乘以2,…,第五行乘以5。

答案見ex2_1_12.m

23矩陣分析(二)——三角陣上三角矩陣

求矩陣A的上三角陣的MATLAB函數(shù)是triu(A)。

triu(A)函數(shù)也有另一種形式triu(A,k),其功能是求矩陣A的第k條對角線以上的元素。例如,提取矩陣A的第2條對角線以上的元素,形成新的矩陣B。下三角矩陣

在MATLAB中,提取矩陣A的下三角矩陣的函數(shù)是tril(A)和tril(A,k),其用法與提取上三角矩陣的函數(shù)triu(A)和triu(A,k)完全相同。24矩陣分析(三)矩陣的轉(zhuǎn)置:轉(zhuǎn)置運算符是單撇號‘。

矩陣的逆:inv(A)方陣的行列式:det(A)矩陣的秩:rank(A)矩陣的跡:矩陣的跡等于矩陣的對角線元素之和,也等于矩陣的特征值之和。求矩陣的跡的函數(shù)是trace(A)矩陣的特征值與特征向量:計算矩陣A的特征值和特征向量的函數(shù)是eig(A)(i)E=eig(A):求矩陣A的全部特征值,構(gòu)成向量E。

(ii)[V,D]=eig(A):求矩陣A的全部特征值,構(gòu)成對角陣D,并求A的特征向量構(gòu)成V的列向量。252.2MATLAB運算

算術(shù)運算

注意函數(shù)的運算作用于矩陣的所有元素

關(guān)系運算邏輯運算262.2.1算術(shù)運算MATLAB的基本算術(shù)運算:+(加)、-(減)、*(乘)、/(右除)、\(左除)、^(乘方)。在MATLAB中,有兩種矩陣除法運算:\和/,分別表示左除和右除。如果A陣是非奇異方陣,則A\B和B/A運算可以實現(xiàn)。A\B等于inv(A)*B,而B/A等于B*inv(A)。

點運算:點運算符有.*、./、.\和.^。兩矩陣進(jìn)行點運算是指它們的對應(yīng)元素進(jìn)行相關(guān)運算,要求兩矩陣的維參數(shù)相同。272.2.2關(guān)系運算

關(guān)系運算符:<(小于)、<=(小于或等于)、>(大于)、>=(大于或等于)、==(等于)、~=(不等于)。

關(guān)系運算符的運算法則:當(dāng)兩個比較量是標(biāo)量時,直接比較兩數(shù)的大小。當(dāng)參與比較的量是兩個維數(shù)相同的矩陣時,比較是對兩矩陣相同位置的元素按標(biāo)量關(guān)系運算規(guī)則逐個進(jìn)行,并給出元素比較結(jié)果。

當(dāng)參與比較的一個是標(biāo)量,而另一個是矩陣時,則把標(biāo)量與矩陣的每一個元素按標(biāo)量關(guān)系運算規(guī)則逐個比較,并給出元素比較結(jié)果

28關(guān)系運算的例子例2.2.1(1)令A(yù)=1:9,B=9-A

,輸出A中元素大于B對應(yīng)元素的位置。find(A>B)(2)產(chǎn)生5階隨機(jī)方陣A,其元素為[10,90]區(qū)間的隨機(jī)整數(shù),然后判斷A的元素是否能被3整除。答案見ex2_2_1.m292.2.3邏輯運算(一)

邏輯運算符:&(與)、|(或)和~(非)邏輯運算的運算法則為:

(i)在邏輯運算中,確認(rèn)非零元素為真,用1表示,零元素為假,用0表示。

(ii)設(shè)參與邏輯運算的是兩個標(biāo)量a和b,那么,

a&ba,b全為非零時,運算結(jié)果為1,否則為0。

a|ba,b中只要有一個非零,運算結(jié)果為1。

~a當(dāng)a是零時,運算結(jié)果為1;當(dāng)a非零時,運算結(jié)果為0。

30邏輯運算(二)

(iii)若參與邏輯運算的是兩個同維矩陣,那么運算將對矩陣相同位置上的元素按標(biāo)量規(guī)則逐個進(jìn)行。最終運算結(jié)果是一個與原矩陣同維的矩陣,其元素由1或0組成。

(iv)若參與邏輯運算的一個是標(biāo)量,一個是矩陣,那么運算將在標(biāo)量與矩陣中的每個元素之間按標(biāo)量規(guī)則逐個進(jìn)行。

(v)邏輯非是單目運算符,也服從矩陣運算規(guī)則。

(vi)在算術(shù)、關(guān)系、邏輯運算中,算術(shù)運算優(yōu)先級最高,邏輯運算優(yōu)先級最低。

31邏輯運算的例子

例2.2.2

建立1×50標(biāo)準(zhǔn)正態(tài)隨機(jī)矩陣A。(1)找出A中元素大于-1且小于1的元素的位置,并輸出這些元素;(2)找出大于1.5或小于1.5的元素,并將這些元素刪除掉。(答案見ex2_2_2.m)例2.2.3邏輯函數(shù)的運用示例。(見講義)322.3字符串、結(jié)構(gòu)數(shù)組與元胞數(shù)組

2.3.1字符串在MATLAB中,字符串是用單撇號括起來的字符序列。MATLAB將字符串當(dāng)作一個行向量,每個元素對應(yīng)一個字符,其標(biāo)識方法和數(shù)值向量相同。也可以建立多行字符串矩陣。字符串是以ASCII碼形式存儲的。abs和double函數(shù)都可以用來獲取字符串矩陣所對應(yīng)的ASCII碼數(shù)值矩陣。相反,char函數(shù)可以把ASCII碼矩陣轉(zhuǎn)換為字符串矩陣。33

簡單命令(一)cleara=12345.6789class(a)a_s=size(a)

b='S'class(b)b_s=size(b)whos34

簡單命令(二)把Thisisanexample.

賦值給變量a,求a的元素個數(shù),并且將其轉(zhuǎn)化成ASCII碼,然后再轉(zhuǎn)化成字符串。a='Thisisanexample.'

size(a)

ascii_a=double(a)char(ascii_a)

35字符串的例子在matlab中字符串看成數(shù)組,其元素的讀取類似與數(shù)組,注意在字符串中空格也是一個字符。例2.3.1建立一個字符串向量,然后對該向量做如下處理:

(1)取第1~5個字符組成的子字符串。

(2)將字符串倒過來重新排列。

(3)統(tǒng)計字符串中小寫字母的個數(shù)。

(4)將字符串中的小寫字母變成相應(yīng)的大寫字母,其余字符不變。(答案見ex2_3_1.m)

36字符串矩陣如同矩陣,字符串可以有多個行,但每行必須有相同數(shù)目的列數(shù),因此要用空格使各行具有相同的長度。在命令窗口輸入以下語句,并按enter鍵確認(rèn)ss=['iamagirl';'iamaboy']bb=['iamagirl''iamaboy']bb(2)cc=['iamagirl';'iamaboy']37字符串的顯示函數(shù)disp允許不顯示變量名而顯示一個字符串disp(bb)38Eval命令

與字符串有關(guān)的另一個重要函數(shù)是eval,其調(diào)用格式為:eval(t)其中t為字符串。它的作用是把字符串的內(nèi)容作為對應(yīng)的MATLAB語句來執(zhí)行。B=rand(2,4)

B_str=mat2str(B,4)Expression=['exp(-',B_str,')'];eval(Expression)

392.3.2元胞數(shù)組和結(jié)構(gòu)數(shù)組

——元胞數(shù)組元胞數(shù)組的建立使用大括號,‘{}’,就象用中括號‘

[]’來創(chuàng)建數(shù)字矩陣一樣;對元胞進(jìn)行逐一賦值,稱為元胞賦值;創(chuàng)建一個大小合適的空矩陣。矩陣中所有的行必須要有相同的元胞數(shù)。元胞數(shù)組的顯示:celldisp和cellplot40元胞數(shù)組的例子(一)

例2.3.2R1=reshape(1:9,3,3);R2=[1+2i];R3=‘Thisisanexample’;R4=rand(4);RR1={R1,R2,R3,R4}cellplot(RR1)RR2{1,1}=R1,RR2{1,2}=R2,RR2{1,3}=R3,RR2{1,4}=R4,41元胞數(shù)組的例子(二)

要創(chuàng)建一個2×4的空元胞矩陣,可以使用命令:cell(2,4)例2.3.3

元胞數(shù)組的擴(kuò)充

C=cell(2);C(:,1)={char('Another','textstring');10:-1:1}

C_str=char('這是','元胞數(shù)組創(chuàng)建算例1');R=reshape(1:9,3,3);Cn=[1+2i];S_sym=sym('sin(-3*t)*exp(-t)');

A(1,1)={C_str};A(1,2)={R};A(2,1)={Cn};A(2,2)={S_sym};AC=[AC]

;A_C=[A;C]

42元胞數(shù)組的例子(三)

例2.3.3續(xù)元胞數(shù)組的收縮和重組。(1)元胞數(shù)組的收縮A_C(3,:)=[] (2)把A_C重組成元胞數(shù)組R_A_CR_A_C=reshape(A_C,2,3)43元胞數(shù)組內(nèi)容的調(diào)取例2.3.4元胞數(shù)組內(nèi)容的調(diào)取示例。(1)取一個元胞:f1=R_A_C(1,3) %使用園括號尋訪得到的是元胞,而不僅是內(nèi)容。class(f1)(2)取一個元胞的內(nèi)容:f2=R_A_C{1,3} %用花括號尋訪取得內(nèi)容class(f2)(3)取元胞內(nèi)的子數(shù)組f3=R_A_C{1,1}(:,[1256]) %注意三種括號的不同用途%取第1行第1列元胞內(nèi)容中的第1、2、5、6列。(4)同時調(diào)取多個元胞內(nèi)容[f4,f5,f6]=deal(R_A_C{[1,3,4]}) %取三個元胞內(nèi)容,賦值給三個變量44元胞數(shù)組與數(shù)值型數(shù)組的轉(zhuǎn)化

cell2matC={[1][234];[5;9][678;101112]}M=cell2mat(C)M=123456789101112num2cellnum2cell(A,2)num2cell(A,[13])A=magic(4)B=num2cell(A,2)45結(jié)構(gòu)體數(shù)組的直接創(chuàng)建法及顯示

結(jié)構(gòu)數(shù)組的元素可以是不同的數(shù)據(jù)類型,它能將一組具有不同屬性的數(shù)據(jù)納入到一個統(tǒng)一的變量名下進(jìn)行管理。建立一個結(jié)構(gòu)數(shù)組可采用給結(jié)構(gòu)成員賦值的辦法。具體格式為:

結(jié)構(gòu)矩陣名.成員名=表達(dá)式

其中表達(dá)式應(yīng)理解為矩陣表達(dá)式

46結(jié)構(gòu)體數(shù)組的直接創(chuàng)建法

及顯示的例子

例2.3.5本例通過溫室數(shù)據(jù)(包括溫室名、容積、溫度、濕度等)演示一維結(jié)構(gòu)體數(shù)組的創(chuàng)建和顯示。(1)green_='一號房'; green_house.volume='2000立方米'; green_house.parameter.temperature=[31.230.431.628.729.731.130.929.6];green_house.parameter.humidity=[62.159.557.761.562.061.959.257.5];(2)顯示“結(jié)構(gòu)體數(shù)組”結(jié)構(gòu)和內(nèi)容green_house

;green_house.parameter

;

47結(jié)構(gòu)體數(shù)組的直接創(chuàng)建法

及顯示的例子

(續(xù))

例2.3.6本例演示結(jié)構(gòu)體數(shù)組的創(chuàng)建和顯示,并利用結(jié)構(gòu)體數(shù)組保存一個溫室群的數(shù)據(jù)。本例的運行以例2.3.5為先導(dǎo)。green_house(2,3).name='六號房'; green_house

green_house(2,3)green_house(1,1)

48利用構(gòu)造函數(shù)創(chuàng)建結(jié)構(gòu)體數(shù)組例2.3.7利用構(gòu)造函數(shù)struct,建立溫室群的數(shù)據(jù)庫。a=cell(2,3);green_house_1=struct('name',a,'volume',a,'parameter',a(1,2))green_house_2=struct('name',a,'volume',[],'parameter',[])

green_hopuse_3(2,3)=struct('name',[],'volume',[],'parameter',[])

49結(jié)構(gòu)成員的修改

增加結(jié)構(gòu)成員:例如要給結(jié)構(gòu)數(shù)組a增加一個成員x4,可給a中任意一個元素增加成員x4:a(1).x4=‘410075’;

但其他成員均為空矩陣,可以使用賦值語句給它賦確定的值。

要刪除結(jié)構(gòu)的成員,則可以使用rmfield函數(shù)來完成。例如,刪除成員x4:

a=rmfield(a,‘x4’);

502.4程序控制結(jié)構(gòu)與函數(shù)

2.4.1M文件的建立建立新的M文件有3種方法:

(1)菜單操作。從MATLAB主窗口的File菜單中選擇New菜單項,再選擇M-file命令.(2)命令操作。在MATLAB命令窗口輸入命令edit。

(3)命令按鈕操作。單擊MATLAB主窗口工具欄上的NewM-File命令按鈕。51建立M文件的例子例2.4.1分別建立命令文件和函數(shù)文件,將華氏溫度f轉(zhuǎn)換為攝氏溫度c,建立命令文件并以文件名f2c.m存盤。clear;%清除工作空間中的變量f=input('InputFahrenheittemperature:');c=5*(f-32)/952建立M文件的例子(續(xù))首先建立函數(shù)文件f2c.m:答案見f2c.m然后在MATLAB的命令窗口調(diào)用該函數(shù)文件。clear;y=input('InputFahrenheittemperature:');x=f2c(y)53M文件的打開打開新的M文件有3種方法:

(1)菜單操作。從MATLAB主窗口的File菜單中選擇Open命令,則屏幕出現(xiàn)Open對話框,在Open對話框中選中所需打開的M文件。

(2)命令操作。在MATLAB命令窗口輸入命令:edit文件名,則打開指定的M文件。

(3)命令按鈕操作。單擊MATLAB主窗口工具欄上的OpenFile命令按鈕,再彈出的對話框中選擇所需打開的M文件。

54程序控制結(jié)構(gòu)

順序結(jié)構(gòu)選擇結(jié)構(gòu)循環(huán)結(jié)構(gòu)

55順序結(jié)構(gòu)

(i)數(shù)據(jù)的輸入從鍵盤輸入數(shù)據(jù),則可以使用input函數(shù)來進(jìn)行,該函數(shù)的調(diào)用格式為:

A=input(提示信息,選項);其中提示信息為一個字符串,用于提示用戶輸入什么樣的數(shù)據(jù)。(ii)數(shù)據(jù)的輸出MATLAB提供的命令窗口輸出函數(shù)主要有disp函數(shù),其調(diào)用格式為

disp(輸出項)其中輸出項既可以為字符串,也可以為矩陣。

56數(shù)據(jù)輸入輸出的例子如果在input函數(shù)調(diào)用時采用's'選項,則允許用戶輸入一個字符串。例如,想輸入一個人的姓名,可采用命令:xm=input('What''syourname?','s');例2.4.2輸入x,y的值,并將它們的值互換后輸出。答案見ex2_4_2.m57例2.4.3求一元二次方程ax2+bx+c=0的根。答案見ex2_4_3.m58程序的暫停暫停程序的執(zhí)行可以使用pause函數(shù),其調(diào)用格式為:

pause(延遲秒數(shù))

如果省略延遲時間,直接使用pause,則將暫停程序,直到用戶按任一鍵后程序繼續(xù)執(zhí)行。若要強(qiáng)行中止程序的運行可使用Ctrl+C命令。59選擇結(jié)構(gòu)

(i)if語句(ii)雙分支if語句(iii)多分支if語句

(iv)switch語句(v)try語句

60單分支if語句

if條件語句組end當(dāng)條件成立時,則執(zhí)行語句組,執(zhí)行完之后繼續(xù)執(zhí)行if語句的后繼語句,若條件不成立,則直接執(zhí)行if語句的后繼語句。61雙分支if語句

if條件語句組1else

語句組2end當(dāng)條件成立時,執(zhí)行語句組1,否則執(zhí)行語句組2,語句組1或語句組2執(zhí)行后,再執(zhí)行if語句的后繼語句。

條件語句組語句組1語句組2是否62例2.4.4計算分段函數(shù)的值x=input('請輸入x的值:');ifx<=0y=(x+sqrt(pi))/exp(2);elsey=log(x+sqrt(1+x*x))/2;endy63多分支if語句

if條件1

語句組1elseif條件2

語句組2……elseif條件m

語句組melse

語句組nend64多分支if語句例子

例2.4.5輸入一個字符,若為大寫字母,則輸出其對應(yīng)的小寫字母;若為小寫字母,則輸出其對應(yīng)的大寫字母;若為數(shù)字字符則輸出其對應(yīng)的數(shù)值,若為其他字符則原樣輸出。答案見ex2_4_5.m65switch語句

switch語句根據(jù)表達(dá)式的取值不同,分別執(zhí)行不同的語句,其語句格式為:

switch表達(dá)式

case表達(dá)式1

語句組1case表達(dá)式2

語句組2……case表達(dá)式m

語句組motherwise

語句組nend程序的執(zhí)行結(jié)果與case語句的次序無關(guān)66switch語句的例子例2.4.6某商場對顧客所購買的商品實行打折銷售,標(biāo)準(zhǔn)如下(商品價格用price來表示):

price<200沒有折扣

200≤price<5003%折扣

500≤price<10005%折扣

1000≤price<25008%折扣

2500≤price<500010%折扣

5000≤price14%折扣輸入所售商品的價格,求其實際銷售價格。答案見ex2_4_6.m和ex2_4_6_2.m67try語句

語句格式為:try

語句組1catch

語句組2endtry語句先試探性執(zhí)行語句組1,如果語句組1在執(zhí)行過程中出現(xiàn)錯誤,則將錯誤信息賦給保留的lasterr變量,并轉(zhuǎn)去執(zhí)行語句組2。68try語句的例子例2.4.7矩陣乘法運算要求兩矩陣的維數(shù)相容,否則會出錯。先求兩矩陣的乘積,若出錯,則自動轉(zhuǎn)去求兩矩陣的點乘。答案見ex2_4_7.m69循環(huán)結(jié)構(gòu)

for語句while語句break語句和continue語句循環(huán)的嵌套70for語句

for語句的格式為:

for循環(huán)變量=表達(dá)式1:表達(dá)式2:表達(dá)式3

循環(huán)體語句

end其中表達(dá)式1的值為循環(huán)變量的初值,表達(dá)式2的值為步長,表達(dá)式3的值為循環(huán)變量的終值。步長為1時,表達(dá)式2可以省略。71for語句的執(zhí)行fori=s1:s2:s3

循環(huán)體語句

end求取s1的值->ii在s1和s3之間?循環(huán)體語句組i+s2->i是否結(jié)束循環(huán)72簡單命令clear;a=zeros(1,10);fori=1:10a(i)=i^2;i=20;enda=(1:10).^273例2.4.8一個三位正整數(shù)各位數(shù)字的立方和等于該數(shù)本身則稱該數(shù)為水仙花數(shù)。輸出全部水仙花數(shù)。答案見ex2_4_8.m74例2.4.9已知,當(dāng)n=100時,求y=1+1/3+…1/(2n-1)的值。答案見ex2_4_9.m在實際MATLAB編程中,采用循環(huán)語句會降低其執(zhí)行速度,所以前面的程序通常由下面的程序來代替:n=100;i=1:2:2*n-1;y=sum(1./i);y75for語句更一般的格式for循環(huán)變量=矩陣表達(dá)式循環(huán)體語句

end執(zhí)行過程是依次將矩陣的各列元素賦給循環(huán)變量,然后執(zhí)行循環(huán)體語句,直至各列元素處理完畢,循環(huán)的次數(shù)為矩陣的列數(shù)。例2.4.10寫出下列程序的執(zhí)行結(jié)果。

s=0;a=[12,13,14;15,16,17;18,19,20;21,22,23];fork=as=s+k;enddisp(s');76for語句注意(一)For循環(huán)不能用For循環(huán)內(nèi)重新賦值循環(huán)變量來終止。

forn=1:10 x(n)=sin(n*pi/10);

n=10; end77for語句注意(二)在For循環(huán)內(nèi)接受任何有效的MATLAB數(shù)組。

data=[39456;716-15] data= 39456 716-15 forn=data x=n(1)-n(2) end

78for語句注意(三)for循環(huán)可以嵌套:內(nèi)大外小clear;tics=zeros(1000,10);fori=1:1000forj=1:10s(i,j)=i;endendtoc

clear;tics=zeros(1000,10);forj=1:10fori=1:1000s(i,j)=i;endendtoc

79for語句注意(四)當(dāng)有一個等效的數(shù)組方法來解給定的問題時,應(yīng)避免用For循環(huán)

clears=0;ticfori=1:10000s=s+i;endtoc;cleartic,sum(1:10000);toc80for語句注意(五)為了得到最大的速度,在For循環(huán)(While循環(huán))被執(zhí)行之前,應(yīng)預(yù)先分配數(shù)組。

clearticfori=1:10000s(i)=i;endtocCleartics=zeros(1,1000);fori=1:1000s(i)=i;endtoc

81for語句注意(六)循環(huán)語句中要用“;”防止中間結(jié)果的輸出;書寫時采用鋸齒結(jié)構(gòu)以增加可讀性;

82while語句

while語句的一般格式為:

while(條件)

循環(huán)體語句

end其執(zhí)行過程為:若條件成立,則執(zhí)行循環(huán)體語句,執(zhí)行后再判斷條件是否成立,如果不成立則跳出循環(huán)。83while語句的執(zhí)行while(條件)

循環(huán)體語句

end條件為真?循環(huán)體語句是否結(jié)束循環(huán)84

例2.4.11從鍵盤輸入若干個數(shù),當(dāng)輸入0時結(jié)束輸入,求這些數(shù)的平均值和它們之和。答案見ex2_4_11.m85break語句和continue語句

break語句用于終止循環(huán)的執(zhí)行。當(dāng)在循環(huán)體內(nèi)執(zhí)行到該語句時,程序?qū)⑻鲅h(huán),繼續(xù)執(zhí)行循環(huán)語句的下一語句。continue語句控制跳過循環(huán)體中的某些語句。當(dāng)在循環(huán)體內(nèi)執(zhí)行到該語句時,程序?qū)⑻^循環(huán)體中所有剩下的語句,繼續(xù)下一次循環(huán)。86例2.4.12求[100,200]之間第一個能被21整除的整數(shù)。答案見ex2_4_12.m和ex2_4_12_2.m87循環(huán)的嵌套

如果一個循環(huán)結(jié)構(gòu)的循環(huán)體又包括一個循環(huán)結(jié)構(gòu),就稱為循環(huán)的嵌套,或稱為多重循環(huán)結(jié)構(gòu)。例2.4.13若一個數(shù)等于它的各個真因子之和,則稱該數(shù)為完數(shù),如6=1+2+3,所以6是完數(shù)。求[1,500]之間的全部完數(shù)。答案見ex2_4_13.m

88函數(shù)文件

與命令文件不同,函數(shù)文件可以接受輸入變量,并可以返回結(jié)果。matlab函數(shù)可以返回任意多個值。在MATLAB中,使用M函數(shù)是以該函數(shù)的磁盤文件主名調(diào)用,而不是文件中的函數(shù)名,但為了增強(qiáng)程序可讀性,最好兩者同名。M函數(shù)不能像M命令那樣在編輯器窗口用Debug\run執(zhí)行,因為M函數(shù)必須給予輸入?yún)?shù)值。M函數(shù)常常被M命令或其他M函數(shù)調(diào)用。89函數(shù)文件格式

函數(shù)文件由function語句引導(dǎo),其基本結(jié)構(gòu)為:

function輸出形參表=函數(shù)名(輸入形參表)

注釋說明部分函數(shù)體語句以function開頭的一行為引導(dǎo)行,表示該M文件是一個函數(shù)文件。函數(shù)名的命名規(guī)則與變量名相同。輸入形參為函數(shù)的輸入?yún)?shù),輸出形參為函數(shù)的輸出參數(shù)。當(dāng)輸出形參多于一個時,則應(yīng)該用方括號括起來。90例2.4.14編寫函數(shù)文件求半徑為r

的圓的面積和周長答案見ex2_4_14.m91命令窗口調(diào)用函數(shù)r=3;b=4;[x1,x2,x3,x4]=mcircle(b,r)[x1,x2,x3,x4]=mcircle(r,b)92函數(shù)調(diào)用

函數(shù)調(diào)用的一般格式是:

[輸出實參表]=函數(shù)名(輸入實參表)函數(shù)調(diào)用時各實參出現(xiàn)的順序、個數(shù),應(yīng)與函數(shù)定義時形參的順序、個數(shù)一致,否則會出錯。函數(shù)調(diào)用時,先將實參傳遞給相應(yīng)的形參,從而實現(xiàn)參數(shù)傳遞,然后再執(zhí)行函數(shù)的功能。93例2.4.15利用函數(shù)文件,實現(xiàn)直角坐標(biāo)(x,y)與極坐標(biāo)(ρ,θ)之間的轉(zhuǎn)換。

答案見

函數(shù)文件tran.m:調(diào)用tran.m的命令文件main1.m:x=input('Pleaseinputx=:');y=input('Pleaseinputy=:');[rho,the]=tran(x,y);94練習(xí):編寫一個函數(shù)檢測擲一次骰子所得的點數(shù)是單數(shù)還是雙數(shù)答案見函數(shù)dicetest.m在命令窗口分別運行:dicetest(1)dicetest(7)95函數(shù)的遞歸調(diào)用

在MATLAB中,函數(shù)可以嵌套調(diào)用,即一個函數(shù)可以調(diào)用別的函數(shù),甚至調(diào)用它自身。一個函數(shù)調(diào)用它自身稱為函數(shù)的遞歸調(diào)用。例2.4.16利用函數(shù)的遞歸調(diào)用,求n!。答案見factor.m96函數(shù)參數(shù)的可調(diào)性

narginnargoutfunction[x0,y0]=myplot(x,y,npts,angle,subdiv)%MYPLOTPlotafunction.%MYPLOT(x,y,npts,angle,subdiv)%Thefirsttwoinputargumentsare%required;theotherthreehavedefaultvalues.ifnargin<5,subdiv=20;endifnargin<4,angle=10;endifnargin<3,npts=25;endifnargout==0plot(x,y)elsex0=x;y0=y;end972.4.4程序調(diào)試

—程序調(diào)試概述

一類是語法錯誤另一類是運行時的錯誤

對算法理解不正確誤用指令程序控制流不合理

98調(diào)試器Debug菜單項該菜單項用于程序調(diào)試,需要與Breakpoints菜單項配合使用。Breakpoints菜單項該菜單項共有5個菜單命令,第一個是用于在程序中設(shè)置和清除斷點的,后4個是設(shè)置停止條件的,用于臨時停止M文件的執(zhí)行,并給用戶一個檢查局部變量的機(jī)會,相當(dāng)于在M文件指定的行號前加入了一個keyboard命令。99Matlab程序設(shè)計原則(一)百分號“%”后面的內(nèi)容是程序的注解,要善于運用注解使程序更具可讀性。養(yǎng)成在主程序開頭用clear命令清除變量的習(xí)慣,以消除工作空間中其他變量對程序運行的影響,但注意在子程序中不要用clear。參數(shù)值要集中放在程序的開頭部分,以便維護(hù)。要充分利用matlab工具箱提供的指令即內(nèi)部函數(shù)來執(zhí)行所要進(jìn)行的運算,在語句行之后輸入分號使其及中間結(jié)果不在屏幕上顯示,以提高執(zhí)行速度。100Matlab程序設(shè)計原則(二)盡量運用矩陣運算,少用循環(huán)Input指令可以用來輸入一些臨時的數(shù)據(jù);而對于大量參數(shù),則通過建立一個存儲參數(shù)的子程序,在主程序中通過對子程序的名稱來調(diào)用。程序盡量模塊化,即采用主程序調(diào)用子程序的方法,將所有子程序合并在一起來執(zhí)行全部的操作。充分利用Debugger來進(jìn)行程序的調(diào)試。設(shè)置好matlab的工作路徑,以便程序運行。1012.5Matlab優(yōu)化問題

2.5.1函數(shù)最優(yōu)化問題有約束的一元函數(shù)的最小值單變量函數(shù)求最小值的標(biāo)準(zhǔn)形式為

sub.to函數(shù)fminbnd格式

x=fminbnd(fun,x1,x2)

x=fminbnd(fun,x1,x2,options)[x,fval]=fminbnd(…)[x,fval,exitflag]=fminbnd(…)[x,fval,exitflag,output]=fminbnd(…)

102fminbnd語法說明(一)options結(jié)構(gòu)的參數(shù)可以通過函數(shù)optimset來設(shè)置,其中options結(jié)構(gòu)中的字段如下表所示字段說明Display設(shè)置結(jié)果的顯示方式:off—不顯示任何結(jié)果;iter—顯示每步迭代后的結(jié)果;final—只顯示最后的結(jié)果;notify—只有當(dāng)求解不收斂的時候才顯示結(jié)果FunValCheck檢查目標(biāo)函數(shù)值是否可接受:on—當(dāng)目標(biāo)函數(shù)為復(fù)數(shù)或NaN時顯示出錯信息;off—不顯示任何錯誤信息MaxFunEvals最大的目標(biāo)函數(shù)檢查步數(shù)MaxIter最大的迭代次數(shù)OutputFcn用戶自定義的輸出函數(shù),它將在每個迭代步調(diào)用plotFcns用戶自定義的繪圖函數(shù),它將在每個迭代步調(diào)用TolX自變量的精度103fminbnd語法說明(二)若參數(shù)exitflag>0,表示函數(shù)收斂于x

若exitflag=0,表示超過函數(shù)估計值或迭代最大次數(shù)若exitflag<0表示函數(shù)不收斂于x;參數(shù)output.iterations表示迭代次數(shù)

output.funccount表示函數(shù)賦值次數(shù),

output.algorithm表示所使用的算法。

104例2.5.1計算下面函數(shù)在區(qū)間(0,1)內(nèi)的最小值

[x,fval,exitflag,output]=fminbnd('(x^3+cos(x)+x*log(x))/exp(x)',0,1)x=0.5223fval=0.3974exitflag=1output=iterations:8funcCount:9algorithm:'goldensectionsearch,parabolicinterpolation'105例2.5.1(續(xù))要查看結(jié)果的精度,可以接著在matlab命令窗口中輸入:output.message如果想提高精度,可以通過options結(jié)構(gòu)來指定。在matlab命令窗口輸入:opt=optimset('TolX',1.0e-6);formatlong;[x,fval,exitflag,output]=fminbnd('(x^3+cos(x)+x*log(x))/exp(x)',0,1,opt)106例2.5.1(續(xù))要想顯示每步迭代后的結(jié)果,且精度是1.0e-6在命令窗口輸入:formatshortopt=optimset('Display','iter','TolX',1.0e-6);[x,fval,exitflag,output]=fminbnd('(x^3+cos(x)+x*log(x))/exp(x)',0,1,opt)107例2.5.2在[0,5]上求下面函數(shù)的最小值

解:先自定義函數(shù):在MATLAB編輯器中建立M文件為:functionf=myfun(x)f=(x-3).^2-1;保存為myfun.m然后在命令窗口鍵入命令:x=fminbnd(@myfun,0,5)則結(jié)果顯示為:x=3108無約束的多元函數(shù)的最小值無約束的多元函數(shù)求最小值的標(biāo)準(zhǔn)形式為

其中:x為向量。函數(shù)fminsearch格式x=fminsearch(fun,x0)x=fminsearch(fun,x0,options)[x,fval]=fminsearch(…)[x,fval,exitflag]=fminsearch(…)[x,fval,exitflag,output]=fminsearch(…)109例2.5.3求下面函數(shù)的最小值點解:答案見ex2_5_3.mfunctionf=myfun(x)f=2*x(1)^3+4*x(1)*x(2)^3-10*x(1)*x(2)+x(2)^2;保存為myfun.m,在命令窗口鍵入

X=fminsearch('myfun',[0,0])或X=fminsearch(@myfun,[0,0])110利用函數(shù)fminunc求多元無約束函數(shù)最小值(一)格式x=fminunc(fun,x0)x=fminunc(fun,x0,options)[x,fval]=fminunc(…)[x,fval,exitflag]=fminunc(…)[x,fval,exitflag,output]=fminunc(…)111利用函數(shù)fminunc求多元無約束函數(shù)最小值(二)[x,fval,exitflag,output,grad]=fminunc(…)%grad為函數(shù)在解x處的梯度值[x,fval,exitflag,output,grad,hessian]=fminunc(…)%目標(biāo)函數(shù)在解x處的海賽(Hessian)值當(dāng)函數(shù)維數(shù)大于2時,使用fminunc比fminsearch更有效,但當(dāng)所選函數(shù)高度不連續(xù)時,使用fminsearch效果較好。

112例2.5.4求下面函數(shù)的最小值點解:fun='3*x(1)^2+2*x(1)*x(2)+x(2)^2';x0=[11];[x,fval,exitflag,output,grad,hessian]=fminunc(fun,x0)113有約束的多元函數(shù)的最小值非線性有約束的多元函數(shù)求最小值的標(biāo)準(zhǔn)形式為

其中:x、b、beq、lb、ub是向量,A、Aeq為矩陣,C(x)、Ceq(x)是返回向量的函數(shù),f(x)為目標(biāo)函數(shù),f(x)、C(x)、Ceq(x)可以是非線性函數(shù)。114利用函數(shù)fmincon求有約束的多元函數(shù)的最小值(一)格式x=fmincon(fun,x0,A,b)x=fmincon(fun,x0,A,b,Aeq,beq)x=fmincon(fun,x0,A,b,Aeq,beq,lb,ub)x=fmincon(fun,x0,A,b,Aeq,beq,lb,ub,nonlcon)x=fmincon(fun,x0,A,b,Aeq,beq,lb,ub,nonlcon,options)115利用函數(shù)fmincon求有約束的多元函數(shù)的最小值(二)[x,fval]=fmincon(…)[x,fval,exitflag]=fmincon(…)[x,fval,exitflag,output]=fmincon(…)[x,fval,exitflag,output,lambda]=fmincon(…)[x,fval,exitflag,output,lambda,grad]=fmincon(…)[x,fval,exitflag,output,lambda,grad,hessian]=fmincon(…)116例2.5.5求下面問題在初始點(0,1)處的最優(yōu)解MinSubto答案見ex2_5_5.m117例2.5.6求下面問題在初始點x=(10,10,10)處的最優(yōu)解。

MinSubto答案見ex2_5_6.m1182.5.2線性規(guī)劃問題Matlab所解決的線性規(guī)劃問題的標(biāo)準(zhǔn)形式為

其中:f、x、b、beq、lb、ub為列向量,A、Aeq為矩陣。119利用函數(shù)linprog求解線性規(guī)劃格式x=linprog(f,A,b,Aeq,beq,lb,ub)%若沒有等式約束,則Aeq=[],beq=[]x=linprog(f,A,b,Aeq,beq,lb,ub,x0)%設(shè)置初值x0x=linprog(f,A,b,Aeq,beq,lb,ub,x0,options)%options為指定的優(yōu)化參數(shù)[x,fval,lambda,exitflag,output]=linprog(…)120例2.5.7求下面的優(yōu)化問題

(0,1)處的最優(yōu)解MinSubto答案見ex2_5_7.m121線性規(guī)劃在債券組合中的應(yīng)用假定某機(jī)構(gòu)投資者想構(gòu)造一個久期為D的債券組合,它可以在市場上合適的備選債券中構(gòu)造某個組合權(quán)重W=(w1,w2,...,wn),使得該組合的久期為D,我們假定投資者選擇那些期望收益最高的債券組合。用數(shù)學(xué)形式描述如下(限制賣空)

122例2.5.8假定市場上有3種備選債券:債券1、債券2、債券3。其期望收益率分別為5%,15%,10%;久期分別為1年、2年和3年。投資者若想構(gòu)造久期為2.5年的債券組合,并使得組合的期望收益最大,則該投資者該如何行動?答案見ex2_5_8.m123

2.5.3二次規(guī)劃問題

二次規(guī)劃問題(quadraticprogramming)的標(biāo)準(zhǔn)形式為:其中,H、A、Aeq為矩陣,f、b、beq、lb、ub、x為向量124函數(shù)quadprogx=quadprog(H,f,A,b,Aeq,beq,lb,ub,x0)%x0為設(shè)置的初值x=quadprog(H,f,A,b,Aeq,beq,lb,ub,x0,options)%options為指定的優(yōu)化參數(shù)[x,fval,exitflag,output,lambda]=quadprog(…)125例2.5.9求解下面二次規(guī)劃問題答案見ex2_5_9.m126馬柯維茨的均值方差模型

在投資組合管理中,馬柯維茨的均值方差模型是一個重要的理論基礎(chǔ)。其數(shù)學(xué)描述如下:這里,W表示組合的權(quán)重列向量;組合的風(fēng)險由組合收益率的方差W’VW表示,V表示股票收益率的協(xié)方差矩陣;e為股票的期望收益率列向量;E(rp

)為預(yù)期要達(dá)到的收益率。

127例2.5.11考慮一個5種資產(chǎn)構(gòu)成的投資組合,分別為資產(chǎn)1,資產(chǎn)2,資產(chǎn)3,資產(chǎn)4和資產(chǎn)5,其預(yù)期收益率分別為0.2、0.15、0.10、0.12和0.06,資產(chǎn)的協(xié)方差矩陣如下:

求在該資產(chǎn)組合的收益率為0.15的條件下,使得該組合風(fēng)險最小的資產(chǎn)組合。答案見ex2_5_11.m1282.6符號數(shù)學(xué)工具

2.6.1符號表達(dá)式用單引號以隱含方式定義

:diff('cos(x)')用函數(shù)sym顯式地定義:A=sym('[a,

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論