You are on page 1of 25

Scilab 第一章 基本數值運算

 撰文者:
 1. 中央大氣科學系 楊善文
 2.
 ( 如對本文有貢獻者,記得在此留名 )

Conférencier : Prénom Nom Date : Transparent 1


Fichier : /albafile/重要文件/SCILAB資料/自製的Scilab教材/SCILAB_Chap1.odp
基本運算

 在指令界面的 '-->' 之後,即可輸入運算字串。


 例子:
 --> 1+1 按下 [Enter]
 Ans =
 2.
 --> log(10) 按下 [Enter]
 Ans =
 2.3025851
 ( 至於為什麼 log10 不等於 1, 之後筆者會做說明 )

Conférencier : Prénom Nom Date : Transparent 2


Fichier : /albafile/重要文件/SCILAB資料/自製的Scilab教材/SCILAB_Chap1.odp
基本算符

 加減乘除: + - * /
 自然數的次方: ex 在 scilab 上,要寫成: exp(x)
 絕對值: abs() ,例如: abs(-3) Ans= 3.
 矩陣轉數值:在算符前加上 ''.'' ,為什麼要這麼做?因
為 Scilab 在運算時,基本上都是把那些數值當做矩陣來
看待的。當你打了一大串的數值串要做運算時,卻出現
了錯誤訊息。就有可能要考慮此狀況了,這時就要將乘
或除與 exp(),sin(),cos() 等等的運算式前加上點號。例
如: .* ./ .exp()......... 等等,例如: 3*t.*exp(sin(t))
 ( 注意:指令尾端的 ';' 號,加上則運算結果將不會輸出
至螢幕上,不加則效果反之 。 )
Conférencier : Prénom Nom Date : Transparent 3
Fichier : /albafile/重要文件/SCILAB資料/自製的Scilab教材/SCILAB_Chap1.odp
基本算符 ( 二 )

 除了加減乘除算符: + - * /
 另外還有次方算符: ^ ( 例如 2 的 3 次方: 2^3)
 開根號: sqrt()
 ( 例如根號 2 表示成 sqrt(2) ,也可以直接用 2^(1/2) 或
2^(0.5) 表示。 )
 括號: () 在運算時只能使用 '()' ,其他的括號類型有
別的用途,不能在此使用。

Conférencier : Prénom Nom Date : Transparent 4


Fichier : /albafile/重要文件/SCILAB資料/自製的Scilab教材/SCILAB_Chap1.odp
算符: log 系列

 log() :這是以自然數 e=2.7182818 為底的對數。這種對


數在數學上是以 ln 來表示之。
 log2() :以 2 為底的對數。
 log10() :以 10 為底的對數,也是我們最熟悉的一種對
數之一。
 其它少見的 log 指令:
 log1p(x) :等同於 log(1+x)
 logspace() :以對數方式從 a,b 取 n 等分。例如:
logspace(0,2,300) : 0 到 2 之間取 300 等份 。

Conférencier : Prénom Nom Date : Transparent 5


Fichier : /albafile/重要文件/SCILAB資料/自製的Scilab教材/SCILAB_Chap1.odp
三角函數

 三種: sin(),cos(),tan(). 至於 cot,sec,csc 這三個函數


Scilab 並沒有設計,不過使用: 1/sin() , 1/cos() ,
1/tan() 這樣的格式即可解決。
 三個反函數: asin(),acos(),atan().

Conférencier : Prénom Nom Date : Transparent 6


Fichier : /albafile/重要文件/SCILAB資料/自製的Scilab教材/SCILAB_Chap1.odp
雙曲線函數

 這是一個跟三角函數相似但內容完全不同的函數。此類
函數與 e 有關。
 三個: sinh(),cosh(),tanh()
 三個反函數: asinh(),acosh(),atanh()

Conférencier : Prénom Nom Date : Transparent 7


Fichier : /albafile/重要文件/SCILAB資料/自製的Scilab教材/SCILAB_Chap1.odp
變數宣告

 在 scilab 中變數的宣告是很自由的,幾乎大部分的字串
皆可以成為變數。例如 x=3;a2=14;...... 但是變數開頭不可
以是數字。同時也不可以將 Scilab 內定常數更改它的數
值。
 Scilab 的內定常數多半以 '%' 開頭,例如圓周率 π ,它
以 '%pi' 來表示。自然常數 e : %e 。虛數 i : %i 。如對
這些常數重新宣告會出現錯誤訊息。

Conférencier : Prénom Nom Date : Transparent 8


Fichier : /albafile/重要文件/SCILAB資料/自製的Scilab教材/SCILAB_Chap1.odp
多項式

 poly() 指令可以用來宣告一個多項式,它的用法如下:
 變數 1=poly([ 根 1 根 2 根 3 .........],' 多項式中的變
數 ');
 例如:
 --> a=poly([2 3 4],'s')
 a =
 -24 + 26s - 9s^2 + s^3

Conférencier : Prénom Nom Date : Transparent 9


Fichier : /albafile/重要文件/SCILAB資料/自製的Scilab教材/SCILAB_Chap1.odp
多項式 ( 二 )

 poly() 還有另一種用法,就是在函式內在加入 'coeff' 參


數,這時 poly() 中的 [] 內的數值則變成了項的係數。
 例如:
 --> u=poly([1 3 4],'e','coeff')
 u =
 1 + 3e^2 + 4e^3
 --> k=poly([2 4 5 7],'s','coeff')
 k =
 2 + 4s + 5s^2 + 7s^3

Conférencier : Prénom Nom Date : Transparent 10


Fichier : /albafile/重要文件/SCILAB資料/自製的Scilab教材/SCILAB_Chap1.odp
多項式的運算

 當宣告了數個多項式時,也是可以利用運算元來對它們
進行多項式運算。
 例子:
 --> C=poly([1 3 4],'x','coeff');
 --> D=poly([2 5 3],'x','coeff');
 --> C+D
 Ans =
 3 + 8x + 7x^2
 --> C*D
 Ans =
 2 + 11x + 26x^2 + 29x^3 + 12x^4

Conférencier : Prénom Nom Date : Transparent 11


Fichier : /albafile/重要文件/SCILAB資料/自製的Scilab教材/SCILAB_Chap1.odp
多項式的求解

 roots() 指令是 Scilab 用來求多項式解的指令。


 例子:
 --> k=poly([2 4 5 7],'s','coeff');
 roots(k)
 Ans =
 - 0.0675026 + 0.6990466i
 - 0.0675026 - 0.6990466i
 - 0.5792805

Conférencier : Prénom Nom Date : Transparent 12


Fichier : /albafile/重要文件/SCILAB資料/自製的Scilab教材/SCILAB_Chap1.odp
布林運算

 Scilab 有內定兩個布林常數: ( 是與否 ) %t %f


 兩個變數的輸出即為: T F
 布林常數也可以用在矩陣內。

Conférencier : Prénom Nom Date : Transparent 13


Fichier : /albafile/重要文件/SCILAB資料/自製的Scilab教材/SCILAB_Chap1.odp
矩陣

 矩陣運算是 Scilab 的一個重要的特長之一。也是 Scilab 使用者


最常使用到的功能了。例如外部讀進來的資料做處理、甚至繪
圖前也需要先把圖的數值存入矩陣等。
 宣告一個矩陣。語法:矩陣 1=[ 數值 1 數值 2 數值 3..... ]
( 數值也可以是字串類型 )
 在宣告時,如在之中打 ';' 號即代表換列。
 例子:
 --> A=[1 2 3 4; 5 6 7 8; 9 10 23 14]
 A =
 1. 2. 3. 4.
 5. 6. 7. 8. <===== 這就是一個矩陣了
 9. 10. 23. 14.

Conférencier : Prénom Nom Date : Transparent 14


Fichier : /albafile/重要文件/SCILAB資料/自製的Scilab教材/SCILAB_Chap1.odp
矩陣運算

 矩陣在運算時,可以使用這些運算符號: + - *
 運算時 ,必須把握矩陣特性的原則,才能進行運算。例
如相同大小 (M x N) 的矩陣才能相加相減。而相乘則必須
A 矩陣的大小的長與 B 矩陣的寬要吻合才能相乘。
 矩陣內除了可放數值、字串外。也可以放置多項式來運
算。
 矩陣運算的例子: --> A+B 或是 A*B

Conférencier : Prénom Nom Date : Transparent 15


Fichier : /albafile/重要文件/SCILAB資料/自製的Scilab教材/SCILAB_Chap1.odp
矩陣的特征值 (Eigenvalue)

 求矩陣的 Eigenvalue 有兩個指令,其實它們內容大同小


異: spec(), mtlb_eig()
 假設已宣告一矩陣 A ,則求它的特征值,語法如下:
 --> A=[1 2 3 4;5 6 7 8;9 10 23 14;24 17 13 44];
 --> spec(A)
 Ans =
 57.16615
 -1.2727462
 16.485895
 1.6207013
 ( 注意:求 Eigenvalue 一定要是正方型矩陣。 )

Conférencier : Prénom Nom Date : Transparent 16


Fichier : /albafile/重要文件/SCILAB資料/自製的Scilab教材/SCILAB_Chap1.odp
字串矩陣

 Scilab 的矩陣內也可以放入字串,但是字串與數值不可
以放在同一個矩陣內。
 裡面的內容字串在宣告時,須加上 ' ' ,以表示是字串變
數。
 例子:
 --> F=['d' 'ce' 'fg']
 F =
 ! d ce fg !
 ( 注意: Scilab 跟 Matlab 在這部分有差異, Matlab 所有
字串會全部相黏, Scilab 不會。 )
Conférencier : Prénom Nom Date : Transparent 17
Fichier : /albafile/重要文件/SCILAB資料/自製的Scilab教材/SCILAB_Chap1.odp
特殊矩陣

 零矩陣 :
 zeros(m,n) :宣告一個 m x n 大小,裡面全為零的矩陣。
 一矩陣:
 ones(m,n) :宣告一個 m x n 大小,裡面全為一的矩陣。
 例子:
 --> ones(2,5)
 Ans =
 1. 1. 1. 1. 1.
 1. 1. 1. 1. 1.
 空矩陣:
 --> B=[]
 B =
 []
Conférencier : Prénom Nom Date : Transparent 18
Fichier : /albafile/重要文件/SCILAB資料/自製的Scilab教材/SCILAB_Chap1.odp
矩陣的翻轉

 在矩陣後加上『 ' 』即可。


 例子: A =
 1. 1. 1. 1. 1.
 1. 1. 1. 1. 1.
 --> A'
 Ans =
 1. 1.
 1. 1.
 1. 1.
 1. 1.
 1. 1.

Conférencier : Prénom Nom Date : Transparent 19


Fichier : /albafile/重要文件/SCILAB資料/自製的Scilab教材/SCILAB_Chap1.odp
反矩陣的求得

 求解反矩陣的指令是 inv()
 例子:
 --> A=[1 3 4;2 4 6;7 3 2];
 --> B=inv(A); <== 宣告 B 為 A 的反矩陣
 --> A*B
 Ans =
 1. 8.82E-16 0.
 -1.332E-15 1. 2.766E-17
 0. 0. 1.
 ( 由於計算機精度的問題,往往求得的反矩陣只能到近
似解。 )
Conférencier : Prénom Nom Date : Transparent 20
Fichier : /albafile/重要文件/SCILAB資料/自製的Scilab教材/SCILAB_Chap1.odp
矩陣內元素的處理

 當宣告了一個矩陣後,如何使用它呢?
 例如: A=[1 2 3;4 5 6;7 8 9]
 取出內含元素的例子:
 --> A(1,1)
 Ans =
 1.
 --> A(2,1)
 Ans =
 4.
 --> A(3,2)
 Ans =
 8.

Conférencier : Prénom Nom Date : Transparent 21


Fichier : /albafile/重要文件/SCILAB資料/自製的Scilab教材/SCILAB_Chap1.odp
矩陣內元素的處理 ( 二 )

 從之前例子應該可以輕易看出 A(i,j) 與整個矩陣 A 所相


對應的關係。
 至於一次取矩陣中一排的位址,可以使用 ' : ' 。例如:
 以之前的例子: --> A(:,3)
 Ans =
 3.
 6.
 9.
 --> A(3,:)
 Ans =
 7. 8. 9.

Conférencier : Prénom Nom Date : Transparent 22


Fichier : /albafile/重要文件/SCILAB資料/自製的Scilab教材/SCILAB_Chap1.odp
矩陣內元素的處理 ( 三 )

 Scilab 的矩陣也可以限定範圍的抓取資料, ' : ' 也可以


用來代表從哪裡到哪裡,不宣告就是一次一整排。
 例如 ( 以之前的 A 做例子 ) :
 --> A(1:2,2:3)
 Ans =
 2. 3.
 5. 6.
 ( 限定範圍的抓取資料這個功能在實驗室的資料處理非
常常用。 )

Conférencier : Prénom Nom Date : Transparent 23


Fichier : /albafile/重要文件/SCILAB資料/自製的Scilab教材/SCILAB_Chap1.odp
Scilab 矩陣的使用技巧

 當你宣告一個空矩陣 ( 例如 B=[ ]) 後,可以直接宣告


B(i,j)=' 你想要輸入的數值 ' 。這時矩陣就會達到你所輸
入的大小。其他元素則會補零。例如: --> B(3,4)=6;
 --> B
 B =
 0. 0. 0. 0.
 0. 0. 0. 0.
 0. 0. 0. 6.

Conférencier : Prénom Nom Date : Transparent 24


Fichier : /albafile/重要文件/SCILAB資料/自製的Scilab教材/SCILAB_Chap1.odp
實例
 此技巧的實用:例如有三份資料,其中兩份是衛星飛越上空的經度 (Y) 與
緯度 (X) ,另一份是該點所被測量到電子濃度值 (Z) 。然後我們要將之繪出
一個濃度分佈圖。這三份資料是以時間來排列資料的。 ( 在這區域,從 0
時到 24 時,有許多衛星飛過上空 (X,Y) ,飛過時都會給接收端一筆觀測資
料Z。)
 寫法: ( 當 X,Y,Z 的值都已各存成一個矩陣後。 )
 for i=1:2880 <== 假設一天資料 2880 筆
 U(X(i),Y(i))=Z(i); <== 這就是將 Z 對應到 X,Y 的方法
 end <==for ...... end ( 這是 Scilab 的程式言,
代表迴圈,本例是從 1 跑到 2880 ,
Scilab 程式設計的部分,筆者以後還
會講到。 )
 k=size(U); <==size() 可以用來看矩陣的大小
 t1=1:k(1);t2=1:k(2); <==Scilab 在畫等值線 (contour) 時,是需
要先宣告矩陣的大小,才能畫。這些
之後還會講到。
 contour(t1,t2,U,20)
Conférencier : Prénom Nom Date : Transparent 25
Fichier : /albafile/重要文件/SCILAB資料/自製的Scilab教材/SCILAB_Chap1.odp