犬ぶよツールズ制作記録

Javaによる研究生活のためのパッケージ、犬ぶよツールズ。
その開発と保守のための備忘録

Inubuyo gnuplot (ver. 1.0 release)

2008-04-16 02:51:54 | news
● 概要
gnuplot用のファイルを簡単に生成するためのライブラリです。
詳細はInubuyo Gnuplotに書かれています。

● 動作環境
Java。JRE 1.4以上。

(動作確認)
+ J2SE 1.5.0 on Mac OS X

● 配布について
実行可能なjarファイルです。
classファイルが含まれています。
ソースコードは同梱していません。

● 利用条件
フリーです。
再配布不可。
jarファイルに含まれるclassを使用したプログラムを公開する場合には
こちらを経由して別途入手してもらうようにしてください。


● ダウンロード
jp.inubuyo.bone.gnuplot-1.0.jar (12,716 bytes)


● 内容
以下のクラスを含んでいます。
+ GnuplotWriter
+ GnuplotVectorWriter
+ GnuplotR2Writer
+ GnuplotR2VectorWriter




Inubuyo Functions (ver. 1.0 release)

2008-04-07 17:17:00 | news
● 概要
数学でいう写像をあらわすインターフェース群、
Inubuyo Functions です。
inubuyo Fuctions の仕様のうち、
実際に利用しそうなインターフェースを含めてあります。

● 動作環境
Java。JRE 1.4以上。

(動作確認)
+ J2SE 1.5.0 on Mac OS X

● 配布について
実行可能なjarファイルです。
classファイルが含まれています。
ソースコードは同梱していません。

● 利用条件
フリーです。
再配布不可。
jarファイルに含まれるclassを使用したプログラムを公開する場合には
こちらを経由して別途入手してもらうようにしてください。


● ダウンロード
jp.inubuyo.bone.math.func-1.0.jar (17,990 bytes)


● 内容
以下のインターフェースを含んでいます。
C1
C1ofR2toR
C1ofR2toR2
C1ofR2toRn
C1ofR3toR
C1ofR3toR2
C1ofR3toRn
C1ofR4toR
C1ofR4toR2
C1ofR4toRn
C1ofRntoR
C1ofRntoR2
C1ofRntoRn
C1ofRtoR
C1ofRtoR2
C1ofRtoRn
C1ofRZtoR
C1ofRZtoR2
C1ofRZtoRn
C2
C2ofR2toR
C2ofR3toR
R2toR
R2toR2
R2toRn
R3toR
R3toR2
R3toRn
R4toR
R4toR2
R4toRn
RntoR
RntoR2
RntoRm
RntoRn
RRntoR
RRntoRn
RtoR
RtoR2
RtoRn
RZtoR
RZtoR2
RZtoRn
Z2toR
Z2toR2
Z2toRn
Z2toZ
Z2toZn
ZntoR
ZntoR2
ZntoRn
ZntoZ
ZntoZn
ZtoR
ZtoR2
ZtoRn
ZtoZ
ZtoZn


● 使い方
これらのインターフェースは、犬ぶよツールズの他のパッケージを使う時に使用します。
これらのインターフェースのオブジェクトを、主に数値計算用のパッケージが、
引数に要求したり戻り値として返したりします。

このインターフェースを実装するクラスを書く例を示します。
この例はsin()を表すRtoRを無名クラスを使って実装するものです。





import jp.inubuyo.bone.math.func.RtoR;

...

    RtoR function = new RtoR(){
        public double value(double x){
            return Math.sin(x);
        }
    };
    System.out.println("sin(0)=" + function.value(0)); // 結果は0
    System.out.println("sin(PI)=" + function.value(Math.PI)); // 結果は1
    
...




Inubuyo Gnuplot

2008-04-02 22:03:31 | memo
● 概要
関数をグラフとして可視化することがさまざまな場面で必要になる。
Javaのメソッドとして書いた関数も簡単に可視化したい。
作成されるグラフが加工しやすく出版など高い要求に耐えうるのがよい。
この目的を手軽に達するため、Javaのメソッドとして書いた関数から
gnuplotが対応するデータファイルとプロットファイルを生成するライブラリ、
Inubuyo gnuplotを作成した。


(コンセプト)
● やりたいこと
関数のグラフを簡便にプロットしたい。
関数はInubuyo Functions (jp.inubuyo.bone.math.func パッケージ)
インターフェースとする。
+ (P1) RtoRのグラフをプロットしたい。
    + 複数のRtoRを1つのグラフにプロットしたい。
+ (P2) RtoRnのグラフをプロットしたい。
    + 複数のRtoRnを1つのグラフにプロットしたい。
+ (P3) R2toRのグラフをプロットしたい。
    + 複数のR2toRを1つのグラフにプロットしたい。
+ (P4) R2toRnのグラフをプロットしたい。
    + 複数のR2toRnを1つのグラフにプロットしたい。

● 実現方法
プロットにgnuplotを用いる。
gnuplotの利用は以下の点から、Javaのマルチプラットホームの利点を損なわない。
+ 多くのOS上で実行できるフリーソフトである。
+ 比較的単純なテキストファイル(pltファイル、datファイル)から
多様な図を生成でき、それらのファイルはOSに関係なく使える。

Javaのプログラムからgnuplot用のdatファイルとpltファイルを生成する。
+ pltファイルを1つ、datファイルを1つ以上つくる。
    + 1つの関数に対して1つのdatファイル

datファイルの中身について。
+ (P1) m行2列の数値、ここでmはデータ点の数。
+ (P2) m行(n+1)列の数値、ここでmはデータ点の数。
+ (P3) m行3列の数値、ここでmはデータ点の数。
+ (P4) m行(n+2)列の数値、ここでmはデータ点の数。
※ データ点の数mはdatファイルによって異なりうる。

● 基本方針
pltファイルは必要最低限にする。
+ pltファイルは目的に応じて編集されることを想定する。
    + Javaのコードを書くよりpltファイルを場合に応じて編集する方が手間が少ないから。
+ 関数f(x)に対して(x, f(x))の形のグラフのみをサポートする。
    + パラメータ表示(f(x), g(x))はサポートしない。
        + P2, P4のdatファイルがあれば、パラメータ表示をするpltファイルは簡単に書けるから。

datファイルはプロットする関数に応じて4種類必要になる。
この4種類のdatファイルでプロットできる関数を最大限サポートする。
+ (P1)
    + データ形式
x1 f1
x2 f2
...
    + プロットできる関数
        + RtoR(等間隔なサンプリング)
        + double[] (等間隔なサンプリング)
        + x: double[] とf: double[] の対

+ (P2)
    + データ形式
x1 f1 g1 ...
x2 f2 g2 ...
...
    + プロットできる関数
        + RtoR2(等間隔なサンプリング)
        + RtoRn(等間隔なサンプリング)
        + double[][n] (等間隔なサンプリング)
        + x: double[] と f: double[][n] の対

+ (P3)
    + データ形式
x1 y1 f1_1
x1 y2 f1_2
...

x2 y1 f2_1
x2 y2 f2_2
...
    + プロットできる関数
        + R2toR(等間隔なサンプリング)
        + double[][] (matrixとみる、等間隔なサンプリング)
        + x: double[] とy: double[] とf: double[][] の対

+ (P4)
    + データ形式
x1 y1 f1_1 g1_1 ...
x1 y2 f1_2 g1_2 ...
...

x2 y1 f2_1 g2_1 ...
x2 y2 f2_2 g2_2 ...
...
    + プロットできる関数
        + R2toR2(等間隔なサンプリング)
        + R2toRn(等間隔なサンプリング)
        + double[][][] (matrixとみる、等間隔なサンプリング)
        + x: double[] とy: double[] とf: double[][][] の対

(仕様)
● 4つのクラスを使う
+ P1に対応するもの: GnuplotWriter
+ P2に対応するもの: GnuplotVectorWriter
+ P3に対応するもの: GnuplotR2Writer
+ P4に対応するもの: GnuplotR2VectorWriter

● メソッド
+ コンストラクタ
    + 生成するpltファイルのファイル名を引数にとる。
+ 関数に対応するdatファイルを生成するplot()
    + サンプリングしないもの
        + (P1) plot(double[], double[]): void など
        + (P2) plot(double[], double[][]): void など
        + (P3) plot(double[], double[], double[]): void など
    + (P4) plot(double[], double[], double[][]): void など
    + サンプリングするもの
        + (P1) plot(RtoR, double, double, double): void など
        + (P2) plot(RtoRn, double, double, double): void など
        + (P3) plot(R2toR, double, double, double, double, double, double): void など
        + (P4) plot(R2toRn, double, double, double, double, double, double): void など
+ pltファイルを生成して処理を終了するclose()

● 使い方
4つのクラスいずれも以下の方法になる。
1. Writerのインスタンス化
2. plot()の呼び出し
    2.1 複数の関数をプロットする場合はそれぞれについてplot()を呼び出す。
3. close()の呼び出し

GnuplotWriterの場合の例




/* プロットしたい関数。初期化しておくこと。 */
RtoR func1, func2;

/* Writerのインスタンス化 */
GnuplotWriter writer = new GnuplotWriter("plot");//pltファイルはplot.pltになる。

/* func1のプロット */
//0から10まで0.1刻みでサンプルする。
writer.plot(func1,0, 10, 0.1);//plot1.datが書き出される。

/* func2のプロット */
//0から10まで0.2刻みでサンプルする。
writer.plot(func2,0, 10, 0.2);//plot2.datが書き出される

/* 終了する */
writer.close();//plot.pltが書き出される




● 諸々
+ 簡便に利用できるようにするため、例外を投げない。
+ 4つのWriterのクラスはパッケージjp.inubuyo.bone.gnuplot に置く。



Inubuyo Functions 仕様

2008-04-02 21:16:38 | about
● 概要
Javaのメソッドを数学でいう写像として扱うと便利な場合があります。
そのために写像を表すインターフェースを作り、パッケージにまとめます。

● 内容

+ 写像には定義域と値域があります。
これらをメソッドの引数と戻り値に対応させます。

+ このパッケージでは数の集合として実数R、整数Z
これらの直積を想定します。
実数Rdouble型、
整数Zint型として扱います。
この扱いはもちろん不完全ですが、
数値計算をJavaで行う上では最も自然な方法です。

+ 定義域と引数の型は次の表のようにしています。



定義域引数の型
R(double)
R2(double, double)
R3(double, double, double)
R4(double, double, double, double)
Rn(double[])
Z(int)
Z2(int, int)
Zn(int[])
R×Z(double, int)
R×Rn(double, double[])



+ 定義域と引数の型は次の表のようにしています。



値域戻り値の型
Rdouble
R2java.awt.geom.Point2D
Rndouble[]
Zint
Znint[]


+ 関数のうち微分可能なものには導関数があります。
導関数を持つ関数に対応するインターフェースもこのパッケージに含まれます。

● インターフェース名
+ インターフェース名は定義域を表す文字列と値域を表す文字列を"to"で繋げたものとしています。
数の集合を表す文字列は次の表のようにしています。



集合文字列
RR
R2R2
R3R3
R4R4
RnRn
ZZ
Z2Z2
ZnZn
R×ZRZ
R×RnRRn


例:以上の方法で作ることができるインターフェース名は次のようなものです。
実数から実数への写像RRは、RtoR
ベクトル値の写像RR2は、RtoR2
整数から実数への写像ZRは、ZtoR

また、異なるかもしれない自然数n、mに対して
RnRmRntoRmとします。

+ 導関数がある関数を表すインターフェース名は、
"C1of"を写像を表すインターフェース名の前に付けます。
2階の導関数がある関数を表すインターフェース名は、
"C2of"を写像を表すインターフェース名の前に付けます。

例:写像RR2に導関数があるとき、C1ofRtoR2

ただし、実数から実数への写像RRに対しては、
導関数があるものをC1
2階の導関数があるものをC2
とします。

● メソッド
+ value
各インターフェースはvalueというメソッドをただ1つ持ちます。
その引数と戻り値の型は、インターフェースが表す写像の定義域・値域に対応します。

例:インターフェースRtoRはメソッドvalue(double): doubleを持ちます。
インターフェースRtoR2はメソッドvalue(double): java.awt.geom.Point2Dを持ちます。
インターフェースZtoRはメソッドvalue(int): doubleを持ちます。

+ size
定義域あるいは値域がRnZnに相当するインターフェースは
その次元nを返すメソッドsize(): intを持ちます。

ただし、インターフェースRntoRmについては
定義域の次元を表すsizeArgument(): intと値域の次元を表すsizeImage(): intの2つのメソッドを持ちます。

+ d1
導関数を表します。
引数はそのインターフェースのvalueメソッドと同じ型です。
戻り値の型はvalueの型によって決まります。

例:インターフェースC1はメソッドd1(double): doubleを持ちます。
インターフェースC1ofRtoR2はメソッドd1(double): java.awt.geom.Point2Dを持ちます。
インターフェースC1ofR2toRはメソッドd1(double, double): double[]を持ちます。

+ d2
二階の導関数を表します。
引数はそのインターフェースのvalueメソッドと同じ型です。
戻り値の型はvalueの型によって決まります。

例:インターフェースC2はメソッドd1(double): doubleを持ちます。
インターフェースC2ofR2toRはメソッドd1(double, double): double[][]を持ちます。

● 継承
導関数を持つ関数のインターフェースは、対応する導関数が無い関数のインターフェースを継承します。

例:インターフェースC1はインターフェースRtoRを継承します。
インターフェースC2はインターフェースC1を継承します。
インターフェースC1ofRtoR2はインターフェースRtoR2を継承します。

● パッケージ名
jp.inubuyo.bone.math.func とします。