December 24, 2004

精通Matlab 6 第二章 中譯

基本特色

執行MATLAB會在你的電腦螢幕上產生一個或更多個的視窗。這些視窗中其中有一個標題是MATLAB,它被稱作是MATLAB desktop。此視窗是MATLAB中最主要的圖形使用者介面。在MATLAB視窗中,有一個視窗稱作是Command windows。這裡是你和MATLAB互動的主要地方。Prompt >>在Command window中顯示,並且當Command window在運作時,在prompt的右方會有一個閃爍的指標出現。這個指標和MATLAB prompt代表MATLAB正在等待執行數學的運算。

2.1 簡易數學

就如同計算機一般,MATLAB可以作基本的數學運算。考慮以下簡單的例子:瑪莉到辦公室文具用品店以買了4個橡皮擦,每個25分;6個記事本,每個52分;2個膠帶,每個99分。請問瑪莉買了幾個東西且花了多少錢?用計算機來解這個問題,你會輸入

4+6+2=12 items
4*25+6*52+2*99=610 cents

在MATLAB裡,這個問題可以用好幾個方法來解。第一個,可以用上頭所說的使用計算機的方式來解:
>> 4+6+2
ans =
12
>> 4*25+6*52+2*99
ans =
610

注意到MATLAB並不在乎空格space的大小,且乘法的優先權高於加法。再注意到MATLAB在二次運算都稱結果為ans,是answer的簡稱。

解決上述問題的另一個方法是將資訊儲存在MATLAB variables裡:

「略」

在此我們建立了三個MATLAB變數,eraser, pads和tape來儲存每件物品的個數。在輸入每行敘述之後,除了tape的那行之外,MATLAB都顯示了結果。在行末的分號告訴MATLAB計算這一行但不要顯示其結果。最後,我們告訴MATLAB將購買的物品數叫做是items而全部所需付出的金錢為cost。在每一個步驟中,MATLAB記憶了過去的資訊。因為MATLAB記憶了這些事,讓我們求每件物品的平均花費為:

>> average_cost = cost/items
average_cost =
50.833

因為 average cost是二個字,而MATLAB中的變數必須是一個字,故使用底線來建立一個新變數average_cost。

除了加法和乘法之外,MATLAB提供了以下的基本算術運算子:
運算子 符號 例子
加法 + 3 + 22
減法 - 54.4 – 16.5
乘法 * 3.14 * 6
除法 / 19.54 /7 或719.54
次方 ^ 2^8

這些運算在一已知表示式中的子的計算次序為一般的優先次序法則,我們統整如下:

式子被由左到右地計算,其中次方(指數)有最高的優先次序,接著是乘法和除法,它們有相同的優先次序,再緊接著是加法和減法,它們也有相同的優先次序。而括弧可以被用來改變這些順序,且以上的法則可以被套用到一堆的括弧中,此時優先次序則由最內的括弧到最外的括弧。

2.2 MATLAB的workspace (工作區)

當你在Command window中工作時,MATLAB會記憶你所輸入的每行指令和你建立的每個變數的值。這些指令和變數是常駐於MATLAB workspace或Base workspace中,並且只要你需要隨時都可以被取用。舉例說明,為了檢查tape變數的值,你所需要做的就是在提示符號之後輸入它的名字來詢問MATLAB:

>>tape
tape =
2
如果你無法記住變數的名字,你可以輸入MATLAB指令 who來要求MATLAB列出它所知道的變數名稱:

[略]

注意到MATLAB並不會告訴你變數的值;它僅僅給予你它們的名稱。若要求變數的值,你必須在MATLAB提示符號之後輸入變數名稱。

要回復前幾步的指令,MATLAB使用鍵盤上的方向箭頭(Cursor)鍵。例如按↑鍵一次,則叫回最近一次在提示符號之後的指令。重覆按下↑鍵則可回到更前頭的指令,每多按一次則回復到更前一步的指令。相似地,按下↓則捲動到後一項指令。按下→或←鍵則在MATLAB提示符號之後的指令上移動一格,因此也允許這項指令被編輯,這樣的方式就好像你在使用文字處理軟體編輯文字一樣。其它標準的編輯按鍵諸如Delete或是Backspace, Home和End則和一般情形無異。Tab鍵對於讓變數名稱變完整非常有用。一旦一項捲動過的指令是可行的,則無論方向箭頭在command window的何處,按下Return鍵會告訴MATLAB要執行指令了。最後,或許也是最有用的Escape鍵可以消去目前在提示符號上的指令。對於你們之中熟悉EMACS編輯器的那些人,MATLAB也接受一般EMACS編輯控制字元序列,例如Control-U來消除目前的指令。

2.3 關於變數
如同其它的程式語言,MATLAB對於變數也有其規定。之前已經注意到變數名稱必須是一個不包含空格的字。更精確地說,MATLAB變數命名原則如下:
變數命名原則 註解和範例
變數名稱是case-sensitive Cost, cost, CoSt和COST是完全不一樣的MATLAB變數
變數名稱可以包含至多31個字元。任何字元只要超過第31個則會被忽略 Howaboutthisvariablename
變數名稱必須始於英文字母,緊隨著任何數目的字母、數字或底線。標點符號字元不被允許因為在MATLAB中,它們大多有特殊定義 How_about_this_variable_nameX51483a_b_c_d_e

對於以上的命名原則有一些特例。MATLAB有一些名字是不能用來當作變數的。這些名字形成了MATLAB的keyword(關鍵字)或是reserved word list(保留字列表)。
保留字列表
For end if while function return elseif case otherwise switch continue else try catch global persistent break

如果你將保留字當作是變數的話,MATLAB會呈報錯誤。不過,你可以使用相似於保留字的字,比如將一個字母或數個字母大寫。
此外,就如同你的計算機中儲存了像 這種常數,MATLAB也有一些特殊的變數:

特殊變數 描述
ans 結果的預設變數名稱
beep 使電腦發出嗶嗶聲
pi 圓周率
eps 使得加上1會大於1的最小數目
inf 代表無窮,例如1/0
NaN (or)nan 代表 Not-a-Number,例如0/0
i (or) j 代表虛數
nargin 函式的輸入引數個數
nargout 函式的輸出引數個數
realmin 最小可用的正實數
realmax 最大可用的正實數
bitmax 最大可用的正整數
varargin
vararout

如果你重覆使用一個像在之前例子中tape的變數,或者是指定一個值到以上所說的特殊變數,則它之前的值會被覆寫且遺失。不過,任何其它的計算式則不會改變先前原有的值。考慮以下的例子:
>>erasers=4;
>>pads=6;
>>tape=2;
>>items=erasers+pads+tape
items =
12
>>erasers=6
erasers =
6
>>items
items =
12

在此,再次使用第一個範例,我們求出Mary購買的物品件數。然後,我們將橡皮擦erasers的數目改變為6,覆寫了它先前的值4。這麼做之後,items的值還是沒變。不像一般的試算表程式,MATLAB並不會根據erasers的新值重新計算items的值。每當MATLAB計算時,它使用的變數值是它在指令執行的那個時點所知的值。在上例中,如果你希望重新計算item的數目、總花費和平均花費,則需要重新叫用適當的MATLAB指令並且要求MATLAB再次計算它們。

上述的特殊變數也遵守此原則,除了特殊變數的特定值是可以被復原的。當你啟動MATLAB,特殊變數就具有預設值了;當你改變它們的值,原有的特定值會遺失。要恢復它們的預設值,你所需要做的就是clear覆寫的值。舉例來說:
>> pi
ans =
3.1416
>> pi=1.23e-4
pi =
1.2300e-004
>> clear pi
>> pi
ans =
3.1416

這說明了pi 具有特定值.1416精確到第五位小數點,它被1.23e-4這個值覆寫,然後,在使用clear來清除之後,它又回復了其原有預設值。

2.4 註解、標點符號和中斷執行

如同我們之前所見到的,在指令之後加上一個分號會禁止印出計算好的結果。這個特性在抑制中間計算的結果時特別有用。舉例來說:

>>erasers
erasers =
6
>>items = erasers+pads+tape;
>>cost = erasers*25+pads*52+tape*99;
>>average_cost=cost/items
average_cost=
47.143
顯示出當瑪莉購買了6個eraser而非原來的4個時,每個item的平均花費(average_cost)。中間運算的結果值items和cost並沒有被印出來,因為在定義它們的指令之後有加上分號。

除了分號之外,MATLAB還使用了其它的標點符號。在百分比符號(%)之後的所有文字都會被認為是註解,例如:

>> tape=2 % number of rolls of tapes purchased

變數tape的值被設為2,MATLAB忽略了百分比符號之後的文字。

數個指令可以被放置於同一行如果它們由逗號或分號分隔,例如:
>> erasers=6,pads=6;tape=2
erasers =
6
tape =
2

逗號告訴MATLAB要顯示出結果;分號則抑制MATLAB顯示結果。

有時表示式或指令可能太長,以致於必須寫到另外一行以方便表示。在MATLAB中,連續的陳述式以三個連續的英文句點來表示,例如:

>> average_cost = cost / items %command as done earlier
average_cost =
47.143

>> average_cost = cost / … %command as done earlier
items
average_cost =
47.143

>> average_cost = cost … %command as done earlier
/items
average_cost =
47.143

>> average_cost = cost /it … %command as done earlier
ems
??? average_cost =cost / items
Missing operator, comma, or semi-colon

或是出現
??? ems
|
Error: Missing operator, comma, or semicolon.
(在此,不同版本的錯誤訊息可能不同)

如上所示,如果連續的三個句號出現在變數名稱和數學運算子之間的話,陳述示是有作用的,但是三個句號不能出現在變數名稱的中間。也就是說,變數名稱不能被分成二行。此外,因為註解會被忽略,所以它們也不能是連續的,例如:

>> % Comments cannot be continued...
>> either
??? Undefined function or variable 'either'.

在這個例子當中,在註解中的 … 是註解的一部份而不會由MATLAB來加以處理。
最後,MATLAB的處理可以藉由按下Control-C(同時按下Ctrl和C鍵)在任何時候被中斷。

2.5複數 COMPLEX NUMBERS

MATLAB最強大的特性之一就是:它不需要特別的處理就能加以運算複數。
複數在MATLB中以數種方式構成。舉例來說明複數:

>> c1=1-2i %附加的 i 表示虛數
c1 =
1.0000 - 2.0000i
>> c1=1-2j %j 也是一樣代表虛數
c1 =
1.0000 - 2.0000i
>> c2=3*(2-sqrt(-1)*3)
c2 =
6.0000 - 9.0000i

>> c3=sqrt(-2)
c3 =
0 + 1.4142i
>> c4=6+sin(.5)*i
c4 =
6.0000 + 0.4794i
>> c5=6+sin(.5)*j
c5 =
6.0000 + 0.4794i

在最後的二個例子中,MATLAB的預設值i=j= 被用來構成虛部。在此例中,乘i或j需要有乘號,因為在MATLAB中sin(.5) i或是in(.5) j是沒有意義的。以上頭最前二個例子來說明,在等號右方的數值部份以字元i或j來終止才有用,而在等號右方的表示式以字元i或j來終止就沒有作用了。

一些程式語言需要對複數作特殊的處理。在MATLAB中,並不需要特殊的處理。複數上的數學運算已經和實數一樣了:

>> c6=(c1+c2)/c3 %利用上方例子的數據
c6 =
-7.7782 - 4.9497i
>> c6r=real(c6)
c6r =
-7.7782
>> c6i=imag(c6)
c6i =
-4.9497
>> check_it_out = i^2 %sqrt(-1) 的平方必須是 -1!
check_it_out =
-1

一般來說,複數上的運算結果應該還是會是複數。不過從上頭的最後一個例子可以看出:MATLAB聰明得可以捨去結果中為零的虛部。此外,上頭也說明了函式real和imag可以分別取出複數的實部和虛部。

我們考慮以Euler (聽起來像oiler)identity 來作為複數的最後一個算術例,Euler identity將複數polar form和rectangle form = a+bj的關係建立,其中polar form的參數有大小強度M和角度 ,而給定的角度的型式是 。其中它們的關係為 , , , 。

在MATLAB裡,極座標與直角座標的轉換是利用real, imag, abs 和angle函式來達成。

>> c1
c1 =
1.0000 - 2.0000i
>> mag_c1=abs(c1) %magnitude(強度大小)
mag_c1 =
2.2361
>> angle_c1=angle(c1) %angle in radians(以弳度表示)
angle_c1 =
-1.1071
>> deg_c1=angle_c1*180 / pi %angle in degrees(以角度表示)
deg_c1 =
-63.4349
>> real_c1=real(c1) %實部
real_c1 =
1
>> imag_c1=imag(c1) %虛部
imag_c1 =
-2

MATLAB函式abs根據你給它的資料是什麼,會計算出複數強度的大小或是實數的絕對值。同樣的,函式angle會以弳度為單位來計算出複數的角度。MATLAB並不使用角度來作為三角運算的單位。

2.6 浮點算術運算
幾乎所有在MATLAB裡的數值都是以雙精度表示,在內部則是以二元(以二為底)表示法。二元表示法是電腦最常用的表示法,對於共同數值處理也是最自然的型式。這種表示法使得不是所有的數字都能被精確地被表示,它們能表示的值有限。且對於加法來說,能表示的值被認為更有限。

最大正數可以表示如下:

>> format long %告訴MATLAB顯示更大的精度
>> realmax
ans =
1.797693134862316e+308

最小正數可以表示如下:

>> realmin
ans =
2.225073858507201e-308

加1之後會產生大於手的最小數字以雙精度表示是:
>> eps
ans =
2.220446049250313e-016

有限精度限制的結果有時會有點怪。舉例來說,加法並非精確的累加。
>> 0.42-0.5+0.08
ans =
-1.387778780781446e-017

>> 0.08-0.5+0.42
ans =
0

>> 0.08+0.42-0.5
ans =
0

以上三個例子的結果都應該為0,但是它們都不是。在每個例子中所執行的算術運算都是由左至右。發生此種情形的原因是因為並非所有的數字都用雙精度來表示。事實上,只冇05有精確的表示。當數字不能精準地被表示,它們會儘可能近似地較精準-導致計算結果中不可避免的誤差。最重要的是,這些誤差非常小或在現今電腦中不會被用到。實際上,這些雙精度計算問題大都在MATLAB計算二個值是否相等時發生。顯然地,以MATLAB計算的話0.42-0.5+0.08並不等於0.08-0.5+0.42,即使用我們的大腦來計算,我們知道此二式確實相等。

有限精度算術運算的第二個影響在函式的估計時會顯示。除了不總是能夠精準地表示出函式的引數之外,大多數的函式本身也不能精確地被表示,舉例來說,
>> sin(0)
ans =
0

>> sin(pi)
ans =
1.224646799147353e-016

在此二個結果都應該是0,不過 卻不是。注意,有趣的是在此的誤差和之前例子的誤差都小於eps。

最後,MATLAB也使用雙精度浮點數來表示整數。用這種表示法,所有的整數直到上限都可以被精確地表示。上限值為:

>> bitmax
ans =
9.007199254740991e+015

這個值也就是 。


2.7 數學函式
下表中列出了MATLAB支援的一般函式。這些函式大多數都和它們的數學寫法相同:

>> x=sqrt(2)/2
x =
0.7071

>> y=asin(x)
y =
0.7854

>> y_deg=y*180/pi
y_deg =
45.0000

這些指令找到sin函數值為的 的角度。再次注意到MATLAB使用的是弳度。另一個例子如下:

>> y=sqrt(3^2+4^2) %3-4-5直角三角形的邊長關係
y =
5
>> y=rem(23,4) %餘數函式,23/4的餘數為3
y =
3

>> x=2.6, y1=fix(x), y2=floor(x), y3=ceil(x), y4=round(x)
x =
2.6000
y1 =
2
y2 =
2
y3 =
3
y4 =
3

三角函式 函式意義
acos Inverse cosine (反正弦函式)
acosh Inverse hyperbolic cosine
acot Inverse cotangent
acoth Inverse hyperbolic cotangent
acsc Inverse cosecant
acsch Inverse hyperbolic
asec Inverse secant
asech Inverse hyperbolic secant
asin Inverse sine
asinh Inverse hyperbolic sine
atan Inverse tangent
atan2 Four quadrant inverse tangent
atanh Inverse hyperbolic tangent
cos Cosine
cosh Hyperbolic cosine
cot Cotangent
coth Hyperbolic cotangent
csc Cosecant
csch Hyperbolic cosecant
sec Secant
sech Hyperbolic secant
sin Sine
sinh Hyperbolic sine
tan Tangent
tanh Hyperbolic tangent

指數函式 函式描述
^ Power
Exp 指數
Log 自然對數
Log10 以10為底的對數
Log2 以2為底的對數
Pow2
Sqrt 根號開方
Nextpow2 Next higher power of 2

複數函式 函式描述
Abs 絕對值
Angle
Conj 複數共軛
Imag 虛部
Real 實部
Unwrap Unwrap phase angle
Isreal 如果是實數則為真
Cplxpair
Complex 從實部和虛部形成複數

四捨五入和餘數函式 函式描述
Fix Round to zero
Floor Round toward negative infinity
Ceil Round toward positive infinity
Round Round toward nearest integer
Mod Modulus or signed remainder
Rem Remainder after division
sign Signum function

座標轉換函式 函式描述
Cart2sph 苗卡兒座標到球座標
Cartpol Cartesian ot cylindrical or polar
Pol2cart Cylindrical or polar to Cartesian
Sph2cart Spherical to Cartesian

數學理論相關函式 函式描述
Factor Prime factors
Isprime True for prime numbers
Primes Generate list of prime numbers
Gcd 最大公因數
Lcm 最小公倍數
Rat Rational approximation
Rats Rational output
Perms 所有可能的組合
nchoosek N個元素一次取K個的所有組合數

特殊函式 函式描述
Airy Airy function
Besselj Bessel function of the first kind
Bessely Bessel function of the second kind
Besselh Bessel function of the third kind
Besseli Modified Bessel function of the first kind
Besselk Modified Bessel function of the second kind
Beta Beta函式
Betainc Incomplete beta function
Betaln Logarithm of beta function
Ellipj Jacobi elliptic function
Ellipke Complete elliptic integral
Erf Error function
Erfc Complementary error function
Erfcx Scaled complementary error function
Erfinv Inverse error function
Expint Exponential error function
Gamma Gamma函式
Gammainc Incomplete gamma function
Gammaln Logarithm of gamma function
Legendre Associated Legendre function
Cross 向量外積
dot 向量內積


0推薦此文章
Today's Visitors: 2 Total Visitors: 2549
Personal Category: 精通Matlab 6 Topic: 未分類
Previous in This Category: Mastering in Matlab 6 第一章 中譯   Next in This Category: 精通Matlab 6 第三章 中譯
[Trackback URL]

Post A Comment









Yes No



Please input the magic number:

( Prevent the annoy garbage messages )
( What if you cannot see the numbers? )
Please input the magic number

誰來收藏
Loading ...
unlog_NVPO 0