Hello,大家好,上期智商經(jīng)常性短期離線的上官小編又回來了。這次將為大家?guī)鞰atlab的進階篇教程,這期將會介紹編程,繪圖以及simulink的學(xué)習(xí)方法。 Matlab編程的基本方法 不知道大家還記不記得上期教程中的一句話,Matlab的核心語言是C語言。在編程的過程中用到的很多思想都和C語言的編程非常相似,學(xué)過C語言的同學(xué)只要在學(xué)習(xí)Matlab的過程中舉一反三,就能很容易的掌握這個方法了。 首先,為大家介紹一下M文件。我們編出來的程序都是以M文件的形式存放在計算機中的。M文件是以 .m為后綴的文件,根據(jù)調(diào)用方式的不同可分為腳本文件和函數(shù)文件。兩者的區(qū)別就在于腳本文件只是一連串命令的集合體,而函數(shù)文件是有著輸入和輸出變量的。 接下來為大家介紹一下函數(shù)文件。函數(shù)文件由function語句引導(dǎo),基本的形式是 function[輸出形參列表]=函數(shù)名(輸入形參列表) 其中函數(shù)的命名規(guī)則與變量相同,且開頭必須是字母,當(dāng)輸出形參多于一個時必須用方括號括起來。下面為大家舉個栗子。 function y = fliplr(x) %FLIPLR Flip matrix in left/right direction.
if ~ismatrix(x) error(message('MATLAB:fliplr:SizeX')); end y = x(:,end:-1:1); 這就是一個簡單的將矩陣進行左右翻轉(zhuǎn)的函數(shù)。并且為了用戶的方便,通常會在函數(shù)里加入容錯的指令,即if開始向下的部分,在函數(shù)的結(jié)尾用end表示結(jié)束。這樣一個函數(shù)就編寫完成了,當(dāng)我們需要的時候直接調(diào)用就好了。而調(diào)用的方法和C語言也很相似。只需要 [輸出實參列表]=函數(shù)名(輸入實參列表),特被需要注意的是,函數(shù)調(diào)用時,實參的順序應(yīng)與函數(shù)定義時的形參的順序一致,變量名無需一致。 下面再舉一個調(diào)用的栗子。 >> a=[1,2,3;4,5,6;7,8,9]; >> b=fliplr(a) 就這樣,一個函數(shù)的調(diào)用就完成了。在函數(shù)編寫的過程中,一個函數(shù)是可以包含多個子函數(shù)的,但要注意,主函數(shù)必須位于子函數(shù)前面,子函數(shù)只能在所在函數(shù)文件內(nèi)被主函數(shù)和其他子函數(shù)調(diào)用,不可以出現(xiàn)越級調(diào)用。 接下來為大家介紹一下全局變量和局部變量。 局部變量 函數(shù)文件中的變量都是局部的,即一個函數(shù)文件中定義的變量不能被另一個函數(shù)文件或其它M文件使用。當(dāng)函數(shù)調(diào)用完畢后,該函數(shù)文件中定義的所有局部變量都將被釋放,即全部被清除。 全局變量 如果在若干個M文件中,都把某個變量定義為全局變量,則這些函數(shù)將公共使用這一變量。所有函數(shù)都可以對它進行存取和修改操作。全局變量的格式為 global 變量名列表變量名列表中的各個變量用空格隔開,不能用逗號。 全局變量給函數(shù)間的數(shù)據(jù)傳遞帶來了方便,但卻破壞了函數(shù)對變量的封裝,降低了程序的可讀性,因而在結(jié)構(gòu)化程序設(shè)計中,全局變量是不受歡迎的。特別是當(dāng)程序較大,子程序較多時,全局變量將個程序調(diào)試和維護帶來不便,故不提倡使用全局變量。 控制語句 控制語句的主要形式有循環(huán)結(jié)構(gòu)(for,while),條件分支結(jié)構(gòu)(if-else,swich-case),錯誤控制語句(try-catch),然后end結(jié)尾(這個千萬不要忘了)。其實他們的功能與C語言中的控制語句基本一樣。下面將介紹各種控制語句的使用方法。 for循環(huán)語句 格式:for 變量=(初始值:增量:終止值) statement(循環(huán)體) end tips:根據(jù)for后的增量語句限定循環(huán)次數(shù) 先執(zhí)行statement再判斷是否循環(huán) 至少執(zhí)行一次statement 循環(huán)次數(shù)僅計算一次 while語句 2 語句格式:while expression(條件語句) statement(循環(huán)體) end tips:while后語句為循環(huán)進行的判定條件 先判定條件再執(zhí)行statement 可以一次statement都不執(zhí)行 (其實講道理和C語言里的for和while一樣有沒有) if-else條件語句 3 語句格式:if expression1 (條件1) statement 1(語句組1) elseif expression2(條件2) statement2(語句組2) else statements(語句組) end switch-case開關(guān)語句 4 switch expression(表達式) case value1(數(shù)值1) statement1(語句組1) case value2(數(shù)值2) statement2(語句組2) otherwise statement(語句組) end try-catch錯誤控制語句 5 try statement1(如果正確執(zhí)行,跳出結(jié)構(gòu)) catch statement2(如果statement1錯誤則執(zhí)行) end 控制指令 6 ontinue: 在for或者while循環(huán)中直接跳至下一個循環(huán)的執(zhí)行(即如果符合條件直接返回循環(huán)的開始執(zhí)行循環(huán),與后邊的break直接跳出循環(huán)要區(qū)分開) break:終止for或while循環(huán),跳出執(zhí)行循環(huán)后的下一個語句(直接跳出循環(huán)) return:提前終止函數(shù),回到主調(diào)文件中 (這個控制指令也和C語言沒有太大區(qū)別) 關(guān)系運算 首先強調(diào)下=與==的區(qū)別,=是賦值操作,b=a即把a的值賦給b,而b==a是關(guān)系運算,變量b和變量a進行比較,如果相等,則返回真。 接下來介紹幾種邏輯運算。 &&和||比&和|更智能,當(dāng)一個數(shù)滿足條件時,不計算另一個數(shù)。 到這里編程所需的基本語句和運算符號都介紹完畢了,小編提醒,在未來編程的過程中為了提高編程效率,要令自己的程序功能層次合理,滿足腳本——高級函數(shù)——低級函數(shù)的順序,盡量少使用循環(huán),可以用矩陣的操作代替,盡量避免使用全局變量、遞歸調(diào)用。最后為大家介紹一個求解非線性方程的常用方法,牛頓迭代: 下面將以方程x2+2xex+e2x=0為例,運用牛頓迭代法求方程的根。 算得迭代數(shù)列的前20項為-0.2500,-0.3986,-0.4802,-0.5230,-0.5449,-0.5560,-0.5615,-0.5643,-0.5657,-0.5664,-0.5668,-0.5670,-0.5671,-0.5671,-0.5671,說明迭代是收斂的, 且第五次迭代時誤差就不超過10^-3。 Matlab繪圖的基本方法 還在為做完實驗得到的一大堆數(shù)據(jù)不知道怎么處理而頭疼嗎?不要慌,下面小編將教你使用Matlab處理數(shù)據(jù)。先送個小彩蛋,sphere可以畫球,sphere(正整數(shù))不同值可以畫出不一樣顏色的球。Sphere(1000)是黑球,sphere(100)是彩球,想知道怎么回事就往下看吧。 通常處理數(shù)據(jù)有兩種方式,一個是擬合,一個是插值。擬合是要設(shè)法找出某條光滑曲線,它最佳地擬合數(shù)據(jù),但不必要經(jīng)過每一個數(shù)據(jù)點。插值是假定數(shù)據(jù)是正確的,要求以某種方法描述數(shù)據(jù)點之間所發(fā)生的情況。 多項式的擬合
通常我們采用的擬合方式是最小二乘法。最小二乘曲線擬合的函數(shù)為p=polyfit(x,y,n),其中x,y為數(shù)據(jù)點,n為多項式最高階的階數(shù),p是多項式的系數(shù)向量。下面再舉個栗子:x=[0, .1 , .2 , .3 , .4 , .5 , .6 , .7 , .8 , .9 , 1 ]; y=[-.447 , 1.978 , 3.28,6.16 , 7.08 , 7.34 , 7.66 , 9.56 , 9.48 , 9.30 , 11.2]; p=polyfit(x,y,n) 這樣就可以得出擬合出來的多項式的系數(shù)了。多項式階次的選擇是有點任意的。 1)兩點決定一直線或一階多項式。三點決定一個平方 或2階多項式。按此進行,n+1數(shù)據(jù)點唯一地確定n 階多項式。 2)在上面的情況下,有11個數(shù)據(jù)點,我們可選一個高達10階的多項式。 3)高階多項式給出很差的數(shù)值特性,不應(yīng)選擇比所需的階次高的多項式。隨著多項式階次的提高,近似變得不夠光滑。 函數(shù)的插值 一維插值:一維插值函數(shù): yi=interp1(x,Y,xi) 返回插值向量yi,每一元素對應(yīng)于參量xi, 同時由向量x與Y的內(nèi)插值決定。參量x指定數(shù)據(jù)Y的點。 yi = interp1(x,Y,xi,method) 用指定的算法計算插值 ‘nearest’:最近鄰點插值,直接完成計算; ‘linear’:線性插值(缺省方式),直接完成計算; ‘spline’:三次樣條函數(shù)插值。對于該方法,命令 interp1調(diào)用函數(shù)spline、ppval、mkpp、umkpp。這些命令生成一系列用于分段多項式操作的函數(shù)。命令spline用它們執(zhí)行三次樣條函數(shù)插值; ‘pchip’:分段三次Hermite插值。對于該方法,命令 interp1調(diào)用函數(shù)pchip,用于對向量x與y執(zhí)行分段三次內(nèi)插值。該方法保留單調(diào)性與數(shù)據(jù)的外形; ‘cubic’:與’pchip’操作相同。 下面就要教大家怎么畫圖了。使用函數(shù)plot即可作出圖像。plot(X,Y) 當(dāng)X,Y均為實數(shù)向量,且為同維向量(可以不是同型向量),X=[x(i)],Y=[y(i)],則plot(X,Y)先描出點(x(i),y(i)),然后用直線依次相連; 若X,Y均為同維同型實數(shù)矩陣,X = [X(i)],Y = [Y(i)],其中X(i),Y(i)為列向量,則plot(X,Y)依次畫出plot(X(i),Y(i)),矩陣有幾列就有幾條線;若X,Y中一個為向量,另一個為矩陣, 且向量的維數(shù)等于矩陣的行數(shù)或者列數(shù),則矩陣按向量的方向分解成幾個向量,再與向量配對分別畫出,矩陣可分解成幾個向量就有幾條線。 plot(Y)若Y為實數(shù)向量,Y的維數(shù)為m,則plot(Y)等價于plot(X,Y),其中x=1:m;若y為實數(shù)矩陣,則把y按列的方向分解成幾個列向量,而y的行數(shù)為n,則plot(Y)等價于plot(X,Y)其中x=[1;2; … ;n]
plot(X1,Y1,LineSpec1,X2,Y2,LineSpec2 ) 將按順序分別畫出由三參數(shù)定義Xi,Yi,LineSpeci的線條。其中參數(shù)LineSpeci指明了線條的類型,標(biāo)記符號,和畫線用的顏色。在plot命令中我們可以混合使用三參數(shù)和二參數(shù)的形式。 參數(shù)LineSpec:定義線的屬性 線條寬度 LineWidth:指定線條的寬度,取值為整數(shù)(單位為像素點) 標(biāo)記大小 MarkerSize:指定標(biāo)記符號的大小尺寸,取值為整數(shù)(單位為像素) 標(biāo)記面填充顏色 MarkerFaceColor:指定用于填充標(biāo)記符面的顏色。取值在上表。 標(biāo)記周邊顏色 MarkerEdgeColor :指定標(biāo)記符顏色或者是標(biāo)記符(小圓圈、正方形、棱形、正五角星、正六角星和四個方向的三角形)周邊線條的顏色。 所以一個曲線的格式應(yīng)該是這樣的: plot(t,sin(2*t),'-mo', 'LineWidth',2,'MarkerEdgeColor','k', 'MarkerFaceColor',[.49 1 .63],'MarkerSize',12) fplot (‘function‘,limits) 指定的范圍limits內(nèi)畫出一元函數(shù)y=f(x)的圖形。其中向量x的分量分布在指定的范圍內(nèi),y是與x同型的向量,對應(yīng)的分量有函數(shù)關(guān)系:y(i)=f(x(i))。若對應(yīng)于x的值,y返回多個值,則y是一個矩陣,其中每列對應(yīng)一個f(x)。注意,函數(shù)function必須是一個m-文件函數(shù)或者是一個包含變量x,且能用函數(shù)eval計算的字符串。 如‘sin(x)*exp(2*x)’,’[sin(x),cos(x)]’ limits是一個指定x-軸范圍的向量[xmin xmax]或者是x軸和y軸的范圍的向量[xmin xmax ymin ymax]。同樣的,fplot也可以用LineSpec進行線型和標(biāo)記的區(qū)分。 特殊平面圖形命令 polar:功能畫極坐標(biāo)圖。該命令接受極坐標(biāo)形式的函數(shù) rho=f(θ),在笛卡兒坐標(biāo)系平面上畫出該函數(shù),且在面上畫出極坐標(biāo)形式的格柵。格式:polar(theta,rho,LineSpec)用極角theta和極徑rho畫出極坐標(biāo)圖形。極角theta為從x軸到半徑的單位為弧度的向量,極徑rho為各數(shù)據(jù)點到極點的半徑向量。 栗子又來了: t = 0:.01:2*pi; polar(t,sin(3*t).*cos(2*t),'--r') pie 功能:餅形圖pie(X) 用x中的數(shù)據(jù)畫一餅形圖,x中的每一元素代表餅形圖中的一部分。X中元素X(i)所代表的扇形大小通過X(i)/sum(X)的大小來決定。 pie(X,explode) 從餅形圖中分離出一部分,explode為元素為零或非零的、與x相對應(yīng)的向量或矩陣。與 explode的非零值對應(yīng)的部分將從餅形圖中心分離出來。explode必須與x同型。 栗子: x = [1 3 0.5 2.5 2]; pie(x) explode = [0 1 0 0 0]; pie(x,explode) 教程的最后,彩蛋附送,要考試的童鞋們看過來: 考試題型: 一、單選題(1分×10題=10分) 二、判斷題(1分×10題=10分) 三、簡答題(5分×4題=20分) 四、程序設(shè)計與建模(10分×4題=40分) 復(fù)習(xí)重點: 矩陣操作 牛頓迭代 函數(shù)文件 繪圖 解方程 simulink |
|