倒立振子
public void run(){ //スレッドによる時間進行 boolean cont=true; st = new State(); inum=0; while(cont){ st.Next();//次に時刻の値 xp[inum]=(int)(st.Xp*200.0); ang[inum]=(int)(st.Ang*1000.0); repaint(); inum++; if(inum>=180) cont=false; try{ Thread.sleep(100); } catch(Exception e){} } System.out.println("Thread out\n"); }paint()でグラフ表示、drawPend()で振り子のアニメーションをします。三角印は原点を表示しています。
public void Next() { //次の時刻の値を求める double vu; vu = ck1 * Ang + ck2 * dAng + ck3 * Xp + ck4 * dXp; ddAng = ca * Ang + cc * vu; dAng += ddAng * step; Ang += dAng * step; ddXp = cb * Ang + cd * vu; dXp += ddXp * step; Xp += dXp * step; Time += step; }ソースはこちらをご覧下さい。