MATLAB新手教程html
1.MATLAB的基本知識dom
1-一、基本運算與函數 ide
在MATLAB下進行基本數學運算,僅僅需將運算式直接打入提示號(>>)之後,並按入Enter鍵就能夠。好比: 函數
>> (5*2+1.3-0.8)*10/25 工具
ans =4.2000 oop
MATLAB會將運算結果直接存入一變數ans,表明MATLAB運算後的答案(Answer)並顯示其數值於螢幕上。ui
小提示: ">>"是MATLAB的提示符號(Prompt),但在PC中文視窗系統下,由於編碼方式不一樣,此提示符號常會消失不見,但這並不會影響到MATLAB的運算結果。 編碼
咱們也可將上述運算式的結果設定給還有一個變數x: idea
x = (5*2+1.3-0.8)*10^2/25 spa
x = 42
此時MATLAB會直接顯示x的值。由上例可知,MATLAB認識所有通常常用到的加(+)、減(-)、乘(*)、除(/)的數學運算符號,以及冪次運算(^)。
小提示: MATLAB將所有變數均存成double的形式,因此不需通過變數宣告(Variabledeclaration)。MATLAB同一時候也會本身主動進行記憶體的使用和回收,而沒必要像C語言,必須由使用者一一指定.這些功能使的MATLAB易學易用,使用者可專心致力於撰寫程式,而沒必要被軟體枝節問題所幹擾。
若不想讓MATLAB每次都顯示運算結果,僅僅需在運算式最後加上分號(;)就能夠,例如如下例:
y = sin(10)*exp(-0.3*4^2);
若要顯示變數y的值,直接鍵入y就能夠:
>>y
y =-0.0045
在上例中,sin是正弦函數,exp是指數函數,這些都是MATLAB常用到的數學函數。
下表即爲MATLAB常用的基本數學函數及三角函數:
小整理:MATLAB常用的基本數學函數
abs(x):純量的絕對值或向量的長度
angle(z):復 數z的相角(Phase angle)
sqrt(x):開平方
real(z):複數z的實部
imag(z):複數z的虛 部
conj(z):複數z的共軛複數
round(x):四捨五入至近期整數
fix(x):無論正負,捨去小數至近期整數
floor(x):地板函數,即捨去正小數至近期整數
ceil(x):天花板函數,即增長正小數至近期整數
rat(x):將實數x化爲分數表示
rats(x):將實數x化爲多項分數展開
sign(x):符號函數 (Signum function)。
當x<0時,sign(x)=-1;
當x=0時,sign(x)=0;
當x>0時,sign(x)=1。
> 小整理:MATLAB常用的三角函數
sin(x):正弦函數
cos(x):餘弦函數
tan(x):正切函數
asin(x):反正弦函數
acos(x):反餘弦函數
atan(x):反正切函數
atan2(x,y):四象限的反正切函數
sinh(x):超越正弦函數
cosh(x):超越餘弦函數
tanh(x):超越正切函數
asinh(x):反超越正弦函數
acosh(x):反超越餘弦函數
atanh(x):反超越正切函數
變數也可用來存放向量或矩陣,並進行各類運算,例如如下例的列向量(Row vector)運算:
x = [1 3 5 2];
y = 2*x+1
y = 3 7 11 5
小提示:變數命名的規則
1.第一個字母必須是英文字母 2.字母間不可留空格 3.最多僅僅能有19個字母,MATLAB會忽略多餘字母
咱們可以任意更改、添加或刪除向量的元素:
y(3) = 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表明一個由二、三、4組成的向量
若對MATLAB函數使用方法有疑問,可隨時使用help來尋求線上支援(on-line help):helplinspace
小整理:MATLAB的查詢命令
help:用來查詢已知命令的使用方法。好比已知inv是用來計算反矩陣,鍵入help inv就能夠得知有關inv命令的使用方法。(鍵入help help則顯示help的使用方法,請試看看!) lookfor:用來尋找未知的命令。好比要尋找計算反矩陣的命令,可鍵入 lookfor inverse,MATLAB即會列出所有和keywordinverse相關的指令。找到所需的命令後 ,就能夠用help進一步找出其使用方法。(lookfor實際上是對所有在搜尋路徑下的M檔案進行keyword對第一註解行的比對,詳見後敘。)
將列向量轉置(Transpose)後,就能夠獲得行向量(Column vector):
z = x'
z = 4.0000
5.2000
6.4000
7.6000
8.8000
10.0000
不管是行向量或列向量,咱們都可用一樣的函數找出其元素個數、最大值、最小值等:
length(z) % z的元素個數
ans = 6
max(z) % z的最大值
ans = 10
min(z) % z的最小值
ans = 4
小整理:適用於向量的常用函數有:
min(x): 向量x的元素的最小值
max(x): 向量x的元素的最大值
mean(x): 向量x的元素的平均值
median(x): 向量x的元素的中位數
std(x): 向量x的元素的標準差
diff(x): 向量x的相鄰元素的差
sort(x): 對向量x的元素進行排序(Sorting)
length(x): 向量x的元素個數
norm(x): 向量x的歐氏(Euclidean)長度
sum(x): 向量x的元素總和
prod(x): 向量x的元素總乘積
cumsum(x): 向量x的累計元素總和
cumprod(x): 向量x的累計元素總乘積
dot(x, y): 向量x和y的內 積
cross(x, y): 向量x和y的外積 (大部份的向量函數也可適用於矩陣,詳見下述。)
若要輸入矩陣,則必須在每一列結尾加上分號(;),例如如下例:
A = [1 2 3 4; 5 6 7 8; 9 1011 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轉置後以行向量併入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 12 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
這幾種矩陣處理的方式可以相互疊代運用,產生各類意想不到的效果,就看各位的巧思和創意。
小提示:在MATLAB的內部資料結構中,每一個矩陣都是一個以行爲主(Column-oriented )的陣列(Array)所以對於矩陣元素的存取,咱們可用一維或二維的索引(Index)來定址。舉例來講,在上述矩陣A中,位於第二列、第三行的元素可寫爲A(2,3) (二維索引)或A(6)(一維索引,即將所有直行進行堆疊後的第六個元素)。
此外,若要又一次安排矩陣的形狀,可用reshape命令:
B = reshape(A, 4, 2) % 4是新矩陣的列數,2是新矩陣的行數
B =
5 8
9 12
5 6
11 5
小提示: A(:)就是將矩陣A每一列堆疊起來,成爲一個行向量,而這也是MATLAB變數的內部儲存方式。曾經例而言,reshape(A, 8, 1)和A(:)相同都會產生一個8x1的矩陣。
MATLAB可在同一時候運行數個命令,僅僅要以逗號或分號將命令隔開:
x = sin(pi/3); y = x^2; z = y*10,
z =
7.5000
若一個數學運算是太長,可用三個句點將其延伸到下一行:
z = 10*sin(pi/3)* ...
sin(pi/3);
若要檢視現存於工做空間(Workspace)的變數,可鍵入who:
who
Your variables are:
testfile x
這些是由使用者定義的變數。若要知道這些變數的具體資料,可鍵入:
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 array
Grand total is 20 elements using 160 bytes
使用clear可以刪除工做空間的變數:
clear A
A
??? Undefined function or variable 'A'.
另外MATLAB有些永久常數(Permanent constants),儘管在工做空間中看不 到,但使用者可直接取用,好比:
pi
ans = 3.1416
下表即爲MATLAB常用到的永久常數。
小整理:MATLAB的永久常數 i或j:基本虛數單位
eps:系統的浮點(Floating-point)準確度
inf:無限大, 好比1/0 nan或NaN:非數值(Not a number) ,好比0/0
pi:圓周率 p(= 3.1415926...)
realmax:系統所能表示的最大數值
realmin:系統所能表示的最小數值
nargin: 函數的輸入引數個數
nargin: 函數的輸出引數個數
1-二、反覆命令
最簡單的反覆命令是for圈(for-loop),其基本形式爲:
for 變數 = 矩陣;
運算式;
end
當中變數的值會被依次設定爲矩陣的每一行,來運行介於for和end之間的運算式。所以,若無心外狀況,運算式運行的次數會等於矩陣的行數。
舉例來講,下列命令會產生一個長度爲6的調和數列(Harmonic sequence):
x = zeros(1,6); % x是一個16的零矩陣
for i = 1:6,
x(i) = 1/i;
end
在上例中,矩陣x最初是一個16的零矩陣,在for圈中,變數i的值依次是1到6,所以矩陣x的第i個元素的值依次被設爲1/i。咱們可用分數來顯示此數列:
format rat % 使用分數來表示數值
disp(x)
1 1/2 1/3 1/4 1/5 1/6
for圈可以是多層的,下例產生一個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 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)了一個適當大小的矩陣。若不預先配置矩陣,程式仍可運行,但此時MATLAB需要動態地添加(或減少)矩陣的大小,於是減小程式的運行效率。因此在使用一個矩陣時,若能在事前知道其大小,則最好先使用zeros或ones等命令來預先配置所需的記憶體(即矩陣)大小。
在下例中,for圈列出先前產生的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
也就是說,僅僅要條件示成立,運算式就會一再被運行。好比先前產生調和數列的樣例,咱們可用while圈改寫例如如下:
x = zeros(1,6); % x是一個16的零矩陣
i = 1;
while i <= 6,
x(i) = 1/i;
i = i+1;
end
format short
1-三、邏輯命令
最簡單的邏輯命令是if, ..., end,其基本形式爲:
if 條件式;
運算式;
end
if rand(1,1) > 0.5,
disp('Given random number is greater than 0.5.');
end
Given random number is greater than 0.5.
1-四、集合多個命令於一個M檔案
若要一次運行大量的MATLAB命令,可將這些命令存放於一個副檔名爲m的檔案,並在 MATLAB提示號下鍵入此檔案的主檔名就能夠。此種包括MATLAB命令的檔案都以m爲副檔名,所以通稱M檔案(M-files)。好比一個名爲test.m的M檔案,包括一連串的MATLAB命令,那麼僅僅要直接鍵入test,就能夠運行其所包括的命令:
pwd % 顯示現在的文件夾
ans =
D:\MATLAB5\bin
cd c:\data\mlbook % 進入test.m所在的文件夾
type test.m % 顯示test.m的內容
% 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 ---> i^3 = %d\n', i, i^3);
end
fprintf('End of test.m!\n');
test % 運行test.m
Start of test.m!
i = 1 ---> i^3 = 1
i = 2 ---> i^3 = 8
i = 3 ---> i^3 = 27
End of test.m!
小提示:第一註解行(H1 help line) test.m的前兩行是註解,可以使程式易於瞭解與管理。特別要說明的是,第一註解行通常用來簡短說明此M檔案的功能,以便lookfor能以keyword比對的方式來找出此M檔案。舉例來講,test.m的第一註解行包括test這個字,所以假設鍵入lookfor test,MATLAB就能夠列出所有在第一註解行包括test的M檔案,於是test.m也會被列名在內。
嚴格來講,M檔案可再細分爲命令集(Scripts)及函數(Functions)。前述的test.m即爲命令集,其效用和將命令逐一輸入全然同樣,所以若在命令集可以直接使用工做空間的變數,而且在命令集中設定的變數,也都在工做空間中看獲得。函數則需要用到輸入引數(Input arguments)和輸出引數(Output arguments)來傳遞資訊,這就像是C語言的函數,或是FORTRAN語言的副程序(Subroutines)。舉例來講,若要計算一個正整數的階乘 (Factorial),咱們可以寫一個例如如下的MATLAB函數並將之存檔於fact.m:
function output = fact(n)
% FACT Calculate factorial of a given positive integer.
output = 1;
for i = 1:n,
output = output*i;
end
當中fact是函數名,n是輸入引數,output是輸出引數,而i則是此函數用到的臨時變數。要使用此函數,直接鍵入函數名及適當輸入引數值就能夠:
y = fact(5)
y = 120
(固然,在運行fact以前,你必須先進入fact.m所在的文件夾。)在運行fact(5)時,
MATLAB會跳入一個下層的臨時工做空間(Temperary workspace),將變數n的值設定爲5,然後進行各項函數的內部運算,所有內部運算所產生的變數(包括輸入引數n、臨時變數i,以及輸出引數output)都存在此臨時工做空間中。運算完成後,MATLAB會將最後輸出引數output的值設定給上層的變數y,並將清除此臨時工做空間及其所含的所有變數。換句話說,在呼叫函數時,你僅僅能經由輸入引數來控制函數的輸入,經由輸出引數來獲得函數的輸出,但所有的臨時變數都會隨着函數的結束而消失,你並沒有法獲得它們的值。
小提示:有關階乘函數 前面(及後面)用到的階乘函數僅僅是純粹用來講明MATLAB的函數觀念。若實際要計算一個正整數n的階乘(即n!)時,可直接寫成prod(1:n),或是直接呼叫gamma函數:gamma(n-1)。
MATLAB的函數也可以是遞式的(Recursive),也就是說,一個函數可以呼叫它自己。
舉例來講,n! = n*(n-1)!,所以前面的階乘函數可以改爲遞式的寫法:
function output = fact(n)
% FACT Calculate factorial of a given positive integerrecursively.
if n == 1, % Terminating condition
output = 1;
return;
end
output = n*fact(n-1);
在寫一個遞函數時,必定要包括結束條件(Terminating condition),不然此函數將會一再呼叫本身,永遠不會中止,直到電腦的記憶體被耗盡爲止。以上例而言,n==1即知足結束條件,此時咱們直接將output設爲1,而再也不呼叫此函數自己。
1-五、搜尋路徑
在前一節中,test.m所在的文件夾是d:\mlbook。假設不先進入這個文件夾,MATLAB就找不到你要運行的M檔案。假設但願MATLAB不論在何處都能運行test.m,那麼就必須將d:\mlbook增長MATLAB的搜尋路徑(Search path)上。要檢視MATLAB的搜尋路徑,鍵入path就能夠:
path
MATLABPATH
d:\matlab5\toolbox\matlab\general
d:\matlab5\toolbox\matlab\ops
d:\matlab5\toolbox\matlab\lang
d:\matlab5\toolbox\matlab\elmat
d:\matlab5\toolbox\matlab\elfun
d:\matlab5\toolbox\matlab\specfun
d:\matlab5\toolbox\matlab\matfun
d:\matlab5\toolbox\matlab\datafun
d:\matlab5\toolbox\matlab\polyfun
d:\matlab5\toolbox\matlab\funfun
d:\matlab5\toolbox\matlab\sparfun
d:\matlab5\toolbox\matlab\graph2d
d:\matlab5\toolbox\matlab\graph3d
d:\matlab5\toolbox\matlab\specgraph
d:\matlab5\toolbox\matlab\graphics
d:\matlab5\toolbox\matlab\uitools
d:\matlab5\toolbox\matlab\strfun
d:\matlab5\toolbox\matlab\iofun
d:\matlab5\toolbox\matlab\timefun
d:\matlab5\toolbox\matlab\datatypes
d:\matlab5\toolbox\matlab\dde
d:\matlab5\toolbox\matlab\demos
d:\matlab5\toolbox\tour
d:\matlab5\toolbox\simulink\simulink
d:\matlab5\toolbox\simulink\blocks
d:\matlab5\toolbox\simulink\simdemos
d:\matlab5\toolbox\simulink\dee
d:\matlab5\toolbox\local
此搜尋路徑會依已安裝的工具箱(Toolboxes)不一樣而有所不一樣。要查詢某一命令是在搜尋路徑的何處,可用which命令:
which expo
d:\matlab5\toolbox\matlab\demos\expo.m
很是顯然c:\data\mlbook並不在MATLAB的搜尋路徑中,所以MATLAB找不到test.m這個M檔案:
which test
c:\data\mlbook\test.m
要將d:\mlbook增長MATLAB的搜尋路徑,仍是使用path命令:
path(path, 'c:\data\mlbook');
此時d:\mlbook已增長MATLAB搜尋路徑(鍵入path試看看),所以MATLAB已經"看"獲得
test.m:
which test
c:\data\mlbook\test.m
現在咱們就可以直接鍵入test,而沒必要先進入test.m所在的文件夾。
小提示:怎樣在其啓動MATLAB時,本身主動設定所需的搜尋路徑? 假設在每一次啓動MATLAB後都要設定所需的搜尋路徑,將是一件很是麻煩的事。有兩種方法,可以使MATLAB啓動後 ,就能夠加載使用者定義的搜尋路徑:
1.MATLAB的預設搜尋路徑是定義在matlabrc.m(在c:\matlab之下,或是其它安裝MATLAB 的主文件夾下),MATLAB每次啓動後,即本身主動運行此檔案。所以你可以直接改動matlabrc.m ,以增長新的文件夾於搜尋路徑之中。
2.MATLAB在運行matlabrc.m時,同一時候也會在預設搜尋路徑中尋找startup.m,若此檔案存在,則運行其所含的命令。所以咱們可將所有在MATLAB啓動時必須運行的命令(包括更改搜尋路徑的命令),放在此檔案中。
每次MATLAB遇到一個命令(好比test)時,其處置程序爲:
1.將test視爲使用者定義的變數。
2.若test不是使用者定義的變數,將其視爲永久常數 。
3.若test不是永久常數,檢查其是否爲眼下工做文件夾下的M檔案。
4.若不是,則由搜尋路徑尋找是否有test.m的檔案。
5.若在搜尋路徑中找不到,則MATLAB會發出嗶嗶聲並印出錯誤訊息。
下面介紹與MATLAB搜尋路徑相關的各項命令。
1-六、資料的儲存與加載
有些計算曠日廢時,那麼咱們一般但願能將計算所得的儲存在檔案中,以便未來可進行其它處理。MATLAB儲存變數的基本命令是save,在不加不論什麼選項(Options)時,save會將變數以二進制(Binary)的方式儲存至副檔名爲mat的檔案,例如如下述:
save:將工做空間的所有變數儲存到名爲matlab.mat的二進制檔案。
save filename:將工做空間的所有變數儲存到名爲filename.mat的二進制檔案。 save filename x y z :將變數x、y、z儲存到名爲filename.mat的二進制檔案。
下面爲使用save命令的一個簡例:
who % 列出工做空間的變數
Your variables are:
B h j y
ans i x z
save test B y % 將變數B與y儲存至test.mat
dir % 列出現在文件夾中的檔案
. 2plotxy.doc fact.m simulink.doc test.m ~$1basic.doc
.. 3plotxyz.doc first.doc temp.doc test.mat
1basic.doc book.dot go.m template.doc testfile.dat
delete test.mat % 刪除test.mat
以二進制的方式儲存變數,一般檔案會比較小,而且在加載時速度較快,但是就沒法用普通的文書軟體(好比pe2或記事本)看到檔案內容。若想看到檔案內容,則必須加上-ascii選項,詳見下述:
save filename x -ascii:將變數x以八位數存到名爲filename的ASCII檔案。
Save filename x -ascii -double:將變數x以十六位數存到名爲filename的ASCII檔案。
還有一個選項是-tab,可將同一列相鄰的數目以定位鍵(Tab)隔開。
小提示:二進制和ASCII檔案的比較 在save命令使用-ascii選項後,會有下列現象:save命令就不會在檔案名稱後加上mat的副檔名。
所以以副檔名mat結尾的檔案通常是MATLAB的二進位資料檔。
若非有特殊需要,咱們應該儘可能以二進制方式儲存資料。
load命令可將檔案加載以取得儲存之變數:
load filename:load會尋找名稱爲filename.mat的檔案,並以二進制格式加載。若找不到filename.mat,則尋找名稱爲filename的檔案,並以ASCII格式加載。load filename-ascii:load會尋找名稱爲filename的檔案,並以ASCII格式加載。
若以ASCII格式加載,則變數名稱即爲檔案名稱(但不包括副檔名)。若以二進制加載,則可保留原有的變數名稱,例如如下例:
clear all; % 清除工做空間中的變數
x = 1:10;
save testfile.dat x -ascii % 將x以ASCII格式存至名爲testfile.dat的檔案
load testfile.dat % 加載testfile.dat
who % 列出工做空間中的變數
Your variables are:
testfile x
注意在上述過程當中,由於是以ASCII格式儲存與加載,因此產生了一個與檔案名稱一樣的變數testfile,此變數的值和原變數x全然一樣。
1-七、結束MATLAB
有三種方法可以結束MATLAB:
1.鍵入exit
2.鍵入quit
3.直接關閉MATLAB的命令視窗(Command window)
2.數值分析
2.1微分
diff函數用以演算一函數的微分項,相關的函數語法有下列4個:
diff(f) 傳回f對預設獨立變數的一次微分值
diff(f,'t') 傳回f對獨立變數t的一次微分值
diff(f,n) 傳回f對預設獨立變數的n次微分值
diff(f,'t',n) 傳回f對獨立變數t的n次微分值
數值微分函數也是用diff,所以這個函數是靠輸入的引數決定是以數值或是符號微分,假設引數爲向量則運行數值微分,假設引數爲符號表示式則運行符號微分。
先定義下列三個方程式,接著再演算其微分項:
>>S1 = '6*x^3-4*x^2+b*x-5';
>>S2 = 'sin(a)';
>>S3 = '(1 - t^3)/(1 + t^4)';
>>diff(S1)
ans=18*x^2-8*x+b
>>diff(S1,2)
ans= 36*x-8
>>diff(S1,'b')
ans= x
>>diff(S2)
ans=
cos(a)
>>diff(S3)
ans=-3*t^2/(1+t^4)-4*(1-t^3)/(1+t^4)^2*t^3
>>simplify(diff(S3))
ans= t^2*(-3+t^4-4*t)/(1+t^4)^2
2.2積分
int函數用以演算一函數的積分項, 這個函數要找出一符號式 F 使得diff(F)=f。假設積
分式的解析式(analytical form, closed form) 不存在的話或是MATLAB沒法找到,則int 傳回原輸入的符號式。相關的函數語法有下列 4個:
int(f) 傳回f對預設獨立變數的積分值
int(f,'t') 傳回f對獨立變數t的積分值
int(f,a,b) 傳回f對預設獨立變數的積分值,積分區間爲[a,b],a和b爲數值式
int(f,'t',a,b) 傳回f對獨立變數t的積分值,積分區間爲[a,b],a和b爲數值式
int(f,'m','n') 傳回f對預設變數的積分值,積分區間爲[m,n],m和n爲符號式
咱們示範幾個樣例:
>>S1 = '6*x^3-4*x^2+b*x-5';
>>S2 = 'sin(a)';
>>S3 = 'sqrt(x)';
>>int(S1)
ans= 3/2*x^4-4/3*x^3+1/2*b*x^2-5*x
>>int(S2)
ans= -cos(a)
>>int(S3)
ans= 2/3*x^(3/2)
>>int(S3,'a','b')
ans= 2/3*b^(3/2)- 2/3*a^(3/2)
>>int(S3,0.5,0.6)
ans= 2/25*15^(1/2)-1/6*2^(1/2)
>>numeric(int(S3,0.5,0.6)) % 使用numeric函數可以計算積分的數值
ans= 0.0741
2.3求解常微分方程式
MATLAB解常微分方程式的語法是dsolve('equation','condition'),當中equation表明常微分方程式即y'=g(x,y),且須以Dy表明一階微分項y' D2y表明二階微分項y'' ,
condition則爲初始條件。
若是有下面三個一階常微分方程式和其初始條件
y'=3x2, y(2)=0.5
y'=2.x.cos(y)2, y(0)=0.25
y'=3y+exp(2x), y(0)=3
相應上述常微分方程式的符號運算式爲:
>>soln_1 = dsolve('Dy =3*x^2','y(2)=0.5')
ans= x^3-7.500000000000000
>>ezplot(soln_1,[2,4]) % 看看這個函數的長相
>>soln_2 = dsolve('Dy =2*x*cos(y)^2','y(0) = pi/4')
ans= atan(x^2+1)
>>soln_3 = dsolve('Dy = 3*y +exp(2*x)',' y(0) = 3')
ans= -exp(2*x)+4*exp(3*x)
2.4非線性方程式的實根
要求任一方程式的根有三步驟:
先定義方程式。要注意必須將方程式安排成 f(x)=0 的形態,好比一方程式爲sin(x)=3,
則該方程式應表示爲f(x)=sin(x)-3。可以 m-file 定義方程式。
代入適當範圍的 x, y(x) 值,將該函數的分佈圖畫出,藉以瞭解該方程式的「長相」。
由圖中決定y(x)在何處附近(x0)與 x 軸相交,以fzero的語法fzero('function',x0)就能夠求出在 x0附近的根,當中 function 是先前已定義的函數名稱。假設從函數分佈圖看出根不只僅一個,則須再代入還有一個在根附近的 x0,再求出下一個根。
下面分別介紹幾數個方程式,來講明怎樣求解它們的根。
例1、方程式爲
sin(x)=0
咱們知道上式的根有 ,求根方式例如如下:
>> r=fzero('sin',3) % 因爲sin(x)是內建函數,其名稱爲sin,所以無須定義它,選擇 x=3 附近求根
r=3.1416
>> r=fzero('sin',6) % 選擇 x=6 附近求根
r = 6.2832
例2、方程式爲MATLAB 內建函數 humps,咱們不須要知道這個方程式的形態爲什麼,只是咱們可以將它劃出來,再找出根的位置。求根方式例如如下:
>> x=linspace(-2,3);
>> y=humps(x);
>> plot(x,y), grid % 由圖中可看出在0和1附近有二個根
>> r=fzero('humps',1.2)
r = 1.2995
例3、方程式爲y=x.^3-2*x-5
這個方程式事實上是個多項式,咱們說明除了用 roots 函數找出它的根外,也可以用這節介紹的方法求根,注意兩者的解法及結果有所不一樣。求根方式例如如下:
% m-function, f_1.m
function y=f_1(x) % 定義 f_1.m 函數
y=x.^3-2*x-5;
>> x=linspace(-2,3);
>> y=f_1(x);
>> plot(x,y), grid % 由圖中可看出在2和-1附近有二個根
>> r=fzero('f_1',2); % 決定在2附近的根
r = 2.0946
>> p=[1 0 -2 -5]
>> r=roots(p) % 以求解多項式根方式驗證
r =
2.0946
-1.0473 + 1.1359i
-1.0473 - 1.1359i
2.5線性代數方程(組)求解
咱們習慣將上組方程式以矩陣方式表演示樣例如如下
AX=B
當中 A 爲等式左邊各方程式的係數項,X 爲欲求解的未知項,B 表明等式右邊之已知項
要解上述的聯立方程式,咱們可以利用矩陣左除 \ 作運算,便是 X=A\B。
假設將原方程式改寫成 XA=B
當中 A 爲等式左邊各方程式的係數項,X 爲欲求解的未知項,B 表明等式右邊之已知項
注意上式的 X, B 已改寫成列向量,A事實上是前一個方程式中 A 的轉置矩陣。上式的 X 可以矩陣右除 / 求解,便是 X=B/A。
若以反矩陣運算求解 AX=B, X=B,便是 X=inv(A)*B,或是改寫成 XA=B, X=B,便是X=B*inv(A)。
咱們直接以如下的樣例來講明這三個運算的使用方法:
>> A=[3 2-1; -1 3 2; 1 -1 -1]; % 將等式的左邊係數鍵入
>> B=[10 5 -1]'; % 將等式右邊之已知項鍵入,B要作轉置
>> X=A\B % 先以左除運算求解
X = % 注意X爲行向量
-2
5
6
>> C=A*X % 驗算解是否正確
C = % C=B
10
5
-1
>> A=A'; % 將A先作轉置
>> B=[10 5 -1];
>> X=B/A % 以右除運算求解的結果亦同
X = % 注意X爲列向量
10 5 -1
>> X=B*inv(A); % 也可以反矩陣運算求解
3.基本xy平面畫圖命令
MATLAB不但擅長於矩陣相關的數值運算,也適合用在各類科學目視表示(Scientificvisualization)。
本節將介紹MATLAB基本xy平面及xyz空間的各項畫圖命令,包括一維曲線及二維曲面的繪製、列印及存檔。
plot是繪製一維曲線的基本函數,但在使用此函數以前,咱們需先定義曲線上每一點的x 及y座標。
下例可畫出一條正弦曲線:
close all;
x=linspace(0, 2*pi, 100); % 100個點的x座標
y=sin(x); % 相應的y座標
plot(x,y);
小整理:MATLAB基本畫圖函數
plot: x軸和y軸均爲線性刻度(Linear scale)
loglog: x軸和y軸均爲對數刻度(Logarithmic scale)
semilogx: x軸爲對數刻度,y軸爲線性刻度
semilogy: x軸爲線性刻度,y軸爲對數刻度
若要畫出多條曲線,僅僅需將座標對依次放入plot函數就能夠:
plot(x, sin(x), x, cos(x));
若要改變顏色,在座標對後面加上相關字串就能夠:
plot(x, sin(x), 'c', x, cos(x), 'g');
若要同一時候改變顏色及圖線型態(Line style),也是在座標對後面加上相關字串就能夠:
plot(x, sin(x), 'co', x, cos(x), 'g*');
小整理:plot畫圖函數的叄數 字元 顏色字元 圖線型態y 黃色. 點k 黑色o 圓w 白色x xb 藍色+ +g 綠色* *r 紅色- 實線c 亮青色: 點線m 錳紫色-. 點虛線-- 虛線
圖形完畢後,咱們可用axis([xmin,xmax,ymin,ymax])函數來調整圖軸的範圍:
axis([0, 6, -1.2, 1.2]);
此外,MATLAB也可對圖形加上各類註解與處理:
xlabel('Input Value'); % x軸註解
ylabel('Function Value'); % y軸註解
title('Two Trigonometric Functions'); % 圖形標題
legend('y = sin(x)','y = cos(x)'); % 圖形註解
grid on; % 顯示格線
咱們可用subplot來同一時候畫出數個小圖形於同一個視窗之中:
subplot(2,2,1); plot(x, sin(x));
subplot(2,2,2); plot(x, cos(x));
subplot(2,2,3); plot(x, sinh(x));
subplot(2,2,4); plot(x, cosh(x));
MATLAB還有其它各類二維畫圖函數,以適合不一樣的應用,詳見下表。
小整理:其它各類二維畫圖函數
bar 長條圖
errorbar 圖形加上偏差範圍
fplot 較精確的函數圖形
polar 極座標圖
hist 累計圖
rose 極座標累計圖
stairs 階梯圖
stem 針狀圖
fill 實心圖
feather 羽毛圖
compass 羅盤圖
quiver 向量場圖
下面咱們針對每個函數舉例。
當資料點數量很少時,長條圖是很是適合的表示方式:
close all; % 關閉所有的圖形視窗
x=1:10;
y=rand(size(x));
bar(x,y);
假設已知資料的偏差量,就可用errorbar來表示。下例以單位標準差來作資的偏差量:
x = linspace(0,2*pi,30);
y = sin(x);
e = std(y)*ones(size(x));
errorbar(x,y,e)
對於變化劇烈的函數,可用fplot來進行較精確的畫圖,會對劇烈變化處進行較密集的取樣,例如如下例:
fplot('sin(1/x)', [0.02 0.2]); % [0.02 0.2]是畫圖範圍
若要產生極座標圖形,可用polar:
theta=linspace(0, 2*pi);
r=cos(4*theta);
polar(theta, r);
對於大量的資料,咱們可用hist來顯示資料的分 狀況和統計特性。如下幾個命令可用來驗證randn產生的高斯亂數分 :
x=randn(5000, 1); % 產生5000個 m=0,s=1 的高斯亂數
hist(x,20); % 20表明長條的個數
rose和hist很是接近,僅僅只是是將資料大小視爲角度,資料個數視爲距離,並用極座標繪製
表示:
x=randn(1000, 1);
rose(x);
stairs可畫出階梯圖:
x=linspace(0,10,50);
y=sin(x).*exp(-x/3);
stairs(x,y);
stems可產生針狀圖,常被用來繪製數位訊號:
x=linspace(0,10,50);
y=sin(x).*exp(-x/3);
stem(x,y);
stairs將資料點視爲多邊行頂點,並將此多邊行塗上顏色:
x=linspace(0,10,50);
y=sin(x).*exp(-x/3);
fill(x,y,'b'); % 'b'爲藍色
feather將每一個資料點視複數,並以箭號畫出:
theta=linspace(0, 2*pi, 20);
z = cos(theta)+i*sin(theta);
feather(z);
compass和feather很是接近,僅僅是每個箭號的起點都在圓點:
theta=linspace(0, 2*pi, 20);
z = cos(theta)+i*sin(theta);
compass(z);
4.基本XYZ立體畫圖命令
在科學目視表示(Scientific visualization)中,三度空間的立體圖是一個很重要的技巧。本章將介紹MATLAB基本XYZ三度空間的各項畫圖命令。
mesh和plot是三度空間立體畫圖的基本命令,mesh可畫出立體網狀圖,plot則可畫出立體曲面圖,二者產生的圖形都會依高度而有不一樣顏色。
下列命令可畫出由函數<圖片>造成的立體網狀圖:
x=linspace(-2, 2, 25); % 在x軸上取25點
y=linspace(-2, 2, 25); % 在y軸上取25點
[xx,yy]=meshgrid(x, y); % xx和yy都是21x21的矩陣
zz=xx.*exp(-xx.^2-yy.^2); % 計算函數值,zz也是21x21的矩陣
mesh(xx, yy, zz); % 畫出立體網狀圖
surf和mesh的使用方法相似:
x=linspace(-2, 2, 25); % 在x軸上取25點
y=linspace(-2, 2, 25); % 在y軸上取25點
[xx,yy]=meshgrid(x, y); % xx和yy都是21x21的矩陣
zz=xx.*exp(-xx.^2-yy.^2); % 計算函數值,zz也是21x21的矩陣
surf(xx, yy, zz); % 畫出立體曲面圖
爲了方便測試立體畫圖,MATLAB提供了一個peaks函數,可產生一個凹凸有致的曲面,包括了三個局部極大點及三個局部極小點
要畫出此函數的最快方法便是直接鍵入peaks:
peaks
z = 3*(1-x).^2.*exp(-(x.^2) - (y+1).^2) ...
- 10*(x/5 - x.^3 - y.^5).*exp(-x.^2-y.^2) ...
- 1/3*exp(-(x+1).^2 - y.^2)
咱們亦可對peaks函數取點,再以各類不一樣方法進行畫圖。
meshz可將曲面加上圍裙:
[x,y,z]=peaks;
meshz(x,y,z);
axis([-inf inf -inf inf -inf inf]);
waterfall可在x方向或y方向產生水流效果:
[x,y,z]=peaks;
waterfall(x,y,z);
axis([-inf inf -inf inf -inf inf]);
下列命令產生在y方向的水流效果:
[x,y,z]=peaks;
waterfall(x',y',z');
axis([-inf inf -inf inf -inf inf]);
meshc同一時候畫出網狀圖與等高線:
[x,y,z]=peaks;
meshc(x,y,z);
axis([-inf inf -inf inf -inf inf]);
surfc同一時候畫出曲面圖與等高線:
[x,y,z]=peaks;
surfc(x,y,z);
axis([-inf inf -inf inf -inf inf]);
contour3畫出曲面在三度空間中的等高線:
contour3(peaks, 20);
axis([-inf inf -inf inf -inf inf]);
contour畫出曲面等高線在XY平面的投影:
contour(peaks, 20);
plot3可畫出三度空間中的曲線:
t=linspace(0,20*pi, 501);
plot3(t.*sin(t), t.*cos(t), t);
亦可同一時候畫出兩條三度空間中的曲線:
t=linspace(0, 10*pi, 501);
plot3(t.*sin(t), t.*cos(t), t, t.*sin(t), t.*cos(t), -t);
4.三維網圖的高級處理
1. 消隱處理
例.比較網圖消隱先後的圖形
z=peaks(50);
subplot(2,1,1);
mesh(z);
title('消隱前的網圖')
hidden off
subplot(2,1,2)
mesh(z);
title('消隱後的網圖')
hidden on
colormap([0 0 1])
2. 裁剪處理
利用不定數NaN的特色,可以對網圖進行裁剪處理
例.圖形裁剪處理
P=peaks(30);
subplot(2,1,1);
mesh(P);
title('裁剪前的網圖')
subplot(2,1,2);
P(20:23,9:15)=NaN*ones(4,7); %剪孔
meshz(P) %垂簾網線圖
title('裁剪後的網圖')
colormap([0 0 1]) %藍色網線
注意裁剪時矩陣的相應關係,即大小必定要一樣.
3. 三維旋轉體的繪製
爲了一些專業用戶可以更方便地繪製出三維旋轉體,MATLAB專門提供了2個函數:柱面函數cylinder和球面函數sphere
(1) 柱面圖
柱面圖繪製由函數cylinder實現.
[X,Y,Z]=cylinder(R,N) 此函數以母線向量R生成單位柱面.母線向量R是在單位高度裏等分刻度上定義的半徑向量.N爲旋轉圓周上的分格線的條數.可以用surf(X,Y,Z)來表示此柱面.
[X,Y,Z]=cylinder(R)或[X,Y,Z]=cylinder此形式爲默認N=20且R=[1 1]
例.柱面函數演示舉例
x=0:pi/20:pi*3;
r=5+cos(x);
[a,b,c]=cylinder(r,30);
mesh(a,b,c)
例.旋轉柱面圖.
r=abs(exp(-0.25*t).*sin(t));
t=0:pi/12:3*pi;
r=abs(exp(-0.25*t).*sin(t));
[X,Y,Z]=cylinder(r,30);
mesh(X,Y,Z)
colormap([1 0 0])
(2).球面圖
球面圖繪製由函數sphere來實現
[X,Y,Z]=sphere(N) 此函數生成3個(N+1)*(N+1)的矩陣,利用函數 surf(X,Y,Z) 可產生單位球面.
[X,Y,Z]=sphere 此形式使用了默認值N=20.
Sphere(N) 僅僅是繪製了球面圖而不返回不論什麼值.
例.繪製地球表面的氣溫分佈示意圖.
[a,b,c]=sphere(40);
t=abs(c);
surf(a,b,c,t);
axis('equal') %此兩句控制座標軸的大小一樣.
axis('square')
colormap('hot')
http://www.5678520.com/kaiwangdian/130.html
http://www.5678520.com/kaiwangdian/129.html
http://www.5678520.com/kaiwangdian/128.html
http://www.5678520.com/kaiwangdian/127.html
http://www.5678520.com/kaiwangdian/126.html
http://www.lianzhiwei.com/News/389/20122116.html
http://www.lianzhiwei.com/News/389/20122115.html
http://www.lianzhiwei.com/News/389/20122114.html