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