Da es sich um ein Massenspiel handelt, halte ich es für bedeutungslos (natürlich), aber angesichts der Reihe von Planeten denke ich, dass solche Berechnungen tatsächlich sinnvoll sind, also werde ich sie zusammenfassen. Immerhin Poancares rekursiver Satz. Ich erinnerte mich daran, dass das dynamische System als konkretes Beispiel für "Wenn bestimmte Bedingungen erfüllt sind, wird es innerhalb einer begrenzten Zeit fast in seinen willkürlichen Ausgangszustand zurückkehren" von Bedeutung ist. Außerdem werden wir diesmal die Planetenserie nicht berechnen und simulieren. Dieses Mal möchte ich die Anzahl und den Zyklus von [vorherige Formel] frei ändern (https://qiita.com/MuAuan/items/ecae5631dc8ff3831878).
Und es ist eine Erweiterung bei 100 Stück. Dies ist mit der vorherigen Formel nicht möglich. Ändern Sie sie daher wie folgt.
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)
Da es in 120 Sekunden wiederhergestellt wurde, ist das Ergebnis wie folgt.
Ich habe versucht zu spielen, indem ich 100 Schlangenpendel simuliert habe ♬ <img src="http://img.youtube.com/vi/cDJWJdXN4Q4/0.jpg "
Lassen Sie uns diesmal 15 Pendel mit einem Zeitraum von 120 Sekunden tanzen. Dies zeigt, dass praktisch jede Anzahl, Länge und Periode des Pendels entworfen werden kann. [Schlangenpendel] Ich habe eine Simulation von 15 Stücken für 120 Sekunden pro Tanz gemacht und damit gespielt ♬ <img src="http://img.youtube.com/vi/oe34YS3I5QE/0.jpg " Der Hauptcode könnte unten erreicht werden.
N = 60
L0=980*(120/65)**2/(2*np.pi)**2 #120 hier/65 120 ist wichtig
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/Passen Sie die Verschiebung von jedem mit 64 an
Fc.append(fc)
dataz=[]
linez=[]
y=0
for j in range(15):
y += 2 #Pendel-Y-Achsen-Abstand
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)
Im Vergleich zum vorherigen wurde der Generator so erweitert, dass er wie folgt in Richtung der y-Achse angeordnet werden kann.
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
・ Ich möchte die Realisierung des rekursiven Theorems von Poancare in der natürlichen Welt wie Planetenreihen simulieren. ・ Ich möchte ein echtes Schlangenpendel in einem freien Zyklus realisieren
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)
Da die GIF-Animation nicht eingefügt werden kann, speichere die MP4-Datei mit dem folgenden Code und lade sie auf YouTube hoch.
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) #Ausgabe an mp4 oder avi