差分解法の安定性, Javaでのコマンドラインオプション, 弦の振動の散乱と反射

目次 解答例(ないかも) 締切は 05/24. 今回は重点問題はありません. 03_01 を完成させることを 優先しましょう. それさえできれば, 他のもすぐできちゃうと思う.

コメント のような部分は 実際には現れないここだけの説明. 1234 のような斜体の部分は, 人や場合によって変化したり, 自分で決めたりする部分. given のような太字の部分は, 最初からあるので新たに入力する必要のない部分.

課題04_01

課題 03_01 のクラス(を完成させたもの) を継承して, 次のようなクラス Sample04_01 をつくる(加筆不要).

class Sample04_01 extends Sample03_01 {

    public void initialize_parameters(String[] args){ // 引数をとることにしました
	xmin=0.0; xmax=1.0; xinterval=40;
	tmin=0.0; tmax=3.0; tinterval=300;
	v=2.0;

	//  加筆はじまり
	int i=0;
	while ( (i < args.length ) && ( (args[i]).startsWith("-"))){
	    switch( args[i].charAt(1) ){
	    case 'X':
		i++;
		xinterval=Integer.parseInt(args[i]);
		break;
	    case 'T':
		i++;
		tinterval=Integer.parseInt(args[i]);
		break;
	    case 't':
		i++;
		tmax=Double.parseDouble(args[i]);
		break;
	    default:
		System.err.println("間違ったオプションです.");
		break;
	    }
	    i++;
	}    
	//  加筆おしまい

	dx=(xmax-xmin)/(double)xinterval;
	dt=(tmax-tmin)/(double)tinterval;
	v2=(v*dt/dx)*(v*dt/dx);


	return;//nothing
    }

    public static void main(String[] args){
	String myName = "香山リカ";

	Sample04_01 prog= new Sample04_01(); // ここを変更しました.
	RunInfo info= new RunInfo(myName, prog.getClass().getName());
	info.print();

	prog.initialize_parameters(args); // ここを変更しました.
	prog.initialize_fields();
	prog.exec();
	return;//nothing
    }


}

すると,

s1609h111% java Sample04_01 -X 100 -T 200 -t 2.0 > datafile.1
のように実行することにより, 再コンパイルせずに, xinterval を 100, tinterval を 200, tmax を 2.0 に変更して実行できます. 上でいう, -X, -T, -t などを, コマンドラインオプションといいます.

コマンドラインオプションを指定して, 次の組合わせが安定かどうかを調べよう. なぜ安定か, 不安定か, 説明しよう.

課題04_02

次のような弦の振動を考えよう.

v=2.0, 0.0 ≤ x ≤ 1.0, 0.0 ≤ t ≤ 1.0.

境界条件は固定端 f(0.0,t)=f(1.0,t)=0

初期条件は, x ≤ 0.8 ではf=df/dt=0. x > 0.8 では f(x,0)=2sin3(10 π (x-0.8)), df/dt(x,0)=120 πsin2(10 π(x-0.8)) cos(10 π(x-0.8))

ただし, 弦は, 板におさえられていて, |f(x,t)| ≤ 0.2 (0 ≤ x ≤ 0.5), |f(x,t)| ≤ 0.2 + 50*(x-0.5)*(x-0.5) (0.5 &le x ≤ 1.0) の範囲でしか動けないとしよう.

課題 03_01 のクラス(を完成させたもの) を書き変えて, あるいは課題 04_01 のクラスを継承して, Sample04_02.java を作成し, このように部分的に板におさえられた弦の振動の様子をアニメーションしよう. 何が起きるでしょう? 板におさえられているということは, 数値計算では, これは, 差分解法の式から範囲外の f の値が得られたときには, 強制的に範囲ぎりぎりの値に変更するということで実現できる (これは, 板からの抗力を表している)

きれいに見えるには, xinterval=100, tinterval=150, tmax=0.5 くらいではいかが?

アニメーションは次のように行おう. 次の内容を, ファイル looper.gp として保存.

plot [0:1][-2:2] "$0" every :::i::i using 2:3  , ( x > 0.5 ? 0.2+50*(x-0.5)*(x-0.5) : 0.2 ) t "plate" w l 1 , ( x > 0.5 ? -(0.2+50*(x-0.5)*(x-0.5) ) : -0.2) t "plate" w l 1
i=i+1
pause 0.4 
if(i < $1) reread
pause 2
i=0
次に実行.
s1609h111% gnuplot
gnuplot> i=0; call "looper.gp" "datafile.1" 150
# looper.gp で, datafile.1 を,  150コマのアニメーション


Copyright © 2002 Saburo Higuchi. All rights reserved.
Saburo HIGUCHI, hig mail address
最後の更新は次の日時よりあとのはず…: 2002/05/02 Thu 09:54