GNU Octave
GNU Octave(グヌー・オクターブ)は数値計算用の対話型インタプリタ言語です。
GNU Octaveは、C/C++、BASIC、Fortranによく似た基本文法を採用しており、いずれか1つのプログラム言語の文法を知っていれば、簡単にプログラムを書き始めることができます。
また、のグラフを、以下のわずか3行で表示することが出来る、やさしい言語ですので、初心者や学生にも扱うことができます。
x=-2:0.1:2 y=x.^2 plot(x,y)
その一方、GNU Octaveはベクトルや行列の扱いが非常に優れており、さらに豊富な科学技術計算用の関数を持っています。 2D、3Dグラフィック、算術演算、線形代数、非線形方程式、数値積分、微分方程式、最適化、統計、金融、集合、多項式演算、自動制御、デジタル信号処理、画像処理、音声処理などは大学院レベルの関数が最初から入っています。
これらの関数は、数値解析の専門家が最先端のテクニックを駆使して開発しており、ユーザーが計算速度や精度で、これらを凌駕するのは容易ではないでしょう。
さらに、GNU Octaveは、ファイル名に関数名をつけ拡張子を'.m'とした、mファイルと呼ばれるテキストファイルによりユーザー関数を作ることが出来ます。 この関数ファイルを組み合わせることにより、大規模な数値計算のプログラムを作成することも出来ます。 C/C++、Fortranあるいは他の言語の中で書かれたモジュールを呼び出すことも出来ます。
Octaveの最初の版は1993年1月4日にジョン・イートン (John W. Eaton)によってリリースされました。そして、現在も定期的にバージョンアップされています。
GNU Octaveは、MATLABのクローンの一つと見なされています。 つまり、GNU Octaveの文法はMATLABの文法と非常によく似ており、すこし注意してプログラミングすることで OctaveとMATLABの両方で実行できるスクリプトを書くことができます。
MATLABは商業用のプログラムなので高価ですが、GNU Octaveは、GNUパブリックライセンスのもとで無料で使うことができますし、さらにその気があればシステムを書き換えることもできます。
多くの研究者が、研究室ではMATLABを使い、自宅のパソコンにはGNU Ocataveをインストールしています。
GNU Octaveは、UNIXやLinuxなどのUNIX互換OSで開発されてきましたが、現在ではmaxOSとWindowsに移植され、インストールして使うことが出来ます。
チュートリアル
[編集]はじめに
[編集]Octaveは、高度な数値計算を実行するためのオープンソースの高水準プログラミング言語です。GNU Octaveは、MATLAB言語に非常に似ており、MATLABに似たシンタックスを使用しています。Octaveは、数値演算、行列演算、グラフ描画など、科学技術計算に必要な多くの機能を提供しています。Octaveは、多くのプラットフォームで動作し、無料で利用できます。Octaveは、教育、科学、工学、経済学などの分野で広く使用されています。本チュートリアルでは、Octaveの基本的な使い方を学ぶことができます。
ベクトルと行列
[編集]まず、Octaveではベクトルを作成するために、要素をスペースまたはカンマで区切って[ ]で囲む必要があります。例えば、次のように入力することでベクトルを作成できます。
x = [1 2 3]
次に、行列を作成するために、要素をスペースまたはカンマで区切って[ ]で囲み、行ごとにセミコロンで区切ります。例えば、次のように入力することで行列を作成できます。
A = [1 2 3; 4 5 6; 7 8 9]
また、Octaveでは特別な行列を作成するための関数も用意されています。例えば、次のように入力することで、すべての要素が0の3x3の行列を作成できます。
zeros(3,3)
同様に、次のように入力することで、すべての要素が1の3x3の行列を作成できます。
ones(3,3)
また、以下のように入力することで、単位行列を作成することもできます。
eye(3)
ベクトルと行列に対して演算を行うこともできます。例えば、次のように入力することで、ベクトルxと行列Aの積を計算できます。
y = A*x
また、行列の転置や逆行列を求めることもできます。以下は、それぞれの例です。
A' inv(A)
以上が、Octaveのチュートリアルの「ベクトルと行列」の概要です。詳細はOctaveの公式ドキュメントを参照してください。
グラフ表示
[編集]Octaveを使用して、データをプロットすることができます。これにより、データの視覚化と分析が容易になります。Octaveでは、plot関数を使用してグラフを作成します。
まず、データを変数に割り当てます。例えば、次のような2次元配列を考えます。
x = [0:0.1:2*pi]; y = sin(x);
これは、0から2πまで0.1ずつの間隔でx軸の値を生成し、それに対応するsin(x)の値をy軸に割り当てています。
次に、plot関数を使用してグラフを作成します。
plot(x, y)
このコマンドにより、x軸とy軸のデータをプロットするグラフが表示されます。
グラフの見栄えを改善するために、xlabel、ylabel、title、およびlegend関数を使用して、グラフにラベルを付けることができます。
xlabel("x") ylabel("y") title("Sin(x) Graph") legend("sin(x)")
これにより、x軸に「x」、y軸に「y」、グラフのタイトルに「Sin(x) Graph」、および凡例に「sin(x)」と表示されます。
また、Octaveには、様々な種類のグラフを作成するための機能があります。例えば、bar関数を使用して棒グラフ、pie関数を使用して円グラフを作成できます。
テキストとファイル出力
[編集]テキストの出力方法としては、disp関数を用いた方法やfprintf関数を用いた方法があります。disp関数は、文字列や数値をコマンドウィンドウに表示するために使われます。例えば、以下のようにコードを書くことで文字列を出力できます。
>> disp("Hello, Octave!") Hello, Octave!
fprintf関数は、書式付きテキストをファイルに出力するために使われます。例えば、以下のようなコードを書くことでファイルにデータを出力できます。
>> data = [1, 2, 3; 4, 5, 6; 7, 8, 9]; >> fid = fopen("data.txt", "w"); >> fprintf(fid, "%d %d %d\n", data'); >> fclose(fid);
このコードでは、dataという3x3の行列が定義され、fopen関数でファイルを開き、fprintf関数でデータを書き込み、fclose関数でファイルを閉じます。
また、ファイルの読み込み方法としては、load関数やfread関数があります。load関数は、テキストファイルから変数を読み込むために使われます。例えば、以下のようなコードを書くことでファイルからデータを読み込めます。
>> data = load("data.txt");
fread関数は、バイナリファイルからデータを読み込むために使われます。例えば、以下のようなコードを書くことでバイナリファイルからデータを読み込めます。
>> fid = fopen("data.bin", "r"); >> data = fread(fid, [3 3], "double"); >> fclose(fid);
このコードでは、fopen関数でバイナリファイルを開き、fread関数でデータを読み込み、fclose関数でファイルを閉じます。
一般的な数学関数
[編集]Octaveには、一般的な数学関数が数多く用意されています。以下にいくつかの例を示します。
- 指数関数と対数関数
指数関数は exp() で計算できます。自然対数は log()、常用対数は log10() で計算できます。逆数の自然対数は log1p() で計算できます。
x = 2; e = exp(x) % eのx乗を計算 ln = log(x) % xの自然対数を計算 log10 = log10(x) % xの常用対数を計算 lnp1 = log1p(1/x) % xの逆数の自然対数を計算
- 三角関数と逆三角関数
三角関数は sin()、cos()、tan()、逆三角関数は asin()、acos()、atan() で計算できます。
x = pi/6; s = sin(x) % sin(x)を計算 c = cos(x) % cos(x)を計算 t = tan(x) % tan(x)を計算 as = asin(x) % arcsin(x)を計算 ac = acos(x) % arccos(x)を計算 at = atan(x) % arctan(x)を計算
- その他の関数
平方根は sqrt()、絶対値は abs()、階乗は factorial() で計算できます。また、べき乗は ^ 演算子を使用するか、power() 関数を使用することができます。
x = 4; sq = sqrt(x) % xの平方根を計算 ab = abs(-x) % xの絶対値を計算 fact = factorial(x) % xの階乗を計算 pow = x^3 % xの3乗を計算 pow_func = power(x, 3) % xの3乗を計算
これらは、Octaveで利用可能な数学関数の一部です。Octaveのドキュメントには、より詳細なリストがあります。
ループと条件
[編集]Octaveのループと条件の構文は、一般的なプログラミング言語と同様です。
まず、条件分岐を実現するために、if文があります。if文の構文は以下のようになります。
if 条件式 実行するコード elseif 条件式 実行するコード else 実行するコード endif
次に、ループを実現するために、whileループとforループがあります。
whileループの構文は以下のようになります。
while 条件式 実行するコード endwhile
forループの構文は以下のようになります。
for 変数 = 初期値 : 増分 : 終了値 実行するコード endfor
Octaveのループは、break文とcontinue文をサポートしています。break文はループを中断し、continue文は現在のループをスキップして、次のループに進みます。以下は、break文とcontinue文の例です。
for i = 1:10 if i == 5 break; elseif i == 3 continue; endif disp(i); endfor
この例では、iが5のときにループが中断され、iが3のときにはスキップされます。それ以外の場合は、iの値が表示されます。
関数
[編集]Octaveでは、関数を定義することで、同じ操作を繰り返し行うことができます。関数を使用することにより、コードの再利用性が向上し、より効率的なコードを書くことができます。
関数は次のように定義されます:
function [output_args] = function_name(input_args) % 関数の本体 end
ここで、function_nameは関数の名前を表します。input_argsは、関数に渡される入力引数であり、関数本体で使用できます。output_argsは、関数が返す出力引数です。
以下は、2つの数値を受け取り、それらを加算する関数の例です。
function [result] = add_numbers(a, b) result = a + b; end
この関数を呼び出すには、次のようにします。
>> add_numbers(2, 3) ans = 5
このように、関数を呼び出すと、関数が実行され、出力が返されます。関数は、複数の入力引数と出力引数を持つことができます。また、関数内には、制御フローのためのif文やループなどを含めることもできます。
ベクトル化
[編集]ベクトル化とは、ループを使わずに配列や行列の要素ごとの演算を一括して行うことを指します。これにより、プログラムの実行速度を向上させることができます。
例えば、以下のような配列の要素ごとの二乗を計算するコードを考えてみましょう。
A = [1, 2, 3, 4, 5]; B = zeros(size(A)); for i = 1:length(A) B(i) = A(i)^2; end
このコードは、Aの各要素をループで処理してBに格納しています。しかし、Octaveにはベクトル化のための機能があります。以下のように、ループを使わずに配列の要素ごとの演算を一括して行うことができます。
A = [1, 2, 3, 4, 5]; B = A.^2;
ここで、.は要素ごとの演算を行うための演算子です。このように、ベクトル化により、コードの簡潔さや実行速度の向上が期待できます。ただし、ベクトル化を行う場合は、処理対象の配列のサイズが大きい場合にはメモリ使用量が増加するため、注意が必要です。
線形代数
[編集]Octaveは、線形代数の計算を行うための便利なツールです。以下では、Octaveを使用して行列を作成し、演算を行う方法について説明します。
- 行列の作成
Octaveで行列を作成するには、[ ]またはzeros()を使用します。以下は、3x3のゼロ行列を作成する例です。
A = zeros(3,3)
これにより、以下のような行列が作成されます。
A = 0 0 0 0 0 0 0 0 0
また、[ ]を使用して行列を手動で入力することもできます。
B = [1, 2, 3; 4, 5, 6; 7, 8, 9]
これにより、以下のような行列が作成されます。
B = 1 2 3 4 5 6 7 8 9
- 行列演算
Octaveを使用して、行列の加算、減算、乗算、転置、逆行列などの演算を行うことができます。
- 加算と減算
2つの行列を加算するには、単に+演算子を使用します。
C = A + B
同様に、2つの行列を減算するには、単に-演算子を使用します。
D = A - B
- 乗算
2つの行列を乗算するには、*演算子を使用します。
E = A * B
- 転置
行列の転置は、'演算子を使用して行います。
F = B'
- 逆行列
行列の逆行列は、inv()関数を使用して求めることができます。
G = inv(B)
- 行列の要素へのアクセス
行列の要素にアクセスするには、()を使用します。以下は、行列Bの2行目、3列目の要素にアクセスする例です。
B(2,3)
- 特別な行列
Octaveには、いくつかの特別な行列が用意されています。例えば、単位行列を作成するには、eye()関数を使用します。
I = eye(3)
これにより、以下のような行列が作成されます。
I = 1 0 0 0 1 0 0 0 1
微分方程式
[編集]Octaveは微分方程式の数値解法にも対応しています。以下にOctaveのチュートリアルの「微分方程式」に関する内容をまとめます。
Octaveで微分方程式を解くためには、いくつかの方法がありますが、ここではode45関数を使用した方法を紹介します。ode45は、常微分方程式を解くための関数です。
まず、以下のように微分方程式を定義します。
function dydt = my_ode(t, y) dydt = -y; endfunction
この例では、dy/dt = -yという微分方程式を定義しています。この関数は、tとyを引数として受け取り、dy/dtの値を返します。これは、常微分方程式を解くために必要な微分方程式の形式に合わせています。
次に、初期値を設定します。
tspan = [0, 10]; y0 = 1;
tspanは、解析する時間の範囲を定義するための変数です。ここでは、0から10までの時間範囲を設定しています。y0は、初期条件を設定するための変数です。この場合、y(0) = 1となるように設定しています。
最後に、ode45関数を使用して微分方程式を解きます。
[t, y] = ode45(@my_ode, tspan, y0);
このコードでは、ode45関数を使用して、my_ode関数をtspanとy0で解析しています。@my_odeは、関数ハンドルを表し、my_ode関数を指定しています。tは、時間の値を含むベクトルで、yは、各時間におけるyの値を含むベクトルです。
以上が、Octaveで微分方程式を解くための簡単な方法です。ode45以外にも、ode23、ode113、ode15sなど、微分方程式を解くための様々な関数が用意されています。また、odeoptions関数を使用することで、解析の設定を変更することもできます。
多項式
[編集]Octaveでは、多項式を表現するために「polyval」と「polyfit」という2つの関数を使用することができます。
「polyval」は、与えられた多項式をxの値に代入して計算することができます。たとえば、以下のような2次方程式を考えてみましょう。
y = ax^2 + bx + c
この式に対応する多項式をOctaveで作成するには、次のようにします。
a = 2; b = 3; c = 1; p = [a b c];
ここで、pは多項式の係数を格納する配列です。上記の例では、pは[2 3 1]という配列になります。
次に、この多項式を特定のxの値に代入して計算するには、以下のようにします。
x = 2; y = polyval(p, x)
この例では、xの値を2として計算していますので、yの値は13になります。
一方、「polyfit」は、与えられたデータを元に最適な多項式をフィッティングするための関数です。たとえば、以下のようなデータがあるとします。
x = [1 2 3 4 5]; y = [3 5 7 9 11];
このデータを元に、最適な2次方程式を求めるには、次のようにします。
p = polyfit(x, y, 2);
ここで、3つ目の引数である2は、フィッティングする多項式の次数を表しています。この例では、2次方程式をフィッティングしています。
フィッティングが完了したら、得られた多項式をxの値に代入して計算することができます。これには、「polyval」関数を使用します。
x_new = 6; y_new = polyval(p, x_new)
この例では、xの値を6として計算していますので、yの値は21になります。
集合
[編集]Octaveでは、標準的な集合演算子を使用して集合を定義できます。以下は、Octaveのチュートリアルに基づく集合の例です。
- 集合の作成
新しい集合を作成するには、以下のようにします。
set1 = {1, 2, 3, 4, 5}
この例では、set1という名前の新しい集合を作成し、その中に1、2、3、4、5という要素を含めています。
- 集合演算
集合演算には、以下のような標準的な演算子があります。
- Union(和集合): |
- Intersection(積集合): &
- Set difference(差集合): -
- Symmetric difference(対称差集合): xor
たとえば、以下の例を見てみましょう。
set1 = {1, 2, 3} set2 = {3, 4, 5} set3 = set1 | set2
この例では、set1とset2の和集合をset3に代入しています。set3には、1、2、3、4、5という要素が含まれます。
- 要素の検索
集合内に特定の要素が含まれているかどうかを調べるには、in演算子を使用します。
set1 = {1, 2, 3, 4, 5} if (3 in set1) disp("3 is in set1") endif
この例では、set1内に3が含まれていることを確認し、"3 is in set1"というメッセージが表示されます。
- 集合の比較
2つの集合を比較するには、以下の演算子を使用します。
- Equality(等しさ): ==
- Inequality(等しくない): !=
- Subset(部分集合): <:
- Proper subset(真の部分集合): <=
たとえば、以下の例を見てみましょう。
set1 = {1, 2, 3} set2 = {1, 2, 3} if (set1 == set2) disp("set1 and set2 are equal") endif
この例では、set1とset2が等しいことを確認し、"set1 and set2 are equal"というメッセージが表示されます。
- 集合のサイズ
集合の要素数を調べるには、length関数を使用します。
set1 = {1, 2, 3, 4, 5} size1 = length(set1)
この例では、set1に5つの要素が含まれていることを確認し、size1には5が代入されます。
フィルター設計
[編集]Octaveには、信号処理に関する機能が豊富にあります。その中でも、フィルターは、信号の周波数成分を変更するために使用される重要なツールです。
Octaveでは、以下のような機能が提供されています。
- フィルターの種類 Octaveでは、FIR(有限インパルス応答)フィルターとIIR(無限インパルス応答)フィルターがサポートされています。FIRフィルターは、有限長のインパルス応答を持ち、IIRフィルターは、無限長のインパルス応答を持ちます。
- フィルターの設計 Octaveには、fir1、fir2、cheb1、cheb2、butter、ellip、remezなどの関数があり、これらを使用して、異なるフィルターを設計できます。これらの関数には、必要なフィルター仕様を指定するパラメータが含まれています。
- フィルターの適用 Octaveでは、filter関数を使用して、設計されたフィルターを信号に適用できます。filter関数には、入力信号、フィルター係数、およびフィルターの初期状態を指定する必要があります。
- フィルターの可視化 Octaveには、freqz関数を使用して、フィルターの周波数応答をプロットすることができます。また、fvtool関数を使用して、フィルターの周波数応答や位相応答、インパルス応答などを表示することができます。
以上が、Octaveのフィルター設計に関する基本的な機能です。
用語集
[編集]- ベクトル (vector): 数値や文字などの並びを表すデータ構造。一次元配列とも呼ばれる。
- 行列 (matrix): 2次元の数値や文字の表を表すデータ構造。二次元配列とも呼ばれる。
- スカラー (scalar): 一つの値を表すデータ。ベクトルや行列の要素として使用される。
- 要素 (element): ベクトルや行列の値のこと。
- インデックス (index): ベクトルや行列の要素を特定するための番号。
- 転置行列 (transpose): 行列の行と列を入れ替えた行列。
- 行列積 (matrix multiplication): 行列同士の乗算を行った結果得られる行列。
- 行列式 (determinant): 正方行列に対して定義される値で、その行列の重要な特性を表す。
- 逆行列 (inverse matrix): 正方行列に対して定義される値で、その行列に対する乗算で単位行列が得られる行列。
- 固有値 (eigenvalue): 正方行列に対して定義される値で、その行列の変換に対して不変となるスカラー。
- 固有ベクトル (eigenvector): 正方行列に対して定義される値で、固有値に対応する行列の列ベクトル。
- LU分解 (LU decomposition): 正方行列を下三角行列と上三角行列の積に分解する手法。
- QR分解 (QR decomposition): 行列を直交行列と上三角行列の積に分解する手法。
- SVD分解 (SVD decomposition): 行列を特異値行列と2つの直交行列の積に分解する手法。
- フィルター (filter): 信号処理で、信号の特定の周波数成分を通過させたり、通過させなかったりする装置。
- バンドパスフィルター (bandpass filter): 特定の周波数帯域を通過させるフィルター。
- ローパスフィルター (lowpass filter): 低い周波数成分を通過させ、高い周波数成分をカットするフィルター。
- ハイパスフィルター (highpass filter): 高い周波数成分を通過させ、低い周波数成分をカットするフィルター。
専門的な項目
[編集]マニュアルの翻訳
[編集]
Copyright (C) 1996,1997 John W. Eaton.
Copyright (C) 2005-2007 MASUDA, Yutaka (日本語訳)
Copyright (C) 2014 Bethlehem4.
Permission is granted to make and distribute verbatim copies of this manual provided the copyright notice and this permission notice are preserved on all copies.
Permission is granted to copy and distribute modified versions of this manual under the conditions for verbatim copying, provided that the entire resulting derived work is distributed under the terms of a permission notice identical to this one.
Permission is granted to copy and distribute translations of this manual into another language, under the above conditions for modified versions.