[PYTHON] [Théorème récursif de Poankare] J'ai essayé de jouer avec 100 balanciers de serpent étendus à un long cycle ♬

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.

Simulation de 100 pièces par danse pendant 120 secondes

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 "

Simulation de 15 morceaux par danse pendant 120 secondes

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

Résumé

-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

prime

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)

Enregistrer la vidéo

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

[Théorème récursif de Poankare] J'ai essayé de jouer avec 100 balanciers de serpent étendus à un long cycle ♬
[Introduction à AWS] J'ai essayé de jouer avec la conversion voix-texte ♪
J'ai essayé d'implémenter une ligne moyenne mobile de volume avec Quantx
J'ai essayé de résoudre le problème d'optimisation des combinaisons avec Qiskit
J'ai essayé de commencer avec Hy ・ Définir une classe
J'ai essayé de trier une colonne FizzBuzz aléatoire avec un tri à bulles.
J'ai essayé d'écrire dans un modèle de langage profondément appris
[5e] J'ai essayé de créer un certain outil de type Authenticator avec python
[2nd] J'ai essayé de créer un certain outil de type Authenticator avec python
Un mémorandum lors de l'acquisition automatique avec du sélénium
[3ème] J'ai essayé de créer un certain outil de type Authenticator avec python
[Python] Un mémo que j'ai essayé de démarrer avec asyncio
J'ai essayé de créer une liste de nombres premiers avec python
J'ai essayé de faire un processus d'exécution périodique avec Selenium et Python
J'ai essayé de créer une application de notification de publication à 2 canaux avec Python
J'ai essayé de créer des taureaux et des vaches avec un programme shell
J'ai essayé de créer une application todo en utilisant une bouteille avec python
[4th] J'ai essayé de créer un certain outil de type Authenticator avec python
[1er] J'ai essayé de créer un certain outil de type Authenticator avec python
J'ai essayé de faire une étrange citation pour Jojo avec LSTM
J'ai essayé de créer un mécanisme de contrôle exclusif avec Go
J'ai essayé de mettre en œuvre une blockchain qui fonctionne réellement avec environ 170 lignes
J'ai essayé de créer un programme qui convertit les nombres hexadécimaux en nombres décimaux avec python
J'ai essayé de créer un plug-in avec HULFT IoT Edge Streaming [Development] (2/3)
J'ai essayé de créer un LINE BOT "Sakurai-san" avec API Gateway + Lambda
J'ai écrit un diagramme de configuration du système avec des diagrammes sur Docker
J'ai essayé de faire un signal avec Raspeye 4 (édition Python)
J'ai essayé de créer un plug-in avec HULFT IoT Edge Streaming [Execution] (3/3)
J'ai essayé d'envoyer un e-mail de fin d'inscription depuis Gmail avec django.
[Outlook] J'ai essayé de créer automatiquement un e-mail de rapport quotidien avec Python
J'ai essayé de créer un plug-in avec HULFT IoT Edge Streaming [Setup] (1/3)
J'ai essayé de créer un environnement de développement Mac Python avec pythonz + direnv
J'ai essayé de créer un service de raccourcissement d'url sans serveur avec AWS CDK
J'ai essayé d'implémenter le jeu de cartes de Trump en Python
J'ai essayé de créer un linebot (implémentation)
J'ai essayé d'implémenter Autoencoder avec TensorFlow
J'ai essayé de créer un linebot (préparation)
J'ai essayé de visualiser AutoEncoder avec TensorFlow
J'ai essayé de commencer avec Hy
J'ai essayé de jouer au jeu ○ ✕ en utilisant TensorFlow
J'ai essayé un langage fonctionnel avec Python
J'ai essayé d'implémenter CVAE avec PyTorch
J'ai essayé de jouer avec l'image avec Pillow
J'ai créé une API Web
J'ai essayé de résoudre TSP avec QAOA
J'ai essayé de faire un processus périodique avec CentOS7, Selenium, Python et Chrome
J'ai fait une application d'envoi de courrier simple avec tkinter de Python
Quand j'ai essayé de créer un VPC avec AWS CDK mais que je n'ai pas pu le faire
[Analyse des brevets] J'ai essayé de créer une carte des brevets avec Python sans dépenser d'argent
Quand j'ai essayé de créer un environnement virtuel avec Python, cela n'a pas fonctionné
J'ai créé une API de recherche de château avec Elasticsearch + Sudachi + Go + echo
J'ai essayé de créer facilement un système de présence entièrement automatique avec Selenium + Python