コンテンツにスキップ

Scilab

出典: フリー教科書『ウィキブックス(Wikibooks)』

はじめに

[編集]

Scilabは、MATLABと互換性のあるオープンソースの数値計算ソフトウェアであり、数値計算、データ解析、可視化などに広く利用されています。本ハンドブックでは、Scilabの基本的な使い方から応用的なテクニックまで、コード例を豊富に交えながら解説します。初心者から中級者まで、Scilabを効果的に活用するためのポイントを明快に解説します。

1. Scilabの基本

[編集]

1.1 Scilabの起動と終了

[編集]

Scilabを起動するには、アプリケーションアイコンをクリックするか、コマンドラインからscilabと入力します。終了するには、コマンドウィンドウでexitまたはquitと入力するか、ウィンドウを閉じます。

$ scilab

1.2 コンソールウィンドウ

[編集]

Scilabのコンソールウィンドウは、対話的にコマンドを実行するための場所です。例えば、以下のように簡単な計算を実行できます。

-->3 + 5
 ans  =
   8.

1.3 ヘルプの利用

[編集]

Scilabには豊富なドキュメントが用意されています。特定の関数のヘルプを見るには、helpコマンドを使用します。

-->help sin

2. 変数とデータ型

[編集]

2.1 変数の宣言と代入

[編集]

Scilabでは、変数を宣言する際に型を明示する必要はありません。変数に値を代入すると、自動的に型が決定されます。

-->x = 10;
-->y = 3.14;
-->z = "Hello, Scilab";

2.2 データ型

[編集]

Scilabには、数値、文字列、論理値など、さまざまなデータ型があります。

-->a = 42;        // 数値(double型)
-->b = int8(42);  // 8ビット整数
-->c = "Scilab";  // 文字列
-->d = %t;        // 論理値(true)

3. 配列と行列操作

[編集]

3.1 配列の作成

[編集]

Scilabでは、配列を簡単に作成できます。1次元配列(ベクトル)や2次元配列(行列)を作成するには、以下のようにします。

-->v = [1, 2, 3, 4, 5];  // 行ベクトル
-->m = [1, 2, 3; 4, 5, 6; 7, 8, 9];  // 3x3行列

3.2 配列の操作

[編集]

配列の要素にアクセスするには、インデックスを使用します。Scilabのインデックスは1から始まります。

-->v(3)  // ベクトルの3番目の要素
 ans  =
   3.
-->m(2, 3)  // 行列の2行3列目の要素
 ans  =
   6.

3.3 行列の演算

[編集]

Scilabでは、行列の加算、乗算、転置などの基本的な演算を簡単に行えます。

-->A = [1, 2; 3, 4];
-->B = [5, 6; 7, 8];
-->C = A + B;  // 行列の加算
-->D = A * B;  // 行列の乗算
-->E = A';     // 行列の転置

4. 制御構造

[編集]

4.1 条件分岐

[編集]

Scilabでは、if文を使用して条件分岐を行います。

-->x = 10;
-->if x > 5 then
-->  disp("x is greater than 5");
-->else
-->  disp("x is less than or equal to 5");
-->end

4.2 ループ

[編集]

forループやwhileループを使用して、繰り返し処理を行います。

-->for i = 1:5
-->  disp(i);
-->end

-->n = 0;
-->while n < 5
-->  n = n + 1;
-->  disp(n);
-->end

5. 関数とスクリプト

[編集]

5.1 関数の定義

[編集]

Scilabでは、functionキーワードを使用して関数を定義します。

function y = myFunction(x)
  y = x^2 + 2*x + 1
endfunction

5.2 スクリプトの作成

[編集]

スクリプトは、複数のコマンドをまとめて実行するためのファイルです。.sce拡張子で保存します。

// myScript.sce
x = 1:10;
y = x.^2;
plot(x, y);

6. データの可視化

[編集]

6.1 基本的なプロット

[編集]

Scilabでは、plot関数を使用してデータを可視化できます。

-->x = 0:0.1:2*%pi;
-->y = sin(x);
-->plot(x, y);
-->xlabel("x");
-->ylabel("sin(x)");
-->title("Sine Wave");

6.2 複数のプロット

[編集]

hold onを使用して、複数のプロットを重ねて表示できます。

-->plot(x, sin(x));
-->hold on;
-->plot(x, cos(x));
-->legend(["sin(x)", "cos(x)"]);

7. ファイル入出力

[編集]

7.1 ファイルからのデータ読み込み

[編集]

read関数を使用して、ファイルからデータを読み込みます。

-->data = read("data.txt", -1, 2);

7.2 ファイルへのデータ書き込み

[編集]

write関数を使用して、データをファイルに保存します。

-->write("output.txt", data);

8. 応用トピック

[編集]

8.1 画像処理

[編集]

Scilabは画像処理にも対応しています。imreadimshowなどの関数を使用して、画像を読み込み表示できます。

-->img = imread("image.jpg");
-->imshow(img);

8.2 信号処理

[編集]

Scilabは信号処理にも対応しています。fft関数を使用して、高速フーリエ変換を行うことができます。

-->t = 0:0.001:1;
-->x = sin(2*%pi*50*t) + sin(2*%pi*120*t);
-->y = fft(x);
-->plot(abs(y));

9. MATLABとの違い

[編集]

ScilabはMATLABと多くの点で類似していますが、いくつかの重要な違いがあります。これらの違いを理解することで、両者の使い分けや移行がスムーズになります。本章では、MATLABとScilabの主な違いについて解説します。

9.1 開発環境の違い

[編集]

MATLAB

[編集]
  • 統合開発環境 (IDE): MATLABは、エディタ、デバッガ、プロファイラ、ワークスペースブラウザなど、高度な統合開発環境を提供しています。
  • アプリデザイナー: GUIアプリケーションを簡単に作成できる「アプリデザイナー」が利用可能です。
  • ツールボックス: MATLABには、信号処理、画像処理、機械学習など、専門的な機能を提供する豊富なツールボックスがあります。

Scilab

[編集]
  • シンプルなインターフェース: ScilabのインターフェースはMATLABに比べてシンプルで、コンソール中心の操作が基本です。
  • GUI: ScilabにもGUIはありますが、MATLABほど高度な機能は提供されていません。
  • モジュールの不足: ScilabはMATLABのツールボックスを完全にはサポートしていないため、一部の高度な機能は利用できません。

9.2 言語仕様の違い

[編集]

変数名の大文字と小文字の区別

[編集]
  • MATLAB: デフォルトで大文字と小文字を区別します。
  • Scilab: 大文字と小文字を区別します
% MATLAB
>> A = 1;
>> a = 2;
>> A == a  % 0 (false)
% Scilab
-->A = 1;
-->a = 2;
-->A == a  // %f (false)

文字列の扱い

[編集]
  • MATLAB: 文字列はダブルクォーテーション (") で囲みます。
  • Scilab: シングルクォーテーション (') もダブルクォーテーションも使用可能です。
% MATLAB
>> str = "Hello";
% Scilab
-->str = 'Hello';  // または str = "Hello";

関数の定義

[編集]
  • MATLAB: 関数ファイルはファイル名と関数名が一致する必要があります。
  • Scilab: ファイル名と関数名が一致しなくても動作します。
% MATLAB: myFunction.m ファイル内
function y = myFunction(x)
  y = x^2;
end
% Scilab: anyName.sce ファイル内
function y = myFunction(x)
  y = x^2;
endfunction

9.3 パフォーマンスの違い

[編集]

計算速度

[編集]
  • MATLAB: 高度な最適化が施されており、特に大規模な計算や行列演算で高速です。
  • Scilab: MATLABに比べて計算速度が遅い場合がありますが、小規模な計算ではほとんど差を感じません。

メモリ管理

[編集]
  • MATLAB: メモリ管理が高度に最適化されており、大規模なデータ処理にも対応できます。
  • Scilab: メモリ管理はMATLABほど最適化されていないため、大規模なデータ処理では制限が生じる場合があります。

9.4 グラフィックスと可視化

[編集]

グラフィックスの品質

[編集]
  • MATLAB: 高品質なグラフィックスを提供し、カスタマイズ性も高いです。
  • Scilab: 基本的なプロット機能はMATLABと互換性がありますが、グラフィックスの品質やカスタマイズ性はMATLABに劣ります。

プロット関数の違い

[編集]
  • MATLAB: plot関数のオプションが豊富で、細かい設定が可能です。
  • Scilab: plot関数のオプションがMATLABほど充実していない場合があります。
% MATLAB: グラデーション付きプロット
>> x = 1:10;
>> y = x.^2;
>> plot(x, y, 'LineWidth', 2, 'Color', [0.5, 0.5, 0.8]);
% Scilab: 基本的なプロット
-->x = 1:10;
-->y = x.^2;
-->plot(x, y);

9.5 ファイル入出力

[編集]

ファイル形式のサポート

[編集]
  • MATLAB: .matファイルのほか、Excel、CSV、画像ファイルなど、多様な形式をサポートしています。
  • Scilab: .matファイルやCSVファイルの読み書きは可能ですが、MATLABほど多くの形式をサポートしていません。

関数の互換性

[編集]
  • MATLAB: readmatrixwritematrixなどの高レベル関数が利用可能です。
  • Scilab: これらの関数はサポートされていないため、readwriteなどの基本的な関数を使用します。

9.6 コミュニティとサポート

[編集]

MATLAB

[編集]
  • 商用ソフトウェア: 有料ですが、公式サポートや豊富なドキュメントが利用できます。
  • ユーザーコミュニティ: 大規模なユーザーコミュニティがあり、情報交換が活発です。

Scilab

[編集]
  • オープンソース: 無料で利用可能ですが、公式サポートはありません。
  • ユーザーコミュニティ: 小規模ですが、活発なコミュニティが存在します。

MATLABとScilabは多くの点で互換性がありますが、開発環境、言語仕様、パフォーマンス、グラフィックス、ファイル入出力、サポートなどに違いがあります。MATLABは商用ソフトウェアとして高度な機能とサポートを提供する一方、Scilabはオープンソースとして無料で利用できる利点があります。目的や予算に応じて、適切なツールを選択することが重要です。

10. Scilab拡張による互換性の問題

[編集]

ScilabはMATLABとの互換性を重視して設計されていますが、ScilabにはMATLABにはない独自の拡張機能が多数存在します。そのため、MATLABで書かれたコードは多くの場合Scilabで問題なく動作しますが、Scilabで書かれたコード(特に拡張機能を利用したコード)はMATLABで動作しないことがあります。この点は、MATLABとScilabの互換性を考える上で非常に重要なポイントです。

以下に、Scilabの拡張機能が原因でMATLABで動作しなくなる典型的なケースと、その解決策について解説します。

10.1 関数や構文の拡張

[編集]

ScilabにはMATLABにはない独自の関数や構文が追加されています。これらの機能を使うと、MATLABではエラーが発生します。

例: 多項式の定義

[編集]

Scilabでは多項式をpoly関数で定義できますが、MATLABではSymbolic Math Toolboxが必要です。

// Scilabでは動作するが、MATLABではエラー
p = poly([1, 2, 1], "x", "c");  // x^2 + 2x + 1
disp(p);
解決策
MATLAB互換のコードにするには、多項式を係数ベクトルで表現します。
% MATLAB
p = [1, 2, 1];  % 係数ベクトル
disp(p);

10.2 行列の扱い

[編集]

Scilabでは行列の要素へのアクセス方法がMATLABと異なる場合があります。

例: 行列の範囲指定

[編集]

Scilabでは$を使って行列の最後の要素を指定できますが、MATLABではendを使います。

// Scilabでは動作するが、MATLABではエラー
A = [1, 2, 3; 4, 5, 6; 7, 8, 9];
disp(A($, :));  // 最後の行
解決策
MATLAB互換のコードにするには、endを使います。
% MATLAB
A = [1, 2, 3; 4, 5, 6; 7, 8, 9];
disp(A(end, :));  % 最後の行

10.3 関数の柔軟な定義

[編集]

Scilabでは、関数ファイル名と関数名が一致しなくても動作しますが、MATLABではファイル名と関数名が一致する必要があります。

例: 関数ファイル名と関数名の不一致

[編集]
// Scilabでは動作するが、MATLABではエラー
// ファイル名: myFunc.sce
function y = myFunction(x)
  y = x^2;
endfunction
解決策
MATLAB互換のコードにするには、ファイル名と関数名を一致させます。
% ファイル名: myFunction.m
function y = myFunction(x)
  y = x^2;
end

10.4 グラフィックス関連の拡張

[編集]

ScilabにはMATLABにはない独自のプロット関数やオプションがあります。これらの機能を使うと、MATLABでは動作しません。

例: plot2d関数のオプション

[編集]
// Scilabでは動作するが、MATLABではエラー
x = 1:10;
y = x.^2;
plot2d(x, y, style=5);  // スタイル指定
解決策
MATLAB互換のコードにするには、MATLABのplot関数のオプションを使用します。
% MATLAB
x = 1:10;
y = x.^2;
plot(x, y, 'pentagram');  // スタイル指定

10.5 その他の拡張

[編集]

Scilabには、以下のようなMATLABにはない機能があります。

  • 単位付き数値の扱い
  • シンボリック計算
  • 信号処理や制御工学に特化した関数

これらの機能を使うと、MATLABでは動作しません。

例: 単位付き数値

[編集]
// Scilabでは動作するが、MATLABではエラー
import physical_units;
x = 10*%m;  // 10メートル
disp(x);
解決策
MATLAB互換のコードにするには、単位を明示的に変換します。
% MATLAB
x = 10;  % メートル
disp(x);

10.6 互換性を保つためのベストプラクティス

[編集]
  1. MATLABの構文に従う: Scilabでコードを書く際は、MATLABの構文に忠実に従うようにします。
  2. Scilab拡張を避ける: Scilab独自の機能や構文はできるだけ使用しないようにします。
  3. テストを徹底する: Scilabで書いたコードをMATLABで動作確認し、互換性を確保します。
  4. ドキュメントを参照する: ScilabとMATLABの公式ドキュメントを参照し、互換性に関する情報を確認します。

10.7 まとめ

[編集]

ScilabはMATLABとの互換性を重視していますが、拡張機能によってMATLABでは動作しないコードが生じることがあります。特に、以下の点に注意が必要です。

  • 関数や構文の拡張
  • 行列の扱い
  • 関数ファイル名と関数名の一致
  • グラフィックス関連の拡張
  • その他の拡張

これらの違いを理解し、MATLAB互換のコードを書くことで、両環境での互換性を確保できます。ScilabとMATLABを併用する場合には、特にこれらの点に注意を払うことが重要です。

おわりに

[編集]

このハンドブックでは、Scilabの基本的な使い方から応用的なテクニックまでを解説しました。Scilabは非常に強力なツールであり、適切に活用することで、さまざまな問題を効率的に解決できます。本ハンドブックが、Scilabを使いこなすための一助となれば幸いです。