MATLAB函数

第四章 內建函數

函數是針對某特定功能所撰寫的程式,利用其固定的名稱執行所需之任務。函數通常可分為內建函數與自訂函數兩大類。內建函數則又視其公用程度而分一般函數與特定函數。目前我們討論者,以一般函數為原則。茲分別作說明:

4.1數學基本函數

一般函數有三角函數、矩陣函數及統計函數。有些由於解說之需要,在前文中已有述及。但基本上,其歸類有些也甚為模糊的,只是這種分類也沒多大意義。故讀者參考時,可以前後作對照。三角函數是工程上最為常見的函數,下表將其列入。

4.1.1三角函數


由於三角函數牽涉到角度的單位,以往其輸入參數均以弧度為單位,故應用時須先轉換,令pi等於180度,依此比例計算。新版的應用中,則增加以度數為單位輸出與輸入的型式,因此不必再經過轉換的程序。在函數的名稱上,若輸入為度數,則可使用字尾加"d"的型式,如xxxd是,詳情見表4.1。當然是否必須使用不同的度數為指令,則見仁見智。若考慮新舊版的共通性,仍仍以採用轉換之型式為宜。

表4.1三角函數指令表













指令型式說明
sin / sind正弦函數,輸入參數單位為弧度/度數
cos /cosd 餘弦函數,輸入參數單位為弧度/度數
tan /tand 正切函數,輸入參數單位為弧度/度數
cot /cotd 餘切函數,輸入參數單位為弧度/度數
asin / asind 反正弦函數,輸出參數單位為弧度/度數
acos /acosd 反餘弦函數,輸出參數單位為弧度/度數
atan /atand 反正切函數,輸出參數單位為弧度/度數
acot /acotd 反餘切函數,輸出參數單位為弧度/度數
sinh / cosh 超正/餘弦函數
asinh /acosh 反超正/餘弦函數,輸出參數單位為弧度
tanh /coth 超正/餘切函數
atanh /acoth 反超正/餘切函數,輸出參數單位為弧度
atan2 四象限反正切函數,輸出參數單位為弧度


例1. 計算sin(60)之值:

>>sin(60*pi/180)

ans = 0.8660

>>sind(60)

ans = 0.8660



其結果相同。

例2. 計算sin²(60度)+cos²(60度)之值

>>theta=60*pi/180;
>>sin(theta)^2;+cos(theta)^2;
ans = 1

>>sind(60)^2;+cosd(60)^2;
ans = 1


兩者之結果亦相同。

例3. 計算arctan(1)+arccot(1)之值

>>atan(1)+acot(1)
ans = 1.5708

>>atand(1)+acotd(1)
ans = 90


前者之單位為弧度,後者為度數,其實兩者所指的角度是相同的。

表4.1中亦列有超函數之計算,這是在許多工程數學常見到的解,其型式近乎雙曲線函數。其定義如下:

cosh x ={exp(x)+exp(-x)}/2

sinh x ={exp(x)-exp(-x)}/2


若依其定義進行計算,則可利用後節之對數函數配合解決,若直接用超函數表示,則可簡單計算如下:

>>cosh(1)
ans =
1.5431


4.1.2指數與對數函數



有關指數與對數函數之指令則如表4.2所示。這些指令與極座標有關,也與超函數之運算有關。

表4.2 指數與對數與複數函數指令表











指令型式說明
sqrt(x)開方根( )
exp(x)指數函數(ex)
log(x)自然對數( )
log10(x)以10為基底之對數(log10x)
abs(x)(複數之)絕對值
angle(x)複數或極座標之夾角,弧度
real(x)複數之實數部份
imag(x)複數之虛數部份
conj(x)共軛複數
i,j虛數單位,如3+4j,或3+4i


一般數之次方常用"^"表示,如A^5代表A 5。開平方根則是常用的指令,故有特別的操作函數sqrt,例如3的開平方:

>>sqrt(3)
ans = 1.7321


同理負數的開方也可以得到結果,只是會產生複數,以-5之開方為例:

>>sqrt(-5)
ans = 0 + 2.2361i


結果進入虛數的世界,因為得到虛根。所以MATLAB在處理數值時,開方根並不限於正值。
指數方面,因為基底之不同,數學上分為以e 與以10為底;對應於指令方面,分別為log(x)與log10(x)之型式。與對數相應,以e 為底者稱為自然對數,用exp(x)表示。例如e¹其值為:


>>exp(1)
ans =
2.7183


顯然e值就是2.7183。由於定義上,y=e^x 兩邊分取對數,則log(y)=x。故上述結果代入log(y)應可得到x,如:

>>log(2.7183)
ans =
1.0000


所以兩者是相互為用的。在以10為基底的情況下,若要更換為自然對數,則其對數值應乘以log(10) 。以x=10^5為例,兩邊取自然對數後,成為log(x)=5*log(10),則:


>>logx=5*log(10)
logx = 11.5129

>>x=exp(logx)
x =
1.0000e+005


其值與原數相同。注意:結果為以10為底之指數型式,由e後面為其次方值。
指數的型式,其輸入項亦可使用複數,以配合極座標之應用。通常將複數中之實數部份作為橫軸,虛數之值則視為縱軸,如此可以構成二度空間。假設某向量R=3+4j,則:


>>R=3+4j
R = 3.0000 + 4.0000i


由此可以利用計算其絕對值abs(R)、夾角angle(R):

>>abs(R)
ans = 5

>>angle(R)*180/pi
ans = 53.1301


後者之角度已轉換為度數。利用同一複數量R亦可求其實數、虛數及共軛複數:

>>real(R) %實數部份 
ans = 3

>>imag(R) %虛數部份
ans = 4

>>conj(R) %共軛複數
ans = 3.0000 - 4.0000i


根據尤拉公式,虛數之自然對數可以與正、餘弦作轉換,其基本型式為:

eix=cos(x)+ i sin(x)

此時,x之值為弧度值。因此利用這種轉換亦可將自然對數之型式轉換為三函數之關係:例如,設theta=[ 20 60 80]度,則

>>theta=[20 60 80]/180*pi %先轉換為弧度
theta = 0.3491 1.0472 1.3963

>>eix=exp(i*theta)
eix = 0.9397 + 0.3420i 0.5000 + 0.8660i 0.1736 + 0.9848i

>>cos(theta)+i*sin(theta)
ans = 0.9397 + 0.3420i 0.5000 + 0.8660i 0.1736 + 0.9848i


由此可以證明三個不同角度下,其演算結果相同。

就超函數之定義而言,其值與指數間具確定的關係,依照前述之cosh(x)與sinh(x)之定義,兩者相加可以得到如下之如果:


ex=cosh(x)+sinh(x)

>>cosh(1:5)+sinh(1:5)
ans = 2.7183 7.3891 20.0855 54.5982 148.4132

>>exp(1:5)
ans = 2.7183 7.3891 20.0855 54.5982 148.4132



兩者對應之結果一致。

4.1.3元素操作函數


有些數值必須在計算中進行整理,使其符合需求。這些函數包括四捨五入(round)、頂部整數(ceil)、底部整數(fix)、近零整數(floor)等。這些功能如下表:

表4.3元素操作函數






指令型式說明
ceil(x)大於x之最近整數
fix(x)位於接近於零之整數
floor(x)小於x之最近整數
round(x)四捨五入之整數
sign(x)符號值,若x>0為+1;x=0為0;x<0為-1>


假設有一向量A為:


>>A=rand(1,10)*10-5 %利用隨機函數產生-5至+5間之亂數
A =
1.1543 2.9194 4.2181 2.3821 -3.2373 -0.9429
   4.3547 4.1690 -0.8973 3.9365

>>round(A) %進行四捨五入。
ans =
1 3 4 2 -3 -1 4 4 -1 4

>>fix(A) %最接近零之整數
ans =
1 2 4 2 -3 0 4 4 0 3

>>floor(A) %得到最接近A值但低於A值之整數
ans =
1 2 4 2 -4 -1 4 4 -1 3

>>ceil(A) %得到大於A且最接近於A之整數
ans =
2 3 5 3 -3 0 5 5 0 4

>>sign(A) %得到該值之符號值,若該值為零,則為零(本例沒有)
ans =
1 1 1 1 -1 -1 1 1 -1 1

 

4.2矩陣之統計

對於一個矩陣元素值之統計,前面也有部份討論到,諸如sum、mean、max、min等等,都是就元素值之特性進行操作者。其中有些以向量矩陣為主(包括行向量與列向量),但亦可應用於一般矩陣(例如m x n矩陣),將每行之元素進行處理(例如累加),然後將結果置於一個列矩陣中。這些統計型函數如表4.5所示:

表4.5矩陣簡單之統計指令








指令型式說明
median(A)求陣列A之中間值
cumsum(A)求陣列A之累加值
prod(A)求陣列A之乘積值
cumprod(A)求陣列A之累積值
std(A)求陣列A之標準差



4.2.1 MEDIAN中間函數


求矩陣中之中間值數,其與mean函數不同,後者求其平均值,但應用上大致相同。


>>A=magic(5)
A =
17 24 1 8 15
23 5 7 14 16
4 6 13 20 22
10 12 19 21 3
11 18 25 2 9

>>median(A)
ans =
11 12 13 14 15


此為各行之中間值,若要求各列之中間值則可用median(A,2)



>>median(A,2)
ans =
15
14
13
12
11



4.2.2 CUMSUM累加函數


這是矩陣之累加函數,可以就行向各元素逐一累加。若仍以上式A魔術矩陣為例:


>>cumsum(A)
ans =
17 24 1 8 15
40 29 8 22 31
44 35 21 42 53
54 47 40 63 56
65 65 65 65 65


其所得結果為由上往下累加,若要列向累加,則可以在其後加一個dim=2之參數:



>>cumsum(A, 2)
ans =
17 41 42 50 65
23 28 35 49 65
4 10 23 43 65
10 22 41 62 65
11 29 54 56 65


而魔術方陣其各方向累加起來之值均相同,也可由此得證。利用cumsum函數也可以立即產生一個等差級數之陣列,例如等差值5之陣列如下:



>>M=cumsum(0:5:50)
M =
0 5 15 30 50 75 105 140 180 225 275




4.2.3 PROD乘積函數


prod函數與sum之功能大體相同,只是prod是將各元素沿特定陣列方向相乘,得其乘積為答案。例如:



>>prod(1:5)
ans = 120


將上式之魔術方陣A進行行向運算:



>>prod(A)
ans =
172040 155520 43225 94080 142560


顯然,其各行結果不像加法,會有相同的結果。若要列向相乘,也可以設dim=2:



>>prod(A,2)
ans =
48960
180320
137280
143640
89100



4.2.4 CUMPROD累積函數


累積函數cumprod與累加 cumsum亦屬相同的功能,只是以乘法表示而已。其可能應用的則為等比級數之產生。例如:



>>cumprod(1:2:10)
ans =
1 3 15 105 945



4.2.5 STD標準差


一般標準差之計算有兩種方式,其一為分母除以n-1,即不包括平均值之項目,一為分母除以n,
計算上式標準差之函數型式如下:







s=std(X, flag, dim)


其中dim之定義與前面相同外,flag之旗標為0則採用第一式計算標準差,換言之,其分母為n-1;若旗標為1,即採用第二式計算。一般採用的方式以旗標為0者為多,其效果與不標旗標的情況相同。相關例子如下:設M為隨機函數:



>>M=round(rand(4,5)*100)-50
M =
34 33 -20 -20 -12
-48 0 -31 4 36
18 21 -31 -35 35
-12 -7 18 20 9

>>std(M)
ans =
36.1109 18.5000 23.2522 24.5000 23.0217

>>std(M,1)
ans =
31.2730 16.0215 20.1370 21.2176 19.9374


std(M)與std(M,1)之差異在於前者除以n-1,後者除以n。在項目較少的場合,後者之變異數會較小,在統計學上會有顯著的差異。通常標準差常與平均值相配合,其平均值可以對應求得如下:



>>mean(M)
ans =
-2.0000 11.7500 -16.0000 -7.7500 17.0000


若要求得列向的標準差,則可令第三個參數dim=2,得到的是行向量標準差。



>>std(M,0,2)
ans =
28.0357
32.6833
32.2614
14.5017


若需求得整個矩陣之平均值與標準差,則可改用下面方式計算:



>>[mean(M(:)) std(M(:))]
ans =
0.6000 26.0897


由於M矩陣為隨機函數產生,故其平均值應接近於零。

 

4.3矩陣之應用

矩陣之相乘雖然屬於元素與元素間之相乘,但其結果可能因解釋或其實際之意義而不同。前文所述之陣列相乘即是一種例子,但其結果是相對應位置的元素相乘。這種逐元乘法在Matlab中相當普遍,而通常矩陣的加法、減法是與逐元之加法、減法是一致的,其應用比較簡單。至於矩陣的乘法(或未來的除法)其代表的意義自有不同。

範例一:向量之點積(Dot product)


以向量為例,通常一個向量可以使用三個垂向座標來表示,而各座標之單位向量(其量為一,但方向維持座標方向)若以i、j、k表示,則任一向量V、U可以表示如下:

V=v1 i + v2 j + v3 k;U=u1 i + u2 j + u3 k


今若要求這兩向量間之內積(dot product),則V。U之結果應為各向量同方向之分量之積之和,亦即:


V。U=v1.u1+v2.u2+v3.u3

這個結果若能以矩陣表示,設V=[ v1 v2 v3];U=[ u1 u2 u3] ,則

V。U=v1.u1+v2.u2+v3.u3= [ v1 v2 v3][ u1 u2 u3]'

在MATLAB有一個點積指令稱為dot(),其指令型式如下:

dot(U,V)

假設:V=[ 25 4 50]; U=[15 20 5],結果:


>>V.U=[25 4 50]*[15 20 5]'
ans =
705
>> [15 20 5]*[25 4 50]' %即使順序掉換,其結果亦相同。
ans =
705

>> [25 4 50]'*[15 20 5] %但是這樣掉換,其結果完全不同。
ans =
375 500 125
60 80 20
750 1000 250


上述的例子中,使用點積指令亦可得到同樣的結果:


>> dot([25 4 50],[15 20 5])

ans =

705

>> dot([25 4 50],[15 20 5]')

ans =

705



因此,若利用點積指令,也可以求得某特定向量之絕對值如下:


>> r=sqrt(dot([25 4 50],[25 4 50]))

r =

56.0446

>> u=[25 4 50]/r

u =

0.4461 0.0714 0.8921


上述u則為該向量之單位向量了。

範例二:叉積指令(Cross)


兩向量間之叉積在於求得兩向量所構成之垂向面積,而其方向則是垂直於該面積之正方向。例如扭矩等於力與力臂之叉積,而其方向則在於共同垂直於此二向量之方向。叉積之指令型式為:

M=cross(R,F)

設有A向量沿x軸,其向量值為A=1i,以向量陣列表示為A=[1 0 0];B為沿y方向,其向量值B=2j,或B=[0 2 0];則結果向量D應為:

D=AxB (注意此處x號為叉積或cross的意思,不要與矩陣之*混淆),則


>> A=[1 0 0];B=[0 2 0];
>> D=cross(A,B)

D =

0 0 2


其結果在z方向,其值為2。
若兩向量均不在特別之座標上,則結果也可能在空間上,例如:


>> m=cross([1 2 3],[5 4 3])

ans =

-6 12 -6


至於要求得m之絕對值,則有下列方法:


>> r2=sqrt(m*m')

r2 =

14.6969

>> r2=sqrt(dot(m,m))

r2 =

14.6969


兩者均可得到相同的答案,則如何求其單位向量,相信應更容易了。

範例三:九九乘法表


例如:製造一個九九乘法表,其方法可以利用上述的用法迅速得到答案:

>> A=[1:9];Table=A'*A
Table =
1 2 3 4 5 6 7 8 9
2 4 6 8 10 12 14 16 18
3 6 9 12 15 18 21 24 27
4 8 12 16 20 24 28 32 36
5 10 15 20 25 30 35 40 45
6 12 18 24 30 36 42 48 54
7 14 21 28 35 42 49 56 63
8 16 24 32 40 48 56 64 72
9 18 27 36 45 54 63 72 81



同理,試算出一長L=[2 4 6 8 10]m、寬W=[1 2 3 4 5]m所構成之組合及其對應之重量。設密度為10kg/cm^3 。


>> Weight=[2:2:8]'*[1:5]*10

Weight =
20 40 60 80 100
40 80 120 160 200
60 120 180 240 300
80 160 240 320 400


範例四:生產成本分析


某工廠件生產三件主力產品A、B、C三種。生產過程中,其材料、勞力、設備及運輸等之單位產品成本亦自不同。設每樣產品一年分四季生產,其售價亦四季不同,求其每季之生產成本、單項產品之生產成本、單項產品之銷售及利潤等。其相關資料如下:

單位生產成本,P(NT$)




產品名材料設備人力運輸
100226512
5015805
200305020


每季生產量,Q單位




產品名第一季第二季第三季第四季
10020025090
250200150100
80100120150


每季售價格,W(NT$)




產品名第一季第二季第三季第四季
300250250200
400350250150
500600650700


先將三種資料輸入P、Q、W等三個矩陣,其大小均為(3x4):但Q之四項與P之四項並不屬同性質,故即使矩陣之大小配合,也須注意不能隨意相乘。


>>P=[100 22 65 12;50 15 80 5;200 30 50 20];
>>Q=[100 200 250 90;250 200 150 100;80 100 120 150];
>>W=[300 250 250 200; 400 350 250 150;500 600 650 700];


輸入後之值如下:


>>P %單位成本
P =
100 22 65 12
50 15 80 5
200 30 50 20 Q %每季生產量

>>Q =
100 200 250 90
250 200 150 100
80 100 120 150 W %每季之產品價格

>>W =
300 250 250 200
400 350 250 150
500 600 650 700



為求得每季之生產成本,可用C=P'*Q 計算,其大小之型式為(4x4)=(4x3)(3x4)。結果為4x4,其列為材料、設備、人力及運輸之成本,行向為四季。注意前者P用移置功能,主要將其大小轉為符合矩陣之乘法:


>>C=P'*Q
C =
38500 50000 56500 44000
8350 10400 11350 7980
30500 34000 34250 21350
4050 5400 6150 4580



上式C矩陣為四季之成本,若將材料、設備、人力及運輸成本合計,則各季之成本小計可用sum函數計算:


>>Qcost=sum(C)
Qcost =
81400 99800 108250 77910


Qcost為四季之成本,若需要總成本,則需再用一次sum函數:


>>Total_cost=sum(Qcost)
Total_cost =
367360


其次要計算單項產品之成本時,可利用原來之P矩陣。因為其列為產品名稱,行為分項成于,故若列向相加,應可得各項產品之單位成本,其法可利用sum函數,但其第二參數應輸入2,表示以列向(橫向)相加:


>>Prod_unitcost=sum(P,2)
Prod_unitcost =
199
150
300


同樣,對生產量Q而言,由於其行向屬不同季節,若將其合併,應為一年之總生產量,故仍然應用sum函數,但記得其第二參數為2:


>>Prod_Q=sum(Q,2)
>>Prod_Q =
640
700
450


有了單位總生產成本Prod_unitcost及年生產量Prod_Q,即可直接用元素對應元素乘法,求得其總成本。注意此時之操作元乘號前須加點,即.* 。


>>Prod_cost=Prod_unitcost.*Prod_Q
Prod_cost =
127360
105000
135000


Prod_cost 即為年生產總成本。其次要求得年銷售金額,此時因為Q與W矩陣之行向同為季別,故只要使用元素對元素之乘法即可。其四季之銷售量D=Q.*W:


>>D=Q.*W
D =
30000 50000 62500 18000
100000 70000 37500 15000
40000 60000 78000 105000


目前為求得各項產品之銷售金額,故只要每項產品之四季金額相加即可,此時仍使用sum函數,其第二輸入參數仍設定為2:


>>Prod_sale=sum(D,2)
Prod_sale =
160500
222500
283000


Prod_sale為全年三種產品之銷售金額。扣除上項得到之成本Prod_cost,即為利潤Profit:


>>Profit=Prod_sale-Prod_cost
Profit =
33140
117500
148000


綜合判斷,C產品之獲利較高;B產品次之。讀者可就四季所得之利潤進行分析,其結果應更具參考性。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值