@LiuYongJie
2016-11-20T13:02:39.000000Z
字数 8449
阅读 329
The billiard system can also be a chaotic system. In this problem, I will try to solve the trajectories of different kinds of tables and show the phase diagram to see whether the system is chaotic or not.
In this problem, I will not consider the effect of friction, which means the billiard ball will move without friction on a perfect billiard table.
Except for the collisions with the walls, the motion of the billiard is quite simple. Between collisions the velocity is constant so we have:
根据课本p82,可知球的运动方程为:
import matplotlib.pylab as pltimport timefrom math import *start_time = time.time()print 'Exercise 3.31 V1.0'print 'Designed by roach'dt=0.001def calculate():c_x.append(initial_x)c_y.append(initial_y)c_vx.append(initial_vx)c_vy.append(initial_vy)c_t.append(0)for i in range(10000):c_x.append(c_x[i]+c_vx[i]*dt)c_y.append(c_y[i]+c_vy[i]*dt)c_vx.append(c_vx[i])c_vy.append(c_vy[i])c_t.append(c_t[i]+dt)if c_x[-1]>1.0 or c_x[-1]<-1.0:c_vx[-1]=-c_vx[-1]if c_y[-1]>1.0 or c_y[-1]<-1.0:c_vy[-1]=-c_vy[-1]return 0c_x=[]c_y=[]c_vx=[]c_vy=[]c_t=[]initial_x=0.2initial_y=0.0initial_vx=1.0initial_vy=1.2calculate()print 'Total time',c_t[-1]print 'Time used',time.time() - start_time,'s'plt.figure(figsize=(20,20))plt.scatter(c_x,c_y,s=1)plt.title('Exercise 3.31')plt.xlabel("x")plt.ylabel("y")plt.xlim(-1,1)plt.ylim(-1,1)plt.legend()plt.show()

import matplotlib.pylab as pltimport timefrom math import *start_time = time.time()print 'Exercise 3.31 V1.0'print 'Designed by roach'dt=0.001def calculate():c_x.append(initial_x)c_y.append(initial_y)c_vx.append(initial_vx)c_vy.append(initial_vy)c_t.append(0)n=0for i in range(1000000):c_x.append(c_x[i]+c_vx[i]*dt)c_y.append(c_y[i]+c_vy[i]*dt)c_vx.append(c_vx[i])c_vy.append(c_vy[i])c_t.append(c_t[i]+dt)if c_x[-1]>1.0 or c_x[-1]<-1.0:c_vx[-1]=-c_vx[-1]if c_y[-1]>1.0 or c_y[-1]<-1.0:c_vy[-1]=-c_vy[-1]if c_x[-1]**2+c_y[-1]**2<0.5**2 and n>10:v_vertical=c_vx[-1]*c_x[-1]/0.5+c_vy[-1]*c_y[-1]/0.5v_verticalx=v_vertical*c_x[-1]/0.5v_verticaly=v_vertical*c_y[-1]/0.5v_parallelx=c_vx[-1]-v_verticalxv_parallely=c_vy[-1]-v_verticalyv_verticalx=-v_verticalxv_verticaly=-v_verticalyc_vx[-1]=v_verticalx+v_parallelxc_vy[-1]=v_verticaly+v_parallelyn=0n=n+1return 0c_x=[]c_y=[]c_vx=[]c_vy=[]c_t=[]initial_x=0.6initial_y=0.0initial_vx=1.0initial_vy=1.2calculate()print 'Total time',c_t[-1]print 'Time used',time.time() - start_time,'s'plt.figure(figsize=(20,20))plt.scatter(c_x,c_y,s=1)plt.title('Exercise 3.31')plt.xlabel('x')plt.ylabel('y')plt.xlim(-1.2,1.2)plt.ylim(-1.2,1.2)plt.legend()plt.show()

ball condition(0.8,0.0) vx = 1.73205080757 vy = 1.0
circle condition (-0.1,0.3) r = 0.3
import matplotlib.pylab as pltimport timefrom math import *start_time = time.time()##circle not in the middleprint 'Exercise 3.31 V2.0'print 'Designed by roach'#calculate circle conditiondef calculate():c_x.append(initial_x)c_y.append(initial_y)c_vx.append(initial_vx)c_vy.append(initial_vy)c_t.append(0)n=0for i in range(100000):c_x.append(c_x[i]+c_vx[i]*dt)c_y.append(c_y[i]+c_vy[i]*dt)c_vx.append(c_vx[i])c_vy.append(c_vy[i])c_t.append((i+1)*dt)#range squareif c_x[-1]>1.0 or c_x[-1]<-1.0:c_vx[-1]=-c_vx[-1]if c_y[-1]>1.0 or c_y[-1]<-1.0:c_vy[-1]=-c_vy[-1]#range circleif (c_x[-1]-circle_cx)**2+(c_y[-1]-circle_cy)**2<circle_r**2 and n>5:v_vertical=c_vx[-1]*(c_x[-1]-circle_cx)/circle_r+c_vy[-1]*(c_y[-1]-circle_cy)/circle_rv_verticalx=v_vertical*(c_x[-1]-circle_cx)/circle_rv_verticaly=v_vertical*(c_y[-1]-circle_cy)/circle_rv_parallelx=c_vx[-1]-v_verticalxv_parallely=c_vy[-1]-v_verticalyv_verticalx=-v_verticalxv_verticaly=-v_verticalyc_vx[-1]=v_verticalx+v_parallelxc_vy[-1]=v_verticaly+v_parallelyn=0n=n+1return 0#calculate ellipse conditiondef calculate2():c_x.append(initial_x)c_y.append(initial_y)c_vx.append(initial_vx)c_vy.append(initial_vy)c_t.append(0)n0=0for i in range(100000):c_x.append(c_x[i]+c_vx[i]*dt)c_y.append(c_y[i]+c_vy[i]*dt)c_vx.append(c_vx[i])c_vy.append(c_vy[i])c_t.append((i+1)*dt)#range squareif c_x[-1]>1.0 or c_x[-1]<-1.0:c_vx[-1]=-c_vx[-1]if c_y[-1]>1.0 or c_y[-1]<-1.0:c_vy[-1]=-c_vy[-1]#range ellipseif ((c_x[-1]-circle_cx)/circle_a)**2+((c_y[-1]-circle_cy)/circle_b)**2<1.0 and n0>5:theta1=acos((c_x[-1]-circle_cx)/circle_a)theta2=asin((c_y[-1]-circle_cy)/circle_b)kx=circle_a*sin(theta1)ky=circle_b*cos(theta2)nx=abs(ky/(kx**2+ky**2)**0.5)ny=abs(kx/(kx**2+ky**2)**0.5)if c_x[-1]-circle_cx<0 and c_y[-1]-circle_cy<0:nx=-nxny=-nyelif c_x[-1]-circle_cx>0 and c_y[-1]-circle_cy<0:ny=-nyelif c_x[-1]-circle_cx<0 and c_y[-1]-circle_cy>0:nx=-nx# plt.plot([c_x[-1]-nx*0.1,c_x[-1]+nx*0.1],[c_y[-1]-ny*0.1,c_y[-1]+ny*0.1])v_vertical=c_vx[-1]*nx+c_vy[-1]*nyv_verticalx=v_vertical*nxv_verticaly=v_vertical*nyv_parallelx=c_vx[-1]-v_verticalxv_parallely=c_vy[-1]-v_verticalyv_verticalx=-v_verticalxv_verticaly=-v_verticalyc_vx[-1]=v_verticalx+v_parallelxc_vy[-1]=v_verticaly+v_parallelyn0=0# plt.plot([c_x[-1]-nx*0.1,c_x[-1]+nx*0.1],[c_y[-1]-ny*0.1,c_y[-1]+ny*0.1])n0=n0+1return 0c_x=[]c_y=[]c_vx=[]c_vy=[]c_t=[]#Initial conditionsdt=0.001initial_x=0.8initial_y=0.0initial_vx=1.0*cos(45*pi/180)initial_vy=1.0*sin(45*pi/180)circle_cx=-0.1circle_cy=0.3circle_r=0.0 #No use for circle r#ellipse conditioncircle_a=0.5circle_b=0.3print 'ball condition x =',initial_x,' y =',initial_yprint ' vx =',initial_vx,' vy =',initial_vy#if it is a circleif circle_a == circle_b:circle_r = circle_aprint 'circle condition x =',circle_cx,' y =',circle_cyprint ' r =',circle_rcalculate()plt.figure(figsize=(20,20))plt.scatter(initial_x,initial_y,color='blue',label='initial position')plt.scatter(c_x,c_y,s=1,label='trajectory',color ='red')plt.title('Exercise 3.31 circle x='+str(circle_cx)+' y='+str(circle_cy)+' r='+str(circle_r))plt.xlabel('x(length unit)')plt.ylabel('y(length unit)')plt.xlim(-1.2,1.2)plt.ylim(-1.2,1.2)#draw a squareplt.plot([1,-1,-1,1,1],[1,1,-1,-1,1],color='black',label='range')#draw a circlecircle_x=[]circle_y=[]for i in range(510):circle_x.append(circle_r*cos(i*pi/250.0)+circle_cx)circle_y.append(circle_r*sin(i*pi/250.0)+circle_cy)plt.plot(circle_x,circle_y,color='black',label=None)plt.legend()#total time usedprint 'Total time',c_t[-1],'time unit'print 'Time used',time.time() - start_time,'s'plt.show()#if it is a ellipseelse:#swap a and bif circle_a<circle_b:conditionb = circle_aconditiona = circle_bconditione = (1-(conditionb/conditiona)**2)**0.5print 'ellipse condition x =',circle_cx,' y =',circle_cyprint ' a =',conditiona,' b =',conditionbprint ' e =',conditioneprint ' a parallel y axis'else:conditiona = circle_aconditionb = circle_bconditione = (1-(conditionb/conditiona)**2)**0.5print 'ellipse condition x =',circle_cx,' y =',circle_cyprint ' a =',circle_a,' b =',circle_bprint ' e =',(conditiona**2-conditionb**2)**0.5/conditionaprint ' a parallel x axis'calculate2()plt.figure(figsize=(20,20))plt.scatter(initial_x,initial_y,color='blue',label='initial position')plt.scatter(c_x,c_y,s=1,label='trajectory',color ='red')plt.title('Exercise 3.31 ellipse x='+str(circle_cx)+' y='+str(circle_cy)+' x_='+str(circle_a)+' y_='+str(circle_b)+' e='+str(conditione))plt.xlabel('x(length unit)')plt.ylabel('y(length unit)')plt.xlim(-1.2,1.2)plt.ylim(-1.2,1.2)#draw a squareplt.plot([1,-1,-1,1,1],[1,1,-1,-1,1],color='black',label='range')#draw a circleellipse_x=[]ellipse_y=[]for i in range(510):ellipse_x.append(circle_a*cos(i*pi/250.0)+circle_cx)ellipse_y.append(circle_b*sin(i*pi/250.0)+circle_cy)plt.plot(ellipse_x,ellipse_y,color='black',label=None)plt.legend()#total time usedprint 'Total time',c_t[-1],'time unit'print 'Time used',time.time() - start_time,'s'plt.show()

Ths chaotic system will present when the boundary is composed by some shapes (different or same). If the boundary is a simple regular shape, the chaotic situation cannot be observed.