版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、六、數(shù)學軟件代碼中國網(wǎng) 1.LINDO、LINGO /一、 軟件簡介 LINDO是一種專門用于求解數(shù)學規(guī)劃問題的軟件包。由于LINDO執(zhí)行速度很快、易于方便輸入、求解和分析數(shù)學規(guī)劃問題。因此在數(shù)學、科研和工業(yè)界得到廣泛應(yīng)用。LINDO主要用于解線性規(guī)劃、非線性規(guī)劃、二次規(guī)劃和整數(shù)規(guī)劃等問題。也可以用于一些非線性和線性方程組的求解以及代數(shù)方程求根等。LINDO中包含了一種建模語言和許多常用的數(shù)學函數(shù)(包括大量概論函數(shù)),可供使用者建立規(guī)劃問題時調(diào)用。一般用LINDO(Linear Interactive and Discrete Optimizer)解決線性規(guī)劃(LPLinear Program
2、ming)。整數(shù)規(guī)劃(IPInteger Programming)問題。其中LINDO 6 .1 學生版至多可求解多達300個變量和150個約束的規(guī)劃問題。其正式版(標準版)則可求解的變量和約束在1量級以上。LINDO則用于求解非線性規(guī)劃(NLPNONLINEAR PROGRAMMING)和二次規(guī)則(QPQUARATIC PROGRAMING)其中LINGO .0學生版最多可版最多達300個變量和150個約束的規(guī)則問題,其標準版的求解能力亦再104量級以上。雖然LINDO和LINGO不能直接求解目標規(guī)劃問題,但用序貫式算法可分解成一個個LINDO和LINGO能解決的規(guī)劃問題。要學好用這兩個軟件
3、最好的辦法就是學習他們自帶的HELP文件。下面擬舉數(shù)例以說明這兩個軟件的最基本用法。(例子均選自張瑩運籌學基礎(chǔ))例.(選自運籌學基礎(chǔ).汽油混合問題,線性規(guī)劃問題)一種汽油的特性可用兩個指標描述:其點火性用“辛烷數(shù)”描述,其揮發(fā)性用“蒸汽壓力”描述。某煉油廠有四種標準汽油,設(shè)其標號分別為,其特性及庫存量列于下表中,將上述標準汽油適量混合,可得兩種飛機汽油,某標號為,這兩種飛機汽油的性能指標及產(chǎn)量需求列于表中。問應(yīng)如何根據(jù)庫存情況適量混合各種標準汽油,使既滿足飛機汽油的性能指標,而產(chǎn)量又為最高。表標準汽油辛烷數(shù)蒸汽壓力(g/cm2)庫存量.7.11*10(-2).11.38*10(-2).5.69
4、*10(-2).28.45*10(-2)(1 g/cm2=98Pa)表飛機汽油辛烷數(shù)蒸汽壓力(g/cm2)產(chǎn)量需求()=建模過程略(詳見運籌學基礎(chǔ))目標函數(shù):max z=x1+x2+x3+x4約束條件:x5+x6+x7+x8=250000 x1+x5=380000 x2+x6=265200 x3+x7=408100 x4+x8=02.85x5-1.42x6+4.27x7-18.49x8=016.5x1+2.0 x2-4.0 x3+17x4=07.5x5-7.0 x6-13.0 x7+8.0 x8=0 xj=0(j=1,2.,8)下面我們就用LINDO來解這一優(yōu)化問題。輸入語句:max(不區(qū)分大
5、小寫) x1+x2+x3+x4ST(大寫或?qū)憇ubject to)x5+x6+x7+x8=250000 x1+x5=380000 x2+x6=265200 x3+x7=408100 x4+x8=02.85x5-1.42x6+4.27x7-18.49x8=016.5x1+2.0 x2-4.0 x3+17x4=07.5x5-7.0 x6-13.0 x7+8.0 x8=0end然后再按運算符鍵即可得結(jié)果。LINDO是規(guī)定j非負的,我們可發(fā)現(xiàn)輸入方式與我們的數(shù)學書寫的形式基本一致,運算后,計算機會問您是否需要靈敏度分析,我們選擇是,結(jié)果如下:LP OPTIMUM FOUND AT STEP 6 OBJ
6、ECTIVE FUNCTION VALUE 1) 933400.0 VARIABLE VALUE REDUCED COST X1 161351.734375 0.000000 X2 265200.000000 0.000000 X3 408100.000000 0.000000 X4 98748.265625 0.000000 X5 218648.265625 0.000000 X6 0.000000 0.000000 X7 0.000000 0.000000 X8 31351.734375 0.000000 ROW SLACK OR SURPLUS DUAL PRICES 2) 0.0000
7、00 -1.000000 3) 0.000000 1.000000 4) 0.000000 1.000000 5) 0.000000 1.000000 6) 0.000000 1.000000 7) 0.000000 0.000000 8) 43454.000000 0.000000 9) 3239024.250000 0.000000 10) 1890675.875000 0.000000NO. ITERATIONS= 6RANGES IN WHICH THE BASIS IS UNCHANGED: OBJ COEFFICIENT RANGESVARIABLE CURRENT ALLOWAB
8、LE ALLOWABLE COEF INCREASE DECREASE X1 1.000000 0.000000 1.154137 X2 1.000000 INFINITY 0.000000 X3 1.000000 INFINITY 0.000000 X4 1.000000 0.000000 0.000000 X5 0.000000 1.154137 0.000000 X6 0.000000 0.000000 INFINITY X7 0.000000 0.000000 INFINITY X8 0.000000 0.000000 0.000000 RIGHTHAND SIDE RANGES RO
9、W CURRENT ALLOWABLE ALLOWABLE RHS INCREASE DECREASE 2 250000.000000 186222.062500 234752.984375 3 380000.000000 234752.984375 15247.017578 4 265200.000000 30601.410156 265200.000000 5 408100.000000 156685.250000 10176.581055 6 130100.000000 2350.135254 36184.207031 7 0.000000 43454.000000 669046.000
10、000 8 0.000000 43454.000000 INFINITY 9 0.000000 3239024.250000 INFINITY 10 0.000000 1890675.875000 INFINITY下面給出其結(jié)果的一般解釋:“LP OPTIMUM FOUND AT STEP 6”表示LINDO在(用單純形法)次迭代或旋轉(zhuǎn)后得到最優(yōu)解?!癘BJECTIVE FUNCTION VALUE 1)933400.0”表示最優(yōu)目標值為933400?!癡ALUE”給出最優(yōu)解中各變量的值?!癝LACK OR SURPLUS”給出松弛變量的值。上例中SLK 2= 第二行松弛變量(模型第一行表示目
11、標函數(shù),所以第二行對應(yīng)第一個約束)“REDUCE COST”列出最優(yōu)單純形表中判別數(shù)所在行的變量的系數(shù),表示當變量有微小變動時,目標函數(shù)的變化率,其中基變量的reduce cost 值應(yīng)為,對于非基變量j相應(yīng)的reduce cost值表示j增加一個單位(此時假定其他非基變量保持不變)時目標函數(shù)減小的量(max 型問題)。上例中:X1 對應(yīng)的 reduce cost 值為,表示當X1=1 時,目標函數(shù)值不變?!癉UAL PRICE”(對偶價格)列出最優(yōu)單純形表中判別數(shù)所在行的松弛變量的系數(shù),表示當對應(yīng)約束有微小變動時,目標函數(shù)的變化率,輸出結(jié)果中對應(yīng)每一個約束有一個對偶價格。若其數(shù)值為,表示對應(yīng)
12、約束中不等式右端項若增加一個單位,目標函數(shù)將增加個單位(max 型問題)。上例中:第二行對應(yīng)的對偶價格值應(yīng)為-表示當約束)X5 + X6 + X7 + X8250000變?yōu)椋5 + X6 + X7 + X8250001時,目標函數(shù)值933400-1933399當REDUCE COST 或DUAL PRICE 的值為。表示當微小擾動不影響目標函數(shù)。有時,通過分析DUAL PRICE,也可對產(chǎn)生不可行問題的原因有所了解。靈敏度分析:如果做敏感性分析,則系統(tǒng)報告當目標函數(shù)的費用系數(shù)和約束右端項在什么范圍變化(此時假定其他系數(shù)保持不變)時,最優(yōu)基保持不變。報告中INFINITY表示正無窮,如上例:目
13、標函數(shù)中的變量系數(shù)為,當它在1-1.154137,1-0= -0.154137,1 變化時,最優(yōu)基保持不變 。第一個約束右端項為250000,當它在250000-234752.984375,250000+186222.0625=15247.015625,436222.0625 范圍變化時,最優(yōu)基保持不變 。當您要判斷表達式輸入是否有錯誤時,也可以使用菜單“Reports“的”Picture“選項。若想獲得靈敏度分析,可用“Reports“的”Rang“選項。若需顯示單純形表,可執(zhí)行“Reports“的”Tab lean“選項。注意事項:) 目標函數(shù)及各約束條件之間一定要有“Subject to
14、 (ST) ”分開。) 變量名不能超過個字符。) 變量與其系數(shù)間可以有空格,單不能有任何運算符號(如乘號“”等)。) 要輸入=約束,相應(yīng)以代替即可。) 一般LINDO中不能接受括號“()“和逗號“,“,例:400(X1+X2) 需寫成400X1+400X2;10,000需寫成10000。) 表達式應(yīng)當已經(jīng)過簡化。不能出現(xiàn) 2 X1+3 X2-4 X1,而應(yīng)寫成-X1+3 X2。例2(選自運P94習題2.4;整數(shù)規(guī)則)有四個工人,要分別指派他們完成四項不同的工作,每個人做各項工作所消耗的時間如表。問應(yīng)該如何指派,才能使總的消耗時間為最?。?工作所耗時間工人 A B C D 甲 15 18 21
15、24 乙 19 23 22 18 丙 26 17 16 19 丁 19 21 23 17這是一道典型的整數(shù)規(guī)則問題。我們記派第I去做工作記為Xij注意到每人只能做一項工作。每項工作一人做。我們得到目標函數(shù)為約束條件:min 15x11+19x21+26x31+19x41+18x12+23x22+17x32+21x42+24x13+22x23+16x33+23x43+24x14+18x24+19x34+17x44STx11+x12+x13+x14=1x21+x22+x23+x24=1x31+x32+x33+x34=1x41+x42+x43+x44=1x11+x21+x31+x41=1x12+x2
16、2+x32+x42=1x13+x23+x33+x43=1x14+x24+x34+x44=1endint 16運行后我們可得到最優(yōu)目標值為70當 ,其余為0時。(具體的Reports 我們略去)在用LINDO解整數(shù)規(guī)劃(IP)問題時,只要在END后加上標識即可,其中解0/1規(guī)劃的用命令。INT name 或 INT n (n 指前n 個變量標識為0/1型)解混合型整數(shù)規(guī)劃則用GIN來標識。LINDO解整數(shù)規(guī)劃對變量的限制為50個。(指LINDO 6.1學生版)。所以說,盡管LINDO對整數(shù)規(guī)劃問題是很有威力。要有效地使用還是需要一定技術(shù)的。這是因為,人們很容易將一個本質(zhì)上很簡單的問題列成一個輸入
17、模型。從而有可能會導致一個冗長的分支定界計算。例3 用LINDO解目標規(guī)劃由于LINDO不能直接求解目標規(guī)劃問題,這是否就意味著LINDO失去了效力呢?不是的。由求解目標規(guī)劃問題的有效算法序貫式算法可知其實目標規(guī)劃我們常采取分解成前面二種辦法而已。例如算:min a=(d1_+d1),(2d2+d3)G1:x1-10 x2+d1_-d1=50G2:3x1+5x2+d2_-d2=20G3:8x1+6x2+d3_-d3=100 xi(i=1,2),dj_,dj(j=1,2,3)=0先求目標函數(shù)的最優(yōu)值min d1_+d1STx1-10 x2+d1_-d1=503x1+5x2+d2_-d2=20en
18、d求得D1_+D1 的最優(yōu)值為0然后再求min 2d2+d3STx1-10 x2+d1_-d1=503x1+5x2+d2_-d2=208x1+6x2+d3_-d3=100d1_+d1=0end即可算得第二級最優(yōu)值2d2+d3例4 LINDO雖亦可求解二次規(guī)劃問題。(但我認為它在輸入對不如用LINGO方便,用LINDO輸入時要先作偏導數(shù)計算不如LINGO哪樣可直接輸入。(選自運籌學基礎(chǔ)190.習題4.10min f(x)=(x1-1)2+(x2-2)2x2-x1=1x1+x2=0,x2=0先來說一說如何使用LINGO一般來說LINGO多用于解決大規(guī)模數(shù)學規(guī)劃。用時要注意以下幾點:(1) 每條語句
19、后必須使用分號“;”結(jié)束。問題模型必須由MODEL命令開始,END結(jié)束。(2) 用MODEL命令來作為輸入問題模型的開始,格式為MODEL:statement (語句)。(3) 目標函數(shù)必須由“min =”或“max =”開頭。則上面的例子的輸入就為modul:min=(x1-1)2+(x2-2)2;x2-1=1;x1+x2)之後,并按入Enter鍵即可。例如: (5*2+1.3-0.8)*10/25 ans =4.2000 MATLAB會將運算結(jié)果直接存入一變數(shù)ans,代表MATLAB運算後的答案(Answer)并顯示其數(shù)值於螢?zāi)簧?。小提示?是MATLAB的提示符號(Prompt),但在P
20、C中文視窗系統(tǒng)下,由於編碼方式不同,此提示符號常會消失不見,但這并不會影響到MATLAB的運算結(jié)果。 我們也可將上述運算式的結(jié)果設(shè)定給另一個變數(shù)x: x = (5*2+1.3-0.8)*102/25 x = 42 此時MATLAB會直接顯示x的值。由上例可知,MATLAB認識所有一般常用到的加(+)、減(-)、乘(*)、除(/)的數(shù)學運算符號,以及冪次運算()。 小提示: MATLAB將所有變數(shù)均存成double的形式,所以不需經(jīng)過變數(shù)宣告(Variable declaration)。MATLAB同時也會自動進行記憶體的使用和回收,而不必像C語言,必須由使用者一一指定.這些功能使的MATLAB
21、易學易用,使用者可專心致力於撰寫程式,而不必被軟體枝節(jié)問題所干擾。 若不想讓MATLAB每次都顯示運算結(jié)果,只需在運算式最後加上分號(;)即可,如下例: y = sin(10)*exp(-0.3*42); 若要顯示變數(shù)y的值,直接鍵入y即可: y y =-0.0045 在上例中,sin是正弦函數(shù),exp是指數(shù)函數(shù),這些都是MATLAB常用到的數(shù)學函數(shù)。下表即為MATLAB常用的基本數(shù)學函數(shù)及三角函數(shù): 小整理:MATLAB常用的基本數(shù)學函數(shù) abs(x):純量的絕對值或向量的長度 angle(z):復 數(shù)z的相角(Phase angle) sqrt(x):開平方 real(z):復數(shù)z的實部
22、imag(z):復數(shù)z的虛 部 conj(z):復數(shù)z的共軛復數(shù) round(x):四舍五入至最近整數(shù) fix(x):無論正負,舍去小數(shù)至最近整數(shù) floor(x):地板函數(shù),即舍去正小數(shù)至最近整數(shù) ceil(x):天花板函數(shù),即加入正小數(shù)至最近整數(shù) rat(x):將實數(shù)x化為分數(shù)表示 rats(x):將實數(shù)x化為多項分數(shù)展開 sign(x):符號函數(shù) (Signum function)。 當x0時,sign(x)=1。 小整理:MATLAB常用的三角函數(shù) sin(x):正弦函數(shù) cos(x):馀弦函數(shù) tan(x):正切函數(shù) asin(x):反正弦函數(shù) acos(x):反馀弦函數(shù) atan(
23、x):反正切函數(shù) atan2(x,y):四象限的反正切函數(shù) sinh(x):超越正弦函數(shù) cosh(x):超越馀弦函數(shù) tanh(x):超越正切函數(shù) asinh(x):反超越正弦函數(shù) acosh(x):反超越馀弦函數(shù) atanh(x):反超越正切函數(shù) 變數(shù)也可用來存放向量或矩陣,并進行各種運算,如下例的列向量(Row vector)運算: x = 1 3 5 2; y = 2*x+1 y = 3 7 11 5 小提示:變數(shù)命名的規(guī)則 1.第一個字母必須是英文字母 2.字母間不可留空格 3.最多只能有19個字母,MATLAB會忽略多馀字母 我們可以隨意更改、增加或刪除向量的元素: y(3) =
24、2 % 更改第三個元素 y =3 7 2 5 y(6) = 10 % 加入第六個元素 y = 3 7 2 5 0 10 y(4) = % 刪除第四個元素, y = 3 7 2 0 10 在上例中,MATLAB會忽略所有在百分比符號(%)之後的文字,因此百分比之後的文字均可視為程式的注解(Comments)。MATLAB亦可取出向量的一個元素或一部份來做運算: x(2)*3+y(4) % 取出x的第二個元素和y的第四個元素來做運算 ans = 9 y(2:4)-1 % 取出y的第二至第四個元素來做運算 ans = 6 1 -1 在上例中,2:4代表一個由2、3、4組成的向量 若對MATLAB函數(shù)
25、用法有疑問,可隨時使用help來尋求線上支援(on-line help):help linspace 小整理:MATLAB的查詢命令 help:用來查詢已知命令的用法。例如已知inv是用來計算反矩陣,鍵入help inv即可得知有關(guān)inv命令的用法。(鍵入help help則顯示help的用法,請試看看!) lookfor:用來尋找未知的命令。例如要尋找計算反矩陣的命令,可鍵入 lookfor inverse,MATLAB即會列出所有和關(guān)鍵字inverse相關(guān)的指令。找到所需的命令後 ,即可用help進一步找出其用法。(lookfor事實上是對所有在搜尋路徑下的M檔案進行關(guān)鍵字對第一注解行的比
26、對,詳見後敘。) 將列向量轉(zhuǎn)置(Transpose)後,即可得到行向量(Column vector): z = x z = 4.0000 5.2000 6.4000 7.6000 8.8000 10.0000 不論是行向量或列向量,我們均可用相同的函數(shù)找出其元素個數(shù)、最大值、最小值等: length(z) % z的元素個數(shù) ans = 6 max(z) % z的最大值 ans = 10 min(z) % z的最小值 ans = 4 小整理:適用於向量的常用函數(shù)有: min(x): 向量x的元素的最小值 max(x): 向量x的元素的最大值 mean(x): 向量x的元素的平均值 median(
27、x): 向量x的元素的中位數(shù) std(x): 向量x的元素的標準差 diff(x): 向量x的相鄰元素的差 sort(x): 對向量x的元素進行排序(Sorting) length(x): 向量x的元素個數(shù) norm(x): 向量x的歐氏(Euclidean)長度 sum(x): 向量x的元素總和 prod(x): 向量x的元素總乘積 cumsum(x): 向量x的累計元素總和 cumprod(x): 向量x的累計元素總乘積 dot(x, y): 向量x和y的內(nèi) 積 cross(x, y): 向量x和y的外積 (大部份的向量函數(shù)也可適用於矩陣,詳見下述。) 若要輸入矩陣,則必須在每一列結(jié)尾加上
28、分號(;),如下例: A = 1 2 3 4; 5 6 7 8; 9 10 11 12; A = 1 2 3 4 5 6 7 8 9 10 11 12 同樣地,我們可以對矩陣進行各種處理: A(2,3) = 5 % 改變位於第二列,第三行的元素值 A = 1 2 3 4 5 6 5 8 9 10 11 12 B = A(2,1:3) % 取出部份矩陣B B = 5 6 5 A = A B % 將B轉(zhuǎn)置後以行向量并入A A = 1 2 3 4 5 5 6 5 8 6 9 10 11 12 5 A(:, 2) = % 刪除第二行(:代表所有列) A = 1 3 4 5 5 5 8 6 9 11 1
29、2 5 A = A; 4 3 2 1 % 加入第四列 A = 1 3 4 5 5 5 8 6 9 11 12 5 4 3 2 1 A(1 4, :) = % 刪除第一和第四列(:代表所有行) A = 5 5 8 6 9 11 12 5 這幾種矩陣處理的方式可以相互疊代運用,產(chǎn)生各種意想不到的效果,就看各位的巧思和創(chuàng)意。 小提示:在MATLAB的內(nèi)部資料結(jié)構(gòu)中,每一個矩陣都是一個以行為主(Column-oriented )的陣列(Array)因此對於矩陣元素的存取,我們可用一維或二維的索引(Index)來定址。舉例來說,在上述矩陣A中,位於第二列、第三行的元素可寫為A(2,3) (二維索引)或A
30、(6)(一維索引,即將所有直行進行堆疊後的第六個元素)。 此外,若要重新安排矩陣的形狀,可用reshape命令: B = reshape(A, 4, 2) % 4是新矩陣的列數(shù),2是新矩陣的行數(shù) B = 5 8 9 12 5 6 11 5 小提示: A(:)就是將矩陣A每一列堆疊起來,成為一個行向量,而這也是MATLAB變數(shù)的內(nèi)部儲存方式。以前例而言,reshape(A, 8, 1)和A(:)同樣都會產(chǎn)生一個8x1的矩陣。 MATLAB可在同時執(zhí)行數(shù)個命令,只要以逗號或分號將命令隔開: x = sin(pi/3); y = x2; z = y*10,z = 7.5000 若一個數(shù)學運算是太長,
31、可用三個句點將其延伸到下一行: z = 10*sin(pi/3)* . sin(pi/3); 若要檢視現(xiàn)存於工作空間(Workspace)的變數(shù),可鍵入who: who Your variables are: testfile x 這些是由使用者定義的變數(shù)。若要知道這些變數(shù)的詳細資料,可鍵入: whos Name Size Bytes Class A 2x4 64 double array B 4x2 64 double array ans 1x1 8 double array x 1x1 8 double array y 1x1 8 double array z 1x1 8 double a
32、rray Grand total is 20 elements using 160 bytes 使用clear可以刪除工作空間的變數(shù): clear A A ? Undefined function or variable A. 另外MATLAB有些永久常數(shù)(Permanent constants),雖然在工作空間中看不 到,但使用者可直接取用,例如: pi ans = 3.1416 下表即為MATLAB常用到的永久常數(shù)。 小整理:MATLAB的永久常數(shù) i或j:基本虛數(shù)單位eps:系統(tǒng)的浮點(Floating-point)精確度 inf:無限大, 例如1/0 nan或NaN:非數(shù)值(Not a
33、 number) ,例如0/0 pi:圓周率 p(= 3.1415926.) realmax:系統(tǒng)所能表示的最大數(shù)值 realmin:系統(tǒng)所能表示的最小數(shù)值 nargin: 函數(shù)的輸入引數(shù)個數(shù) nargin: 函數(shù)的輸出引數(shù)個數(shù) 1-2、重復命令 最簡單的重復命令是for圈(for-loop),其基本形式為: for 變數(shù) = 矩陣; 運算式; end 其中變數(shù)的值會被依次設(shè)定為矩陣的每一行,來執(zhí)行介於for和end之間的運算式。因此,若無意外情況,運算式執(zhí)行的次數(shù)會等於矩陣的行數(shù)。 舉例來說,下列命令會產(chǎn)生一個長度為6的調(diào)和數(shù)列(Harmonic sequence): x = zeros(1
34、,6); % x是一個16的零矩陣 for i = 1:6, x(i) = 1/i; end 在上例中,矩陣x最初是一個16的零矩陣,在for圈中,變數(shù)i的值依次是1到6,因此矩陣x的第i個元素的值依次被設(shè)為1/i。我們可用分數(shù)來顯示此數(shù)列: format rat % 使用分數(shù)來表示數(shù)值 disp(x) 1 1/2 1/3 1/4 1/5 1/6 for圈可以是多層的,下例產(chǎn)生一個16的Hilbert矩陣h,其中為於第i列、第j行的元素為 h = zeros(6); for i = 1:6, for j = 1:6, h(i,j) = 1/(i+j-1); end end disp(h) 1
35、1/2 1/3 1/4 1/5 1/6 1/2 1/3 1/4 1/5 1/6 1/7 1/3 1/4 1/5 1/6 1/7 1/8 1/4 1/5 1/6 1/7 1/8 1/9 1/5 1/6 1/7 1/8 1/9 1/10 1/6 1/7 1/8 1/9 1/10 1/11 小提示:預先配置矩陣 在上面的例子,我們使用zeros來預先配置(Allocate)了一個適當大小的矩陣。若不預先配置矩陣,程式仍可執(zhí)行,但此時MATLAB需要動態(tài)地增加(或減?。┚仃嚨拇笮?,因而降低程式的執(zhí)行效率。所以在使用一個矩陣時,若能在事前知道其大小,則最好先使用zeros或ones等命令來預先配置所需的
36、記憶體(即矩陣)大小。 在下例中,for圈列出先前產(chǎn)生的Hilbert矩陣的每一行的平方和: for i = h, disp(norm(i)2); % 印出每一行的平方和 end 1299/871 282/551 650/2343 524/2933 559/4431 831/8801 在上例中,每一次i的值就是矩陣h的一行,所以寫出來的命令特別簡潔。 令一個常用到的重復命令是while圈,其基本形式為: while 條件式; 運算式; end 也就是說,只要條件示成立,運算式就會一再被執(zhí)行。例如先前產(chǎn)生調(diào)和數(shù)列的例子,我們可用while圈改寫如下: x = zeros(1,6); % x是一個
37、16的零矩陣 i = 1; while i 0.5, disp(Given random number is greater than 0.5.); end Given random number is greater than 0.5. 1-4、集合多個命令於一個M檔案 若要一次執(zhí)行大量的MATLAB命令,可將這些命令存放於一個副檔名為m的檔案,并在 MATLAB提示號下鍵入此檔案的主檔名即可。此種包含MATLAB命令的檔案都以m為副檔名,因此通稱M檔案(M-files)。例如一個名為test.m的M檔案,包含一連串的MATLAB命令,那麼只要直接鍵入test,即可執(zhí)行其所包含的命令: pw
38、d % 顯示現(xiàn)在的目錄 ans = D:MATLAB5bin cd c:datamlbook % 進入test.m所在的目錄 type test.m % 顯示test.m的內(nèi)容 % This is my first test M-file. % Roger Jang, March 3, 1997 fprintf(Start of test.m!n); for i = 1:3, fprintf(i = %d - i3 = %dn, i, i3); end fprintf(End of test.m!n); test % 執(zhí)行test.m Start of test.m! i = 1 - i3 =
39、 1 i = 2 - i3 = 8 i = 3 - i3 = 27 End of test.m! 小提示:第一注解行(H1 help line) test.m的前兩行是注解,可以使程式易於了解與管理。特別要說明的是,第一注解行通常用來簡短說明此M檔案的功能,以便lookfor能以關(guān)鍵字比對的方式來找出此M檔案。舉例來說,test.m的第一注解行包含test這個字,因此如果鍵入lookfor test,MATLAB即可列出所有在第一注解行包含test的M檔案,因而test.m也會被列名在內(nèi)。 嚴格來說,M檔案可再細分為命令集(Scripts)及函數(shù)(Functions)。前述的test.m即為命
40、令集,其效用和將命令逐一輸入完全一樣,因此若在命令集可以直接使用工作空間的變數(shù),而且在命令集中設(shè)定的變數(shù),也都在工作空間中看得到。函數(shù)則需要用到輸入引數(shù)(Input arguments)和輸出引數(shù)(Output arguments)來傳遞資訊,這就像是C語言的函數(shù),或是FORTRAN語言的副程序(Subroutines)。舉例來說,若要計算一個正整數(shù)的階乘 (Factorial),我們可以寫一個如下的MATLAB函數(shù)并將之存檔於fact.m: function output = fact(n) % FACT Calculate factorial of a given positive int
41、eger. output = 1; for i = 1:n, output = output*i; end 其中fact是函數(shù)名,n是輸入引數(shù),output是輸出引數(shù),而i則是此函數(shù)用到的暫時變數(shù)。要使用此函數(shù),直接鍵入函數(shù)名及適當輸入引數(shù)值即可: y = fact(5) y = 120 (當然,在執(zhí)行fact之前,你必須先進入fact.m所在的目錄。)在執(zhí)行fact(5)時, MATLAB會跳入一個下層的暫時工作空間(Temperary workspace),將變數(shù)n的值設(shè)定為5,然後進行各項函數(shù)的內(nèi)部運算,所有內(nèi)部運算所產(chǎn)生的變數(shù)(包含輸入引數(shù)n、暫時變數(shù)i,以及輸出引數(shù)output)都存
42、在此暫時工作空間中。運算完畢後,MATLAB會將最後輸出引數(shù)output的值設(shè)定給上層的變數(shù)y,并將清除此暫時工作空間及其所含的所有變數(shù)。換句話說,在呼叫函數(shù)時,你只能經(jīng)由輸入引數(shù)來控制函數(shù)的輸入,經(jīng)由輸出引數(shù)來得到函數(shù)的輸出,但所有的暫時變數(shù)都會隨著函數(shù)的結(jié)束而消失,你并無法得到它們的值。 小提示:有關(guān)階乘函數(shù) 前面(及後面)用到的階乘函數(shù)只是純粹用來說明MATLAB的函數(shù)觀念。若實際要計算一個正整數(shù)n的階乘(即n!)時,可直接寫成prod(1:n),或是直接呼叫g(shù)amma函數(shù):gamma(n-1)。 MATLAB的函數(shù)也可以是遞式的(Recursive),也就是說,一個函數(shù)可以呼叫它本身。
43、 舉例來說,n! = n*(n-1)!,因此前面的階乘函數(shù)可以改成遞式的寫法: function output = fact(n) % FACT Calculate factorial of a given positive integer recursively. if n = 1, % Terminating condition output = 1; return; end output = n*fact(n-1); 在寫一個遞函數(shù)時,一定要包含結(jié)束條件(Terminating condition),否則此函數(shù)將會一再呼叫自己,永遠不會停止,直到電腦的記憶體被耗盡為止。以上例而言,n=1
44、即滿足結(jié)束條件,此時我們直接將output設(shè)為1,而不再呼叫此函數(shù)本身。 1-5、搜尋路徑 在前一節(jié)中,test.m所在的目錄是d:mlbook。如果不先進入這個目錄,MATLAB就找不到你要執(zhí)行的M檔案。如果希望MATLAB不論在何處都能執(zhí)行test.m,那麼就必須將d:mlbook加入MATLAB的搜尋路徑(Search path)上。要檢視MATLAB的搜尋路徑,鍵入path即可: path MATLABPATH d:matlab5toolboxmatlabgeneral d:matlab5toolboxmatlabops d:matlab5toolboxmatlablang d:mat
45、lab5toolboxmatlabelmat d:matlab5toolboxmatlabelfun d:matlab5toolboxmatlabspecfun d:matlab5toolboxmatlabmatfun d:matlab5toolboxmatlabdatafun d:matlab5toolboxmatlabpolyfun d:matlab5toolboxmatlabfunfun d:matlab5toolboxmatlabsparfun d:matlab5toolboxmatlabgraph2d d:matlab5toolboxmatlabgraph3d d:matlab5to
46、olboxmatlabspecgraph d:matlab5toolboxmatlabgraphics d:matlab5toolboxmatlabuitools d:matlab5toolboxmatlabstrfun d:matlab5toolboxmatlabiofun d:matlab5toolboxmatlabtimefun d:matlab5toolboxmatlabdatatypes d:matlab5toolboxmatlabdde d:matlab5toolboxmatlabdemos d:matlab5toolboxtour d:matlab5toolboxsimulink
47、simulink d:matlab5toolboxsimulinkblocks d:matlab5toolboxsimulinksimdemos d:matlab5toolboxsimulinkdee d:matlab5toolboxlocal 此搜尋路徑會依已安裝的工具箱(Toolboxes)不同而有所不同。要查詢某一命令是在搜尋路徑的何處,可用which命令: which expo d:matlab5toolboxmatlabdemosexpo.m 很顯然c:datamlbook并不在MATLAB的搜尋路徑中,因此MATLAB找不到test.m這個M檔案: which test c:dat
48、amlbooktest.m 要將d:mlbook加入MATLAB的搜尋路徑,還是使用path命令: path(path, c:datamlbook); 此時d:mlbook已加入MATLAB搜尋路徑(鍵入path試看看),因此MATLAB已經(jīng)看得到 test.m: which test c:datamlbooktest.m 現(xiàn)在我們就可以直接鍵入test,而不必先進入test.m所在的目錄。 小提示:如何在其啟動MATLAB時,自動設(shè)定所需的搜尋路徑? 如果在每一次啟動MATLAB後都要設(shè)定所需的搜尋路徑,將是一件很麻煩的事。有兩種方法,可以使MATLAB啟動後 ,即可載入使用者定義的搜尋路徑
49、: 1.MATLAB的預設(shè)搜尋路徑是定義在matlabrc.m(在c:matlab之下,或是其他安裝MATLAB 的主目錄下),MATLAB每次啟動後,即自動執(zhí)行此檔案。因此你可以直接修改matlabrc.m ,以加入新的目錄於搜尋路徑之中。 2.MATLAB在執(zhí)行matlabrc.m時,同時也會在預設(shè)搜尋路徑中尋找startup.m,若此檔案存在,則執(zhí)行其所含的命令。因此我們可將所有在MATLAB啟動時必須執(zhí)行的命令(包含更改搜尋路徑的命令),放在此檔案中。 每次MATLAB遇到一個命令(例如test)時,其處置程序為: 1.將test視為使用者定義的變數(shù)。 2.若test不是使用者定義的變
50、數(shù),將其視為永久常數(shù) 。 3.若test不是永久常數(shù),檢查其是否為目前工作目錄下的M檔案。 4.若不是,則由搜尋路徑尋找是否有test.m的檔案。 5.若在搜尋路徑中找不到,則MATLAB會發(fā)出嗶嗶聲并印出錯誤訊息。 以下介紹與MATLAB搜尋路徑相關(guān)的各項命令。 1-6、資料的儲存與載入 有些計算曠日廢時,那麼我們通常希望能將計算所得的儲存在檔案中,以便將來可進行其他處理。MATLAB儲存變數(shù)的基本命令是save,在不加任何選項(Options)時,save會將變數(shù)以二進制(Binary)的方式儲存至副檔名為mat的檔案,如下述: save:將工作空間的所有變數(shù)儲存到名為matlab.mat
51、的二進制檔案。 save filename:將工作空間的所有變數(shù)儲存到名為filename.mat的二進制檔案。 save filename x y z :將變數(shù)x、y、z儲存到名為filename.mat的二進制檔案。 以下為使用save命令的一個簡例: who % 列出工作空間的變數(shù) Your variables are: B h j y ans i x z save test B y % 將變數(shù)B與y儲存至test.mat dir % 列出現(xiàn)在目錄中的檔案 . 2plotxy.doc fact.m simulink.doc test.m $1basic.doc . 3plotxyz.do
52、c first.doc temp.doc test.mat 1basic.doc book.dot go.m template.doc testfile.dat delete test.mat % 刪除test.mat 以二進制的方式儲存變數(shù),通常檔案會比較小,而且在載入時速度較快,但是就無法用普通的文書軟體(例如pe2或記事本)看到檔案內(nèi)容。若想看到檔案內(nèi)容,則必須加上-ascii選項,詳見下述: save filename x -ascii:將變數(shù)x以八位數(shù)存到名為filename的ASCII檔案。Save filename x -ascii -double:將變數(shù)x以十六位數(shù)存到名為fi
53、lename的ASCII檔案。 另一個選項是-tab,可將同一列相鄰的數(shù)目以定位鍵(Tab)隔開。 小提示:二進制和ASCII檔案的比較 在save命令使用-ascii選項後,會有下列現(xiàn)象:save命令就不會在檔案名稱後加上mat的副檔名。因此以副檔名mat結(jié)尾的檔案通常是MATLAB的二進位資料檔。 若非有特殊需要,我們應(yīng)該盡量以二進制方式儲存資料。 load命令可將檔案載入以取得儲存之變數(shù): load filename:load會尋找名稱為filename.mat的檔案,并以二進制格式載入。若找不到filename.mat,則尋找名稱為filename的檔案,并以ASCII格式載入。loa
54、d filename -ascii:load會尋找名稱為filename的檔案,并以ASCII格式載入。 若以ASCII格式載入,則變數(shù)名稱即為檔案名稱(但不包含副檔名)。若以二進制載入,則可保留原有的變數(shù)名稱,如下例: clear all; % 清除工作空間中的變數(shù) x = 1:10; save testfile.dat x -ascii % 將x以ASCII格式存至名為testfile.dat的檔案 load testfile.dat % 載入testfile.dat who % 列出工作空間中的變數(shù) Your variables are: testfile x 注意在上述過程中,由於是以
55、ASCII格式儲存與載入,所以產(chǎn)生了一個與檔案名稱相同的變數(shù)testfile,此變數(shù)的值和原變數(shù)x完全相同。 1-7、結(jié)束MATLAB 有三種方法可以結(jié)束MATLAB: 1.鍵入exit 2.鍵入quit 3.直接關(guān)閉MATLAB的命令視窗(Command window)數(shù)值函數(shù) Nexpr表達式的機器精度近似值 Nexpr, n 表達式的n位近似值,n為任意正整數(shù) NSolvelhs=rhs, var 求方程數(shù)值解 NSolveeqn, var, n 求方程數(shù)值解,結(jié)果精度到n位 NDSolveeqns, y, x, xmin, xmax微分方程數(shù)值解 NDSolveeqns, y1,y2,
56、., x, xmin, xmax 微分方程組數(shù)值解 FindRootlhs=rhs, x,x0 以x0為初值,尋找方程數(shù)值解 FindRootlhs=rhs, x, xstart, xmin, xmax NSumf, i,imin,imax,di 數(shù)值求和,di為步長 NSumf, i,imin,imax,di, j,.,. 多維函數(shù)求和 NProductf, i, imin, imax, di函數(shù)求積 NIntegratef, x, xmin, xmax 函數(shù)數(shù)值積分 優(yōu)化函數(shù): FindMinimumf, x,x0 以x0為初值,尋找函數(shù)最小值 FindMinimumf, x, xstar
57、t, xmin, xmax ConstrainedMinf,inequ,x,y,. inequ為線性不等式組,f為x,y.之線性函數(shù),得到最小值及此時的x,y.取值 ConstrainedMaxf, inequ, x, y,.同上 LinearProgrammingc,m,b 解線性組合c.x在m.x=b&x=0約束下的 最小值,x,b,c為向量,m為矩陣 LatticeReducev1,v2. 向量組vi的極小無關(guān)組 數(shù)據(jù)處理: Fitdata,funs,vars用指定函數(shù)組對數(shù)據(jù)進行最小二乘擬和 data可以為x1,y1,.f1,x2,y2,.f2.多維的情況 emp: Fit10.22,
58、12,3.2,9.9, 1, x, x2,Sinx, x Interpolationdata對數(shù)據(jù)進行差值, data同上,另外還可以為x1,f1,df11,df12,x2,f2,.指定各階導數(shù) InterpolationOrder默認為3次,可修改 ListInterpolationarray對離散數(shù)據(jù)插值,array可為n維 ListInterpolationarray,xmin,xmax,ymin,ymax,. FunctionInterpolationexpr,x,xmin,xmax, y,ymin,ymax,. 以對應(yīng)exprxi,yi的為數(shù)據(jù)進行插值 Fourierlist 對復數(shù)
59、數(shù)據(jù)進行付氏變換 InverseFourierlist 對復數(shù)數(shù)據(jù)進行付氏逆變換 Minx1,x2.,y1,y2,.得到每個表中的最小值 Maxx1,x2.,y1,y2,.得到每個表中的最大值 Selectlist, crit 將表中使得crit為True的元素選擇出來 Countlist, pattern 將表中匹配模式pattern的元素的個數(shù) Sortlist 將表中元素按升序排列 Sortlist,p 將表中元素按pe1,e2為True的順序比較list 的任兩個元素e1,e2,實際上Sortlist中默認p=Greater 集合論: Unionlist1,list2. 表listi的
60、并集并排序 Intersectionlist1,list2. 表listi的交集并排序 Complementlistall,list1,list2.從全集listall中對listi的差集 九、虛數(shù)函數(shù) Reexpr 復數(shù)表達式的實部 Imexpr 復數(shù)表達式的虛部 Absexpr 復數(shù)表達式的模 Argexpr 復數(shù)表達式的輻角 Conjugateexpr 復數(shù)表達式的共軛 十、數(shù)的頭及模式及其他操作 Integer _Integer 整數(shù) Real _Real 實數(shù) Complex _Complex 復數(shù) Rational_Rational 有理數(shù) (*注:模式用在函數(shù)參數(shù)傳遞中,如MyF
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025個人購房合同范文
- 2025二級建造師《施工承包與物資采購合同的內(nèi)容》課后練習
- 牙科正畸固定矯治器的構(gòu)成與安裝
- 2024年醫(yī)院醫(yī)療美容服務(wù)人員勞動合同3篇
- 2024年度新型暖氣管道鋪設(shè)及維修服務(wù)合同
- 2024年精裝修樣板房項目協(xié)議范例版B版
- 簽約會員合同范例
- 占用房屋合同范例
- 商丘工學院《機械工程訓練A》2023-2024學年第一學期期末試卷
- 商洛學院《綠色建筑》2023-2024學年第一學期期末試卷
- 譯林版六年級上冊英語期末復習之填詞適當形式
- 線性代數(shù)(上海電力大學)智慧樹知到答案2024年上海電力大學
- 2024年人教版小學四年級信息技術(shù)(上冊)期末試卷及答案
- 2024年全國煙花爆竹經(jīng)營單位安全生產(chǎn)考試題庫(含答案)
- 《病梅館記》解析版(分層作業(yè))
- 嬰幼兒發(fā)展引導員理論考試題庫資料500題(含答案)
- 《預防和減少未成年人犯罪》專題講座(經(jīng)典)
- 2024-2030年中國激光陀螺儀行業(yè)市場發(fā)展趨勢與前景展望戰(zhàn)略分析報告
- DL∕ T 1195-2012 火電廠高壓變頻器運行與維護規(guī)范
- 大數(shù)據(jù)分析導論智慧樹知到期末考試答案章節(jié)答案2024年南京工業(yè)大學
- 內(nèi)審員培訓班考核試題
評論
0/150
提交評論