Scilab  第一章  基本數值運算 撰文者: 1. 中央大氣科學系  楊善文 2. ( 如對本文有貢獻者,記得在此留名 )
基本運算   在指令界面的  '-->' 之後,即可輸入運算字串。 例子: --> 1+1  按下 [Enter] Ans  = 2. --> log(10)  按下 [Enter] Ans  = 2.3025851 ( 至於為什麼 log10 不等於 1, 之後筆者會做說明 )
基本算符 加減乘除: + - * / 自然數的次方: e x   在 scilab 上,要寫成: exp(x) 絕對值: abs() ,例如: abs(-3)  Ans=  3. 矩陣轉數值:在算符前加上 ''.'' ,為什麼要這麼做?因為 Scilab 在運算時,基本上都是把那些數值當做矩陣來看待的。當你打了一大串的數值串要做運算時,卻出現了錯誤訊息。就有可能要考慮此狀況了,這時就要將乘或除與 exp(),sin(),cos() 等等的運算式前加上點號。例如: .*  ./  .exp()......... 等等,例如: 3*t.*exp(sin(t)) ( 注意:指令尾端的 ';' 號,加上則運算結果將不會輸出至螢幕上,不加則效果反之 。 )
基本算符 ( 二 ) 除了加減乘除算符: + -  *  / 另外還有次方算符: ^  ( 例如 2 的 3 次方: 2^3) 開根號: sqrt()  ( 例如根號 2 表示成 sqrt(2) ,也可以直接用 2^(1/2) 或 2^(0.5) 表示。 ) 括號: ()  在運算時只能使用 '()' ,其他的括號類型有別的用途,不能在此使用。
算符: 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 等份 。
三角函數 三種: sin(),cos(),tan(). 至於 cot,sec,csc 這三個函數 Scilab 並沒有設計,不過使用: 1/sin() , 1/cos() , 1/tan() 這樣的格式即可解決。 三個反函數: asin(),acos(),atan().
雙曲線函數 這是一個跟三角函數相似但內容完全不同的函數。此類函數與 e 有關。 三個: sinh(),cosh(),tanh() 三個反函數: asinh(),acosh(),atanh()
變數宣告 在 scilab 中變數的宣告是很自由的,幾乎大部分的字串皆可以成為變數。例如 x=3;a2=14;...... 但是變數開頭不可以是數字。同時也不可以將 Scilab 內定常數更改它的數值。 Scilab 的內定常數多半以 '%' 開頭,例如圓周率 π ,它以 '%pi' 來表示。自然常數 e : %e 。虛數 i : %i 。如對這些常數重新宣告會出現錯誤訊息。
多項式 poly() 指令可以用來宣告一個多項式,它的用法如下: 變數 1=poly([ 根 1  根 2  根 3  .........],' 多項式中的變數 '); 例如: --> a=poly([2 3 4],'s') a  = -24 + 26s - 9s^2 + s^3
多項式 ( 二 ) 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
多項式的運算 當宣告了數個多項式時,也是可以利用運算元來對它們進行多項式運算。 例子: --> 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
多項式的求解 roots() 指令是 Scilab 用來求多項式解的指令。 例子: --> k=poly([2 4 5 7],'s','coeff'); roots(k) Ans  = - 0.0675026 + 0.6990466i - 0.0675026 -  0.6990466i - 0.5792805
布林運算 Scilab 有內定兩個布林常數: ( 是與否 )  %t  %f 兩個變數的輸出即為: T  F 布林常數也可以用在矩陣內。
矩陣 矩陣運算是 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.
矩陣運算 矩陣在運算時,可以使用這些運算符號: + - *  運算時 ,必須把握矩陣特性的原則,才能進行運算。例如相同大小 (M x N) 的矩陣才能相加相減。而相乘則必須 A 矩陣的大小的長與 B 矩陣的寬要吻合才能相乘。 矩陣內除了可放數值、字串外。也可以放置多項式來運算。 矩陣運算的例子: --> A+B 或是 A*B
矩陣的特征值 (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 一定要是正方型矩陣。 )
字串矩陣 Scilab 的矩陣內也可以放入字串,但是字串與數值不可以放在同一個矩陣內。  裡面的內容字串在宣告時,須加上 ' ' ,以表示是字串變數。 例子: --> F=['d' 'ce' 'fg'] F  = !  d  ce  fg  ! ( 注意: Scilab 跟 Matlab 在這部分有差異, Matlab 所有字串會全部相黏, Scilab 不會。 )
特殊矩陣 零矩陣 : 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  = [ ]
矩陣的翻轉 在矩陣後加上『 ' 』即可。 例子: A  = 1.  1.  1.  1.  1. 1.  1.  1.  1.  1. --> A' Ans  = 1.  1. 1.  1. 1.  1. 1.  1. 1.  1.
反矩陣的求得 求解反矩陣的指令是 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. ( 由於計算機精度的問題,往往求得的反矩陣只能到近似解。 )
矩陣內元素的處理 當宣告了一個矩陣後,如何使用它呢? 例如: 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.
矩陣 內元素的處理 ( 二 ) 從之前例子應該可以輕易看出 A(i,j) 與整個矩陣 A 所相對應的關係。 至於一次取矩陣中一排的位址,可以使用 ' : ' 。例如: 以之前的例子: --> A(:,3) Ans  = 3. 6. 9. --> A(3,:) Ans  = 7.  8.  9.
矩陣 內元素的處理 ( 三 ) Scilab 的矩陣也可以限定範圍的抓取資料, ' : ' 也可以用來代表從哪裡到哪裡,不宣告就是一次一整排。 例如 ( 以之前的 A 做例子 ) : --> A(1:2,2:3) Ans  = 2.  3. 5.  6. ( 限定範圍的抓取資料這個功能在實驗室的資料處理非常常用。 )
Scilab 矩陣的使用技巧 當你宣告一個空矩陣 ( 例如 B=[ ]) 後,可以直接宣告 B(i,j)=' 你想要輸入的數值 ' 。這時矩陣就會達到你所輸入的大小。其他元素則會補零。例如: --> B(3,4)=6; --> B B  = 0.  0.  0.  0. 0.  0.  0.  0. 0.  0.  0.  6.
實例 此技巧的實用:例如有三份資料,其中兩份是衛星飛越上空的經度 (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)

Scilab Chap1

  • 1.
    Scilab 第一章 基本數值運算 撰文者: 1. 中央大氣科學系 楊善文 2. ( 如對本文有貢獻者,記得在此留名 )
  • 2.
    基本運算 在指令界面的  '-->' 之後,即可輸入運算字串。 例子: --> 1+1 按下 [Enter] Ans = 2. --> log(10) 按下 [Enter] Ans = 2.3025851 ( 至於為什麼 log10 不等於 1, 之後筆者會做說明 )
  • 3.
    基本算符 加減乘除: +- * / 自然數的次方: e x 在 scilab 上,要寫成: exp(x) 絕對值: abs() ,例如: abs(-3) Ans= 3. 矩陣轉數值:在算符前加上 ''.'' ,為什麼要這麼做?因為 Scilab 在運算時,基本上都是把那些數值當做矩陣來看待的。當你打了一大串的數值串要做運算時,卻出現了錯誤訊息。就有可能要考慮此狀況了,這時就要將乘或除與 exp(),sin(),cos() 等等的運算式前加上點號。例如: .* ./ .exp()......... 等等,例如: 3*t.*exp(sin(t)) ( 注意:指令尾端的 ';' 號,加上則運算結果將不會輸出至螢幕上,不加則效果反之 。 )
  • 4.
    基本算符 ( 二) 除了加減乘除算符: + - * / 另外還有次方算符: ^ ( 例如 2 的 3 次方: 2^3) 開根號: sqrt() ( 例如根號 2 表示成 sqrt(2) ,也可以直接用 2^(1/2) 或 2^(0.5) 表示。 ) 括號: () 在運算時只能使用 '()' ,其他的括號類型有別的用途,不能在此使用。
  • 5.
    算符: 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 等份 。
  • 6.
    三角函數 三種: sin(),cos(),tan().至於 cot,sec,csc 這三個函數 Scilab 並沒有設計,不過使用: 1/sin() , 1/cos() , 1/tan() 這樣的格式即可解決。 三個反函數: asin(),acos(),atan().
  • 7.
    雙曲線函數 這是一個跟三角函數相似但內容完全不同的函數。此類函數與 e有關。 三個: sinh(),cosh(),tanh() 三個反函數: asinh(),acosh(),atanh()
  • 8.
    變數宣告 在 scilab中變數的宣告是很自由的,幾乎大部分的字串皆可以成為變數。例如 x=3;a2=14;...... 但是變數開頭不可以是數字。同時也不可以將 Scilab 內定常數更改它的數值。 Scilab 的內定常數多半以 '%' 開頭,例如圓周率 π ,它以 '%pi' 來表示。自然常數 e : %e 。虛數 i : %i 。如對這些常數重新宣告會出現錯誤訊息。
  • 9.
    多項式 poly() 指令可以用來宣告一個多項式,它的用法如下:變數 1=poly([ 根 1 根 2 根 3 .........],' 多項式中的變數 '); 例如: --> a=poly([2 3 4],'s') a = -24 + 26s - 9s^2 + s^3
  • 10.
    多項式 ( 二) 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
  • 11.
    多項式的運算 當宣告了數個多項式時,也是可以利用運算元來對它們進行多項式運算。 例子:--> 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
  • 12.
    多項式的求解 roots() 指令是Scilab 用來求多項式解的指令。 例子: --> k=poly([2 4 5 7],'s','coeff'); roots(k) Ans = - 0.0675026 + 0.6990466i - 0.0675026 - 0.6990466i - 0.5792805
  • 13.
    布林運算 Scilab 有內定兩個布林常數:( 是與否 ) %t %f 兩個變數的輸出即為: T F 布林常數也可以用在矩陣內。
  • 14.
    矩陣 矩陣運算是 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.
  • 15.
    矩陣運算 矩陣在運算時,可以使用這些運算符號: +- * 運算時 ,必須把握矩陣特性的原則,才能進行運算。例如相同大小 (M x N) 的矩陣才能相加相減。而相乘則必須 A 矩陣的大小的長與 B 矩陣的寬要吻合才能相乘。 矩陣內除了可放數值、字串外。也可以放置多項式來運算。 矩陣運算的例子: --> A+B 或是 A*B
  • 16.
    矩陣的特征值 (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 一定要是正方型矩陣。 )
  • 17.
    字串矩陣 Scilab 的矩陣內也可以放入字串,但是字串與數值不可以放在同一個矩陣內。 裡面的內容字串在宣告時,須加上 ' ' ,以表示是字串變數。 例子: --> F=['d' 'ce' 'fg'] F = ! d ce fg ! ( 注意: Scilab 跟 Matlab 在這部分有差異, Matlab 所有字串會全部相黏, Scilab 不會。 )
  • 18.
    特殊矩陣 零矩陣 :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 = [ ]
  • 19.
    矩陣的翻轉 在矩陣後加上『 '』即可。 例子: A = 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. --> A' Ans = 1. 1. 1. 1. 1. 1. 1. 1. 1. 1.
  • 20.
    反矩陣的求得 求解反矩陣的指令是 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. ( 由於計算機精度的問題,往往求得的反矩陣只能到近似解。 )
  • 21.
    矩陣內元素的處理 當宣告了一個矩陣後,如何使用它呢? 例如: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.
  • 22.
    矩陣 內元素的處理 (二 ) 從之前例子應該可以輕易看出 A(i,j) 與整個矩陣 A 所相對應的關係。 至於一次取矩陣中一排的位址,可以使用 ' : ' 。例如: 以之前的例子: --> A(:,3) Ans = 3. 6. 9. --> A(3,:) Ans = 7. 8. 9.
  • 23.
    矩陣 內元素的處理 (三 ) Scilab 的矩陣也可以限定範圍的抓取資料, ' : ' 也可以用來代表從哪裡到哪裡,不宣告就是一次一整排。 例如 ( 以之前的 A 做例子 ) : --> A(1:2,2:3) Ans = 2. 3. 5. 6. ( 限定範圍的抓取資料這個功能在實驗室的資料處理非常常用。 )
  • 24.
    Scilab 矩陣的使用技巧 當你宣告一個空矩陣( 例如 B=[ ]) 後,可以直接宣告 B(i,j)=' 你想要輸入的數值 ' 。這時矩陣就會達到你所輸入的大小。其他元素則會補零。例如: --> B(3,4)=6; --> B B = 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 6.
  • 25.
    實例 此技巧的實用:例如有三份資料,其中兩份是衛星飛越上空的經度 (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)