精度保証数値計算レポート(演習5)

学籍番号:600p005-5
氏名:岩村 誠 2000年12月31日

1  問題

  1. Jampack
  2. Jama
  3. Java LAPACK
上の3つのパッケージの中の少なくとも1つにより、連立一次方程式及び 固有値問題を解いて簡単な評価をせよ。

2  環境

利用した環境は以下の通り。

CPU Mobile Celeron 300MHz
OS Linux 2.2.14(Vine Linux 2.0)
数値計算ソフト GNU Octave, version 2.1.31(ATLASにより高速化)
JAVAパッケージ Jama Version 1.0.1
JDK IBM Developer Kit for Linux,Java Technology Edition,Version 1.1.8
JDK Java Development Kit Version JDK 1.1.8_005
JIT Compiler shuJIT 0.6.9
Octave用mファイルlusol.m

3つのパッケージのうちJamaを選択した。

3  連立一次方程式

3.1  プログラム

Jamaで連立一次方程式を解くのにかかる時間を測定するために、 以下のプログラムを利用した。
import java.util.*;
import Jama.*;

public class Solve1
{
    static final int n = 1000;
    public static void main(String[] args)
    {
        Matrix A,x,b;
        Date   start,end;

        A = Matrix.random(n,n);
        b = Matrix.random(n,1);
        start = new Date();
        x = A.solve(b);
        end = new Date();
        System.out.println("" +
            (end.getTime() - start.getTime()) / 1000.0 +"[sec]");
    }
}

Jamaの比較対象としてGNU Octave, version 2.1.31を用いた。 Octave用のプログラムは以下のとおり。
n = 1000;
A = rand(n,n);
b = rand(n,1);
tic();x = A \ b;toc()

またATLASにより高速化されたlusol()関数についても計測した。
n = 1000;
A = rand(n,n);
b = rand(n,1);
tic();x = lusol(A,b);toc()

3.2  結果・評価

以下に実行結果を示す。

1 Jama(JAVAインタープリタ) 236.654[sec]
2 Jama(JITコンパイラ shuJIT) 61.976[sec]
3 Jama(JITコンパイラ IBM JIT) 29.808[sec]
4 Octave(x=A\b) 23.932[sec]
5 Octave(x=lusol(A,b)) 9.273[sec]

2のshuJITは早稲田大学大学院理工学研究科村岡研究室の首藤一幸氏が開発した JITコンパイラ(同じ研究室なので試さないわけには・・・)、 3はIBM JDKに含まれる速度面で定評のあるJITコンパイラである。

なおshuJIT利用の際は、環境変数JAVA_COMPILER_OPTに cmplatload(クラスロード時に全てのメソッドをコンパイル)を設定した。

表のとおりATLASで最適化されたコードを利用している5は圧倒的に速い。 ただC(Fortran)で書かれている4とIBMのJITコンパイラを利用したJama(3)とでは さほど差がない。数値計算のような速度面のパフォーマンスが要求される アプリケーションにおいても、決してJavaは遅れをとっているわけではなさそうだ。

4  固有値問題

4.1  プログラム

Jama用のプログラムとして以下を利用した。
import Jama.*;

public class Solve2
{
    public static void main(String[] args)
    {
        Matrix        A;
        EigenvalueDecomposition    ed;
        double[][]    d = {
            {1.0,2.0,3.0},
            {2.0,3.0,4.0},
            {3.0,4.0,5.0},
        }; 

        A = new Matrix(d);
        ed = A.eig();
        System.out.println("V =");
        ed.getV().print(8,5);
        System.out.println("D =");
        ed.getD().print(8,5);
    }
}

結果の比較のためにOctave用の以下のプログラムを利用した。
A = [1 2 3;2 3 4;3 4 5];
[V,D] = eig(A)

4.2  結果・評価

Jamaの実行結果は以下のとおり。
V =

  -0.82767  -0.40825   0.38509
  -0.14241   0.81650   0.55951
   0.54284  -0.40825   0.73393

D =

  -0.62348   0.00000   0.00000
   0.00000   0.00000   0.00000
   0.00000   0.00000   9.62348

Octaveの実行結果は以下のとおり。
V =

   0.82767   0.40825   0.38509
   0.14241  -0.81650   0.55951
  -0.54284   0.40825   0.73393

D =

  -0.62348   0.00000   0.00000
   0.00000  -0.00000   0.00000
   0.00000   0.00000   9.62348

ほぼ同じ結果だがVの1,2列目のベクトルの要素の正負が反転している。


Ax = lx
なので解としては問題はないが、実装の違いが現れた。

References

[1]"http://www.oishi.info.waseda.ac.jp/ oishi/FAQ/lusol.m", lusol.m.

[2]"http://www.shudo.net/jit/index-j.html", shuJIT.

[3]"http://www.trl.ibm.co.jp/projects/jit/index.html", Java JIT Compiler.

[4]"http://www.blackdown.org/java-linux.html", Java-Linux.

 


File translated from TEX by TTH, version 2.80.
On 1 Jan 2001, 21:54.

©Waseda University

URI: http://www.oishi.info.waseda.ac.jp/~oishi/FAQ/main.html