トップページunix
211コメント119KB

データ解析ツールoctaveを語ろう Part 2

■ このスレッドは過去ログ倉庫に格納されています
0001名無しさん@お腹いっぱい。2009/10/28(水) 22:13:01
知る人ぞ知る強力なデータ解析ツール octave ...

unixを科学研究で使っている香具師には非常に心強い味方のはずだ。

matlab互換を主張しながら、微妙にバージョンアップを続ける
octaveについて語ろう。

そのPart 2です

前スレ

データ解析ツールoctaveを語ろう
http://pc12.2ch.net/test/read.cgi/unix/1086016412/
0002octave for windowsメモの筆者2009/10/29(木) 00:07:36
>>1 スレたてありがとうございます。
0003名無しさん@お腹いっぱい。2009/10/29(木) 02:35:44
ロリコンのオイラにも使いこなせだろうか…
0004名無しさん@お腹いっぱい。2009/11/06(金) 10:32:08
OctaveスレですがFreeMAT 4.0が使い物になるか検証してみます
FreeMATでは関数名がOctave/MATLABと変わってるものがあります
例えば
Octave/MATLABのfgetlは、fgetline
Octave/MATLABのinterp1は、interplin1 (しかもオプションが違う)
とか色々

というような感じなので、Octave、MATLAB、FreeMATで共通に動かせるプログラムを
書くにはどの処理系で動かしているかプログラムの中で判別する必要があります。

OctaveとMATLABを判別するには

if exsit('OCTAVE_VERSION'),
% octave の処理
else
% MATLAB の処理
end;

とやれば良いです。FreeMATではどうやら

if exist('verstring'),
% FreeMAT の処理
else
% FreeMAT 以外の処理
end;

とやればいいようです。
0005名無しさん@お腹いっぱい。2009/11/06(金) 10:56:36
電卓やExcelで計算出来る程度をのことをわざわざOctave/MATLAB/FreeMATで
行うのは時間の無駄です。
逆に理論上は電卓やExcelでも計算可能だが超絶むずい問題を
Octave/MATALB/FreeMATでさらさらと計算する事は非常に有意義です。

統計計算ならExcelでも可能でしょうけど、非線形最小二乗法の計算ともなれば
ちょっと難しいですが、Octave/MATLAB系言語なら簡単(?)に計算可能です。

MATLABでは高いOptimization Toolboxのオプションを買えば
lsqcurvefitというマルカート法を用いた非線形最小二乗計算が出来ます。

でもまあしかし、Octave-Forgeについてくるleasqrを使えば只で
マルカート法による非線形最小二乗計算ができますのでそちらを使いましょう。
使うのはleasqr.mとdfdp.mだけなので簡単です。

FreeMATではこのleasqr.mをどう試行錯誤しても使えなかったので
FreeMAT自身のマルカート法を用いた非線形最小二乗関数であるfitfunを使います。
それらの使い方の例を次に示します。
0006名無しさん@お腹いっぱい。2009/11/06(金) 11:02:54
test1.mで保存してOctave/MATLAB/FreeMATで実行

function F=test1()
stol=0.0001;
niter=50;
AA=[0:360];
BB=AA./180.*pi;
CC=cos(BB);
x0=[1,0];
%
if exist('verstring'),
wt=zeros(size(BB))+1;
[p1, f1] = fitfun(@sintest1, x0, CC, wt, eps, BB);
p1
else
[f1, p1] = leasqr(BB', CC, x0, @sintest2, stol, niter);
p1
end;
disp(sprintf('pi = %f', p1(2)*2));

function F=sintest1(param1, xx),
F=sintest(xx, param1);

function F=sintest2(xx,param1),
F=sintest(xx, param1);

function F=sintest(xx, param1),
freq =param1(1);
phase=param1(2);
E=sin(xx.*freq+phase);
F=E;
0007名無しさん@お腹いっぱい。2009/11/06(金) 13:40:31
>>6
の説明を簡単にします

sintestは、param1で指定された波数freqと位相phaseのsinデータを生成する関数で
入力値にはcosのデータを用意し、
その波数と位相を非線形最小二乗法で求めるというものです
cosはsinから見ると位相が90度=π/2ずれてますので
推定された位相を2倍すればπが得られるはず!で
実際に計算してみるとそうなりました

ところで、leasqrとfitfunでは、解析する関数のパラメータの順番が違います
そこで元になってるsintest関数をleasqr用とfitfun用にラッパー関数
sintest1, sintest2で置き換えてから処理しています。
ちなみにMATLABのOptimization Toolboxの非線形最小二乗法関数の
lsqcurvefitもFreeMATのfitfunと同じ並びだったりします
0008octave for windowsメモの筆者2009/11/06(金) 18:27:07
>>5
他の視点としてはC, fortran, C++で書けば速いコードができるのだが,
プログラムを書くのに時間がかかってしまのですが,octaveなどで組み込みの
強力なツールを使えばプログラミングが早く終わるケースなどがあります
よね。

ちょっとして問題までコンパイラを使うのは時間の無駄だと思います。

また,プログラミングする前のプロトタイプ作成にも有効ですよね。

liboctaveはC++で動く数値演算クラスライブラリとして有用ですし,
octaveのスクリプトからの移植は,比較的容易ですので真剣に高速化したい
ときも近道になりますよね。

私の主なoctaveの用途はodeのソルバーと固有値問題解析です。

いろんな場面で連立微分方程式を解く

超音波は波動を使った研究をしていて波動方程式はフーリエ変換すると固有値
問題になるのでそのときもoctaveが大変約に立っています。

ExcelでVBAでルンゲクッタ公式を書いて,微分方程式を解いているのを見ている
となんと時代遅れで時間の無駄なことをしているのだろうと
思ってしまいます。
スティッフな問題なんぞに対応できないですしね。

#ところで,思い切りスレ違いですが,
非線形最小2乗法はgnuplotもかなり強力ですよ。
0009名無しさん@お腹いっぱい。2009/11/06(金) 19:16:01
octaveでgnuplot(wgnuplot)を実行させようとするとグラフが表示されない現象に悩まされているので質問させてください。
まずバージョン情報をば。

OS: Windows Vista
octave: 3.0.3(cygwin setupからインストール)
gnuplot: 4.0 patchlevel 0(wgnuplotをcygwinからではなく個別にインストール)

また、octaveはcygwin1.5.25上で動かしています。
octaveからgnuplotにデータを渡すために
octaveの設定ファイルに下記サイト等を参考にして変更を施しました。

http://www.t.hosei.ac.jp/~miya_ken/computer/octave.htm

ですがグラフを表示させようとすると
octaveのウィンドウでデータが羅列されるだけで
gnuplotがグラフィカルに表示してくれません。
自分の打ちこんだデータについては何度も確認しましたが間違っている場所は見当たりません。
参考までに載せておきます(テスト用なのでただのsinカーブです)

------------------------------------
x=0:0.1:2*pi;
plot(x,sin(x))
------------------------------------

解決法知っている方おられましたらよろしくおねがいします。
■ このスレッドは過去ログ倉庫に格納されています