Je tente de coder un algorithme particulier, appelé l'algorithme de Verlet, qui met à jour les valeurs de certaines variables, appelées x, v et E, chaque fois que l'algorithme s'exécute.Pour les boucles avec plusieurs variables - Python
import matplotlib.pyplot as plt
import numpy as np
# set constants
k = 1
m = 1
#Set the number of iterations to be used in the for loop
no_of_iterations=1001
# make arrays to define the data
t = np.zeros(no_of_iterations)
x = np.zeros(no_of_iterations)
v = np.zeros(no_of_iterations)
E = np.zeros(no_of_iterations)
# set initial conditions
t[0] = 0
x[0] = 0
v[0] = 1
E[0] = 0
# make arrays to store data
x1=[]
v1=[]
E1=[]
'''N = 4 Loops'''
#loop for dt = 0.1,N = 4,j=1
for N in range(1,5,1):
for i in range(1,no_of_iterations):
j = 1
x[0]= np.sin((np.pi*j*k)/(N+1))
t_max = 100.0
dt = t_max/no_of_iterations #time step
t[i] = dt * i
v[i] = v[i-1] - ((dt *k/m*(x[N]-x[N-1]))/2)
x[i] = x[i-1] + dt * v[i]
E[i] = ((((v[i])**2)/2) + (x[N]-x[N-1]))
x1.append(x[i])
v1.append(v[i])
E1.append(E[i])
Essentiellement ce que cela fait est annexant les valeurs mises à jour de x, v et E pour vider les listes, alors que dans certaines conditions initiales.
Maintenant, mon problème vient du fait que mes variables que je bouclez ont beaucoup de valeurs différentes:
N = 4,16,128: dt = 0.1,0.01: j = 1, N/2
et je suis censé tracer chaque matrice créer, et l'exemple de ce qui est indiqué ci-dessous:
Terrain pour N = 4, dt = 0,1, j = 1
(Avec mon N = 4 boucles)
Un problème est que je stocke toutes les valeurs de N = 1,2,3,4 dans une liste, appelée x1, alors que je veux réellement avoir 4 listes séparées, une pour chaque valeur de N que je parcoure, ie. x1_N1, x2_N2, x3_N3, x4_N4. Mais même si je le fais, les choses deviendront plutôt désordonnées plutôt rapidement. Par exemple, avec N = 128, je devrais avoir 4 graphiques ((dt = 0.1 et j = 1), (dt = 0.01 et j = 1), (dt = 0.01 et j = N/2), (dt = 0.01 et j = N/2)) chacun avec 128 listes. Donc je devrais créer 8 boucles pour juste N = 4!
Alors, existe-t-il un moyen de créer une nouvelle liste dans cette boucle for et de l'ajouter, plutôt que de devoir définir une liste vide en dehors de celle-ci?
Edit: Merci les gars de commenter!
J'utilise l'algorithme Verlet pour résoudre l'équation de mouvement de plusieurs oscillateurs couplés:
H est la variable E dans mon code. N est le nombre d'oscillateurs. Dv/Dx = x_n - x_N-1 est la force.
L'algorithme réel est fait par ce qui suit:
où τ est dt dans mon code.
Maintenant, ce que je suis en train de faire avec ce code est:
Pour être honnête, je ne suis pas tout à fait sûr de ce que j est! Je pense que c'est juste une variable utilisée pour changer la condition initiale de la variable de position x?
Encore une fois merci pour votre aide!
Pouvez-vous expliquer ce que signifie chaque variable? 'N' est le nombre de séries à tracer,' dt' est l'incrément de temps, mais qu'est-ce que 'j'? – Adirio
Je pense aussi que vous avez un problème d'algorithme lorsque vous calculez 'v [i]' car vous utilisez 'x [N]' pour le calculer. – Adirio
S'il vous plaît faire une section purement sur la physique du problème. Quelle est la fonction d'énergie, la force, l'accélération, pourquoi est-ce conservateur. Il semble que vous souhaitiez implémenter la méthode de Leapfrog Verlet, mais il semble que ce soit mal fait. Avec une initialisation erronée, vous obtenez l'ordre 1 méthode Euler symplectique. Quelles sont exactement les différentes courses, que comparez-vous? – LutzL