Java の標準出力から gnuplot で2変数関数のグラフを描く

目次 解答例(ないかも)
  1. 計算科学のページをブックマークしよう.
  2. ホームディレクトリの下に, サブディレクトリ cs1 を作りましょう. 名前は自分の好みで変えてもよい. 以後の作業はここで行いましょう.

  3. エディタとしては emacs を使うことを非常に非常に強く奨めます. 設定ファイル
    ~/.emacs
    に次の行を追加してみましょう. control-c control-c でコンパイル, control-x `(バッククォート) または control-x x でエラーに飛べます. どうしても好みじゃなかったら, 試した後に, ; でコメントアウトしてもいいよ.
    ;; specify places where personal elisp files are stored
    (setq load-path (cons (expand-file-name "~hig/usr/lib/elisp") load-path))
    
    ;; rebind keys in java mode
    (add-hook 'java-mode-hook 
              (function (lambda () 
    ; start compilation with contol-c control-c
    		      (define-key java-mode-map "\C-c\C-c" 'compile)
    ; comment out region with  contol-c ;
                          (define-key java-mode-map "\C-c;" 'comment-region)
    )))
    
    ;; jump to next error with control-x x
    (global-set-key "\C-xx" 'next-error)
    
    
    ;; specify coding system for interacting with shells
    (setq process-coding-system-alist  '(( "bash" . euc-jp) 
    				     ( "csh" . euc-jp)
    				     ( "tcsh" . euc-jp)))
    
    ;; user gnuplot-mode. elisp files are in ~hig/usr/lib/elisp
    (autoload 'gnuplot-mode "gnuplot" "gnuplot major mode" t)
    (autoload 'gnuplot-make-buffer "gnuplot" "open a buffer in gnuplot mode" t)
    (setq auto-mode-alist (append '(("\\.gp$" . gnuplot-mode)) auto-mode-alist))
    
    ;; color keywords appropriately in each mode
    (global-font-lock-mode 1)
    
  4. 下のプログラム Sample01_01 を完成させて, f(x,t)=exp(-(x-vt)2/2.0)sin(4(x-vt)) の, x=0.0,0.5,...9.5, t=0.0,0.5,...9.5 での値を, 次のような書式で印字しましょう. _ は空白.

    0.0_0.0_0.12283 [最後の値 は f(0.0,0.0) の値] 0.0_0.5_0.12233 [最後の値 は f(0.0,0.5) の値] ...(くり返し) 0.0_9.5_0.12277 [最後の値 は f(0.0,9.5) の値] (改行のみの行) 0.5_0.0_0.12299 [最後の値 は f(0.5,0.0) の値] 0.5_0.5_0.122 [最後の値 は f(0.5,0.5) の値] ... 0.5_9.5_0.1221 [最後の値 は f(0.5,9.5) の値] (改行のみの行) 1.0_0.0_0.12893 [最後の値 は f(0.5,9.5) の値] ... ... ... 9.5_9.5_0.2938 [最後の値 は f(9.5,9.5) の値]
    v=-1.0, v=2.0 での出力をそれぞれ,
    % java Sample01_01 > datafile.1
    などとして保存しましょう.
    // Sample01_01
    
    // 日付を使いたいのでインポート
    import java.util.*;
    
    // public なクラス, メソッド, オブジェクトの直前には, 
    // 必ず, /** で始まるコメントをつける.
    
    /** 
      計算科学実習第1回課題プログラム
    
      2変数関数の値を格子点上で計算し,
      gnuplot が読み込めるような書式で標準出力に印字する.
    
      login name, 氏名, 呼んだクラス名を標準エラー出力に印字する.
    
      コマンドライン引数は単に捨てられる.
    */
    public class  Sample01_01 {
    
    
    /**
        実行開始後にこのメソッドが実行される.	  
    */
        static public void main(String[] args){    // 決り文句 
    				
    	Program01_01 prog = new Program01_01();
    	//                         ここに名前を書く
    	RunInfo info= new RunInfo("香山リカ", prog.getClass().getName());
    
    	info.print();
    	prog.exec();
    
        }
    
    
    }
    
    
    class Program01_01 {
        double f(double x, double t){
    	// ここを埋めよう
        }
    
        /* 次の課題ではこれを使う
        double g1(double y){
        }
        double g2(double y){
        }
        */
    
        public void exec(){
    	// ここがプログラムの主要部. 埋めよう
        }
    }
    
    
    // 以下はいじらなくてよい
    class RunInfo {
        String username;
        String progname;
    
        RunInfo(String u,String p){
    	this.username=u;
    	this.progname=p;
        }
    
        public void print(){
    	// 学籍番号, 氏名を表示する. 
    	System.err.println("# " 
    			   + "このプログラムの作成者は "
    			   + System.getProperty("user.name") 
    			   + " " 
    			   + this.username  + "です.");
    
    	// クラスと日時を表示する 
    	System.err.println("# "
    			   +"課題" + this.progname  + "の"
    			   +  (new Date()).toString() // from java.util.Date
    			   + "の実行結果です." );
    	
        }
    
    }
    
    
    		  
  5. gnuplot による plot をしてみよう. いったん, datafile.1 のような形に保存すると, いろいろな見方ができます.
    % gnuplot gnuplot> plot [-10:10] [-5:5] "datafile.1" using 2:3 with points # datafile.1 の 2列目を x, 3列目を y と見なして, # -10< x < 10, -5 < y < 5 の範囲で, 点々(points)で グラフ作成 gnuplot> plot "datafile.1" every 20 using 1:3 with points # 20行ごと(空行含まず)にデータを読み取ってグラフを描く. gnuplot> plot "datafile.1" every :::2::2 using 2:3 with points # 改行のみの行をブロックの区切りと見なしたとき, # 2番目のブロックだけについてグラフを描く. gnuplot> set hidden3d gnuplot> splot "datafile.1" with line # 3次元グラフ作成 gnuplot> plot "datafile.1" # でもそれなりにやってくれる.
    下の内容を, looper.gp
    plot [0:5][-3:3] "datafile.1" every :::i::i u 2:3  with points
    # x が 0 から 5, y が -3 から 3 の範囲で, datafile.1 の i 番目のブロックを
    # 2列目を x 座標, 3列目を座標として, 点々(points)で グラフ作成
    i=i+1
    pause 0.2 
    if(i<100) reread
    
    下の内容を plot.gp
    i=0
    load "looper.gp"
    
    として保存しましょう.
    % gnuplot gnuplot> load "plot.gp"
    とすると, アニメーション(のようなもの)がみられます.

    2001年度の特別研究のページ にもうすこし細い説明.

  6. クラス Program01_01 にメソッド double g1(double y) double g2(double y) を追加し, ダランベールの解 f(x,t)=g1(x-vt)+g2(x+vt) のグラフを描こう. 次のような g1,g2 を試そう.
    1. g1(y)=0, g2(y)=y-1 (1 < y < 2 のとき), 3-y (2 < y < 3 のとき), 0 (それ以外).
    2. g2 は上と同じ. g1 は, Dirichlet 境界条件 f(0,t)=0 が満たされるように定める.
  7. 数の組 (an,bn) に対する漸化式 an+1=(an+bn)/2, bn+1=(an*bn)1/2 を考える. Java と gnuplot を用いて, 横軸を n, 縦軸を an,bn とするグラフを描こう. 例えば, n=1,..,99, a0=100,b0=1 で.

Copyright © 2002 Saburo Higuchi. All rights reserved.
Saburo HIGUCHI, hig mail address
最後の更新は 2002/04/11 Thu 18:17 JST より前ではないはず…