Puisqu'il s'agit d'un jeu de masse, je pense qu'il n'a pas de sens (naturel), mais compte tenu de la série de planètes, je pense que de tels calculs sont réellement significatifs, je vais donc les résumer. Après tout, le théorème récursif de Poancare. Je me suis rappelé que le système dynamique est significatif en tant qu'exemple concret de "si certaines conditions sont remplies, il reviendra presque à son état initial arbitraire dans un temps fini". De plus, nous ne calculerons ni ne simulerons la série des planètes cette fois. Donc, cette fois, je voudrais changer librement le nombre et le cycle de formule précédente.
Et c'est une extension dans le cas de 100 pièces. Ce n'est pas possible avec la formule précédente, alors changez-la comme suit.
N = 60
z0 =500
L0=980*(120/130)**2/(2*np.pi)**2
Fc0=1.0
Fc=[]
fc=1
Fc.append(fc)
for i in range(1,100,1):
fc=fc*((131-i)/(130-i))
Fc.append(fc)
De plus, comme il a été restauré en 120 secondes, le résultat est le suivant.
J'ai essayé de jouer en simulant 100 pendules de serpent ♬ <img src="http://img.youtube.com/vi/cDJWJdXN4Q4/0.jpg "
Cette fois, dansons 15 pendules d'une durée de 120 secondes. Cela montre que pratiquement n'importe quel nombre, longueur et période de pendule peut être conçu. [Serpent pendulum] J'ai fait une simulation de 15 morceaux pendant 120 secondes par danse et j'ai joué avec with <img src="http://img.youtube.com/vi/oe34YS3I5QE/0.jpg " Le code principal pourrait être réalisé ci-dessous.
N = 60
L0=980*(120/65)**2/(2*np.pi)**2 #120 ici/65 sur 120 est important
print(L0, 2*np.pi/np.sqrt(980/L0))
Fc0=1.0
z0 =150
Fc=[]
fc=1
Fc.append(fc)
for i in range(1,15,1):
fc=fc*((66-i)/(65-i)) #65/Ajustez le décalage de chacun avec 64
Fc.append(fc)
dataz=[]
linez=[]
y=0
for j in range(15):
y += 2 #Espacement sur l'axe y du pendule
dataz0 = np.array(list(genxy(N,L=L0*Fc[j]**2,z0=z0,y0=y))).T
linez0, = ax.plot(dataz0[0, 0:1], dataz0[1, 0:1], dataz0[2, 0:1],'o')
dataz.append(dataz0)
linez.append(linez0)
Par rapport au précédent, le générateur a été dilaté de manière à pouvoir être agencé dans la direction de l'axe y comme suit.
def genxy(n,L=20,z0=0,y0=0):
phi = 0
g = 980
x0=5 #2.5
omega = np.sqrt(g/L)
theta0 = np.arcsin(x0/L)
while phi < 600:
yield np.array([L*np.sin(np.sin(phi*omega+np.pi/2)*theta0), y0,z0-L+L*(1-np.cos(np.sin(phi*omega+np.pi/2)*theta0))])
phi += 1/n
-Augmentation du nombre et de la longueur des pendules de serpent afin qu'ils puissent être librement modifiés. ・ La puissance écrasante de 100 pièces et le long cycle de 120 secondes sont intéressants en termes d'appréciation.
・ Je voudrais simuler la réalisation du théorème récursif de Poancare dans le monde naturel comme les séries planétaires. ・ Je veux réaliser un vrai pendule de serpent dans un cycle libre
from matplotlib import pyplot as plt
import numpy as np
import mpl_toolkits.mplot3d.axes3d as p3
from matplotlib import animation
fig, ax = plt.subplots(1,1,figsize=(1.6180 * 4, 4*1),dpi=200)
ax = p3.Axes3D(fig)
def genxy(n,L=20,z0=0,y0=0):
phi = 0
g = 980
x0=5
omega = np.sqrt(g/L)
theta0 = np.arcsin(x0/L)
while phi < 600:
yield np.array([L*np.sin(np.sin(phi*omega+np.pi/2)*theta0), y0,z0-L+L*(1-np.cos(np.sin(phi*omega+np.pi/2)*theta0))])
phi += 1/n
def update(num, data, line,s):
line.set_data(data[:2,num-1 :num])
line.set_3d_properties(data[2,num-1 :num])
ax.set_xticklabels([])
ax.grid(False)
N = 60
L0=980*(120/65)**2/(2*np.pi)**2
print(L0, 2*np.pi/np.sqrt(980/L0)) #84.6cm 1.846sec
Fc0=1.0 #omega=2pi/T
z0 =150
Fc=[]
fc=1
Fc.append(fc)
for i in range(1,15,1):
fc=fc*((66-i)/(65-i))
Fc.append(fc)
dataz=[]
linez=[]
y=0
for j in range(15):
y += 2
dataz0 = np.array(list(genxy(N,L=L0*Fc[j]**2,z0=z0,y0=y))).T
linez0, = ax.plot(dataz0[0, 0:1], dataz0[1, 0:1], dataz0[2, 0:1],'o')
dataz.append(dataz0)
linez.append(linez0)
# Setting the axes properties
ax.set_xlim3d([-10., 10])
ax.set_xlabel('X')
ax.set_ylim3d([0.0, 30.0])
ax.set_ylabel('Y')
ax.set_zlim3d([0.0, z0-L0])
ax.set_zlabel('Z')
elev=0 #20.
azim=90 #35.
ax.view_init(elev, azim)
frames =60*120
fr0=60
s0=0
s=s0
while 1:
s+=1
num = s
for j in range(15):
update(num,dataz[j],linez[j],s0)
"""
if s%fr0==0:
print(s/fr0, s)
plt.pause(0.001)
"""
if s%(fr0/10)==0:
ax.set_title("s={}_sec".format(int(10*s/fr0)/10),loc='center')
plt.pause(0.001)
print(s/fr0)
plt.savefig('./pendulum/'+str(int(10*s/fr0))+'.png')
if s>=s0+frames:
break
s0=30*120
s=s0+30*120
fr0=60
from PIL import Image,ImageFilter
images = []
for n in range(1,1201,1):
exec('a'+str(n)+'=Image.open("./pendulum/'+str(n)+'.png ")')
images.append(eval('a'+str(n)))
images[0].save('./pendulum/pendulum_{}_.gif'.format(100),
save_all=True,
append_images=images[1:],
duration=100,
loop=1)
Je ne peux pas coller l'animation gif, alors enregistrez le fichier mp4 avec le code suivant et téléchargez-le sur youtube.
from matplotlib import pyplot as plt
import numpy as np
import mpl_toolkits.mplot3d.axes3d as p3
import cv2
def cv_fourcc(c1, c2, c3, c4):
return (ord(c1) & 255) + ((ord(c2) & 255) << 8) + \
((ord(c3) & 255) << 16) + ((ord(c4) & 255) << 24)
OUT_FILE_NAME = "output_video.mp4"
fourcc = cv2.VideoWriter_fourcc('m', 'p', '4', 'v')
dst = cv2.imread('./pendulum/1.png')
rows,cols,channels = dst.shape
out = cv2.VideoWriter(OUT_FILE_NAME, int(fourcc), int(10), (int(cols), int(rows)))
from PIL import Image,ImageFilter
for n in range(1,1201,1):
dst = cv2.imread('./pendulum/'+str(n)+'.png')
out.write(dst) #Sortie vers mp4 ou avi
Recommended Posts