class BlackholeCalculator{
double dr;
//変数、定数の宣言
double x,y;
double EPS_TURN=0.0000001;
double EPS_BH=0.00001;
double t=0;
double
x0=10.0;
//初期状態
double
xold=x0;
//一つ前のx1
double
x1=x0;
//x1の初期状態
double
x2=Math.asin(b/x0);
//x2の初期状態
double fugo=-1.0;
double b=5.2;
//衝突係数
public BlackholeCalculator(){
}
private double diff_eq1(double t, double x1, double x2,double fugo,double b){
return
fugo*(1.0-(1.0/this.x1))*Math.sqrt(1.0-((this.b*this.b)/(this.x1*this.x1))
+((this.b*this.b)/(this.x1*this.x1*this.x1)));} //微分方程式1
private double diff_eq2(double t, double x1, double x2,double b){
//微分方程式2
return (1.0-(1.0/this.x1))*((this.b/(this.x1*this.x1))); }
public void step(){
double dt=0.1*Math.sqrt(((x1*x1*x1)-(b*b)*(x1-1.0))/(x1*x1*x1));
//刻み幅dt
double k1=diff_eq1(t,x1,x2,fugo,b);
//ルンゲ・クッタ法
double l1=diff_eq2(t,x1,x2,b);
double k2=diff_eq1(t+0.5*dt,x1+0.5*k1*dt,x2+0.5*l1*dt,fugo,b);
double l2=diff_eq2(t+0.5*dt,x1+0.5*k1*dt,x2+0.5*l1*dt,b);
double k3=diff_eq1(t+0.5*dt,x1+0.5*k2*dt,x2+0.5*l2*dt,fugo,b);
double l3=diff_eq2(t+0.5*dt,x1+0.5*k2*dt,x2+0.5*l2*dt,b);
double k4=diff_eq1(t+dt,x1+k3*dt,x2+l3*dt,fugo,b);
double l4=diff_eq2(t+dt,x1+k3*dt,x2+l3*dt,b);
x1=x1+(1/6.0)*(k1+2.0*k2+2.0*k3+k4)*dt;
x2=x2+(1/6.0)*(l1+2.0*l2+2.0*l3+l4)*dt;
this.dr=this.x1-this.xold; //現在のx1と一つ前のx1の差分
if(Math.abs(this.dr)<=this.EPS_TURN){this.fugo=1.0;} //もしdrの絶対値がある値以下であればfugoを変える
this.xold=this.x1;
//xoldの更新
this.x=x1*Math.cos(x2); //直角座標に変換
this.y=x1*Math.sin(x2);
}
public double gett(){ //各変数を取得するメソッド
return this.t;
}
public double getx(){
return this.x;
}
public double gety(){
return this.y;
}
public double getx1(){
return this.x1;
}
}