MATLAB入門教程

      網友投稿 1104 2025-04-03

      matlab入門教程


      1.matlab的基本知識

      1-1、基本運算與函數

      在MATLAB下進行基本數學運算,只需將運算式直接打入提示號(>>)之後,并按入Enter鍵即可。例如:

      >> (5*2+1.3-0.8)*10/25

      ans =4.2000

      MATLAB會將運算結果直接存入一變數ans,代表MATLAB運算後的答案(Answer)并顯示其數值於螢幕上。

      小提示: ">>"是MATLAB的提示符號(Prompt),但在PC中文視窗系統下,由於編碼方式不同,此提示符號常會消失不見,但這并不會影響到MATLAB的運算結果。

      我們也可將上述運算式的結果設定給另一個變數x:

      x = (5*2+1.3-0.8)*10^2/25

      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代表一個由2、3、4組成的向量

      若對MATLAB函數用法有疑問,可隨時使用help來尋求線上支援(on-line help):helplinspace

      小整理:MATLAB的查詢命令

      help:用來查詢已知命令的用法。例如已知inv是用來計算反矩陣,鍵入help inv即可得知有關inv命令的用法。(鍵入help help則顯示help的用法,請試看看!) lookfor:用來尋找未知的命令。例如要尋找計算反矩陣的命令,可鍵入 lookfor inverse,MATLAB即會列出所有和關鍵字inverse相關的指令。找到所需的命令後 ,即可用help進一步找出其用法。(lookfor事實上是對所有在搜尋路徑下的M檔案進行關鍵字對第一注解行的比對,詳見後敘。)

      將行向量轉置(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-2、重復命令

      最簡單的重復命令是for圈(for-loop),其基本形式為:

      for 變數 = 矩陣;

      運算式;

      end

      其中變數的值會被依次設定為矩陣的每一行,來執行介於for和end之間的運算式。因此,若無意外情況,運算式執行的次數會等於矩陣的行數。

      舉例來說,下列命令會產生一個長度為6的調和數列(Harmonic sequence):

      x = zeros(1,6); % x是一個1*6的零矩陣

      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圈可以是多層的,下例產生一個6*6的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-3、邏輯命令

      最簡單的邏輯命令是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-4、集合多個命令於一個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

      MATLAB入門教程

      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能以關鍵字比對的方式來找出此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-5、搜尋路徑

      在前一節中,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-6、資料的儲存與載入

      有些計算曠日廢時,那麼我們通常希望能將計算所得的儲存在檔案中,以便將來可進行其他處理。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-7、結束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,再求出下一個根。

      以下分別介紹幾數個方程式,來說明如何求解它們的根。

      例一、方程式為

      sin(x)=0

      我們知道上式的根有 ,求根方式如下:

      >> r=fzero('sin',3) % 因為sin(x)是內建函數,其名稱為sin,因此無須定義它,選擇 x=3 附近求根

      r=3.1416

      >> r=fzero('sin',6) % 選擇 x=6 附近求根

      r = 6.2832

      例二、方程式為MATLAB 內建函數 humps,我們不須要知道這個方程式的形態為何,不過我們可以將它劃出來,再找出根的位置。求根方式如下:

      >> x=linspace(-2,3);

      >> y=humps(x);

      >> plot(x,y), grid % 由圖中可看出在0和1附近有二個根

      >> r=fzero('humps',1.2)

      r = 1.2995

      例三、方程式為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')

      MATLAB

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      上一篇:Excel怎么輕松繪制單斜線、雙斜線表頭
      下一篇:怎么自己創建模板(怎么自己制作模板)
      相關文章
      亚洲综合伊人久久大杳蕉| 日韩亚洲翔田千里在线| 久久久久国产成人精品亚洲午夜| 美国毛片亚洲社区在线观看| 亚洲AV无码专区在线电影成人| 亚洲男人天堂2022| 中文字幕乱码亚洲无线三区 | 亚洲熟女一区二区三区| 久久精品国产亚洲Aⅴ蜜臀色欲| 亚洲男人在线无码视频| 国产成人精品亚洲精品| 国产亚洲情侣一区二区无| 丁香五月亚洲综合深深爱| 亚洲精品白浆高清久久久久久| 亚洲精品国产品国语在线| 亚洲A∨无码一区二区三区| 亚洲网站在线观看| 亚洲精品福利网泷泽萝拉| 亚洲欧洲视频在线观看| 亚洲an日韩专区在线| 亚洲综合激情五月丁香六月| 亚洲国产精品ⅴa在线观看| 日韩亚洲翔田千里在线| 亚洲日韩中文字幕日韩在线| 亚洲中文字幕无码永久在线| 亚洲av中文无码乱人伦在线咪咕| 亚洲日本va午夜中文字幕一区| 亚洲黄色在线观看视频| 亚洲一级免费视频| 亚洲成av人片在www鸭子| 亚洲AV成人潮喷综合网| 在线a亚洲v天堂网2019无码| 亚洲成在人线av| 亚洲精品午夜久久久伊人| 77777午夜亚洲| 在线观看国产一区亚洲bd| 中文亚洲成a人片在线观看| 亚洲国产精品一区二区成人片国内 | 亚洲人成网站18禁止| mm1313亚洲国产精品美女| 中文字幕亚洲综合久久男男|