第四章 內建函數
函數是針對某特定功能所撰寫的程式,利用其固定的名稱執行所需之任務。函數通常可分為內建函數與自訂函數兩大類。內建函數則又視其公用程度而分一般函數與特定函數。目前我們討論者,以一般函數為原則。茲分別作說明:
函數是針對某特定功能所撰寫的程式,利用其固定的名稱執行所需之任務。函數通常可分為內建函數與自訂函數兩大類。內建函數則又視其公用程度而分一般函數與特定函數。目前我們討論者,以一般函數為原則。茲分別作說明:
一般函數有三角函數、矩陣函數及統計函數。有些由於解說之需要,在前文中已有述及。但基本上,其歸類有些也甚為模糊的,只是這種分類也沒多大意義。故讀者參考時,可以前後作對照。三角函數是工程上最為常見的函數,下表將其列入。
指令型式 | 說明 |
---|---|
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 | 四象限反正切函數,輸出參數單位為弧度 |
>>sin(60*pi/180)
ans = 0.8660
>>sind(60)
ans = 0.8660
>>theta=60*pi/180;
>>sin(theta)^2;+cos(theta)^2;
ans = 1
>>sind(60)^2;+cosd(60)^2;
ans = 1
>>atan(1)+acot(1)
ans = 1.5708
>>atand(1)+acotd(1)
ans = 90
cosh x ={exp(x)+exp(-x)}/2
sinh x ={exp(x)-exp(-x)}/2
>>cosh(1)
ans =
1.5431
指令型式 | 說明 |
---|---|
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 |
>>sqrt(3)
ans = 1.7321
>>sqrt(-5)
ans = 0 + 2.2361i
>>exp(1)
ans =
2.7183
>>log(2.7183)
ans =
1.0000
>>logx=5*log(10)
logx = 11.5129
>>x=exp(logx)
x =
1.0000e+005
>>R=3+4j
R = 3.0000 + 4.0000i
>>abs(R)
ans = 5
>>angle(R)*180/pi
ans = 53.1301
>>real(R) %實數部份
ans = 3
>>imag(R) %虛數部份
ans = 4
>>conj(R) %共軛複數
ans = 3.0000 - 4.0000i
>>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
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
指令型式 | 說明 |
---|---|
ceil(x) | 大於x之最近整數 |
fix(x) | 位於接近於零之整數 |
floor(x) | 小於x之最近整數 |
round(x) | 四捨五入之整數 |
sign(x) | 符號值,若x>0為+1;x=0為0;x<0為-1> |
>>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
對於一個矩陣元素值之統計,前面也有部份討論到,諸如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之標準差 |
>>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)
ans =
15
14
13
12
11
>>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
>>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
>>M=cumsum(0:5:50)
M =
0 5 15 30 50 75 105 140 180 225 275
>>prod(1:5)
ans = 120
>>prod(A)
ans =
172040 155520 43225 94080 142560
>>prod(A,2)
ans =
48960
180320
137280
143640
89100
>>cumprod(1:2:10)
ans =
1 3 15 105 945
>>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
>>mean(M)
ans =
-2.0000 11.7500 -16.0000 -7.7500 17.0000
>>std(M,0,2)
ans =
28.0357
32.6833
32.2614
14.5017
>>[mean(M(:)) std(M(:))]
ans =
0.6000 26.0897
矩陣之相乘雖然屬於元素與元素間之相乘,但其結果可能因解釋或其實際之意義而不同。前文所述之陣列相乘即是一種例子,但其結果是相對應位置的元素相乘。這種逐元乘法在Matlab中相當普遍,而通常矩陣的加法、減法是與逐元之加法、減法是一致的,其應用比較簡單。至於矩陣的乘法(或未來的除法)其代表的意義自有不同。
V=v1 i + v2 j + v3 k;U=u1 i + u2 j + u3 k
V。U=v1.u1+v2.u2+v3.u3
>>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
>> A=[1 0 0];B=[0 2 0];
>> D=cross(A,B)
D =
0 0 2
>> m=cross([1 2 3],[5 4 3])
ans =
-6 12 -6
>> 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
>> 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 | 100 | 22 | 65 | 12 |
B | 50 | 15 | 80 | 5 |
C | 200 | 30 | 50 | 20 |
產品名 | 第一季 | 第二季 | 第三季 | 第四季 |
---|---|---|---|---|
A | 100 | 200 | 250 | 90 |
B | 250 | 200 | 150 | 100 |
C | 80 | 100 | 120 | 150 |
產品名 | 第一季 | 第二季 | 第三季 | 第四季 |
---|---|---|---|---|
A | 300 | 250 | 250 | 200 |
B | 400 | 350 | 250 | 150 |
C | 500 | 600 | 650 | 700 |
>>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
C =
38500 50000 56500 44000
8350 10400 11350 7980
30500 34000 34250 21350
4050 5400 6150 4580
>>Qcost=sum(C)
Qcost =
81400 99800 108250 77910
>>Total_cost=sum(Qcost)
Total_cost =
367360
>>Prod_unitcost=sum(P,2)
Prod_unitcost =
199
150
300
>>Prod_Q=sum(Q,2)
>>Prod_Q =
640
700
450
>>Prod_cost=Prod_unitcost.*Prod_Q
Prod_cost =
127360
105000
135000
>>D=Q.*W
D =
30000 50000 62500 18000
100000 70000 37500 15000
40000 60000 78000 105000
>>Prod_sale=sum(D,2)
Prod_sale =
160500
222500
283000
>>Profit=Prod_sale-Prod_cost
Profit =
33140
117500
148000