Verlet Algorithmと呼ばれる特定のアルゴリズムをコーディングしようとしています。アルゴリズムを実行するたびに、x、v、Eと呼ばれる特定の変数の値が基本的に更新されます。複数の変数を持つループの場合 - 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])
基本的には、特定の初期条件が与えられている間に、x、v、Eの更新値を空のリストに追加することです。 、J = 1:
N = 4,16,128:DT = 0.1,0.01
は今私の問題は、私はオーバーループするよ私の変数は、多くの異なる値を持っているという事実から来ていますN/2
及びIは、Iが作成した各配列をプロットすることになっていて、以下に示す例は:N = 4
プロット、DT = 0.1、J = 1
(私のN付= 4ループ)
一つの問題は、私が実際にしたい一方で、私は、X1と呼ばれる、1つのリストにN = 1,2,3,4のすべての値を格納していますということです4つの別々のリストを持ちます.1つはNの各値に対して1つ、つまり繰り返します。 x1_N1、x2_N2、x3_N3、x4_N4。
でも、私がそれをしてもかなり素早くかなり面倒になるでしょう。例えば、N = 128の場合、グラフはdt = 0.01、j = 1、dt = 0.01、j = 1、dt = 0.01、j = N/2、 j = N/2))に128個のリストがあります。したがって、N = 4のために8つのループを作成する必要があります。
だから、このforループ内で新しいリストを作成して追加する方法はありますか?その外に空のリストを定義する必要はありませんか?
編集:コメントありがとうございました!
私は多くの結合振動子の運動方程式を解くためにVerletアルゴリズムを使用しています:
Hは、私のコード内の変数Eです。 Nは発振器の数です。 Dv/Dx = x_n - x_N-1が力である。
実際のアルゴリズムは、以下により行われます
τは私のコードではdtのです。
今、私は実際にこのコードでやっているのです:
正直に言うと、私は何であるかjを全くわからないんだけど!私はそれが位置変数xの初期条件を変更するために使用される変数だと思いますか?
もう一度ご協力いただきありがとうございます。
各変数の意味を説明できますか? 'N'はプロットする系列の数、' dt'は時間の増分ですが、 'j'は何ですか? – Adirio
また、 'x [N]'を使って 'v [i]'を計算するときにアルゴリズムの問題があると思います。 – Adirio
問題の物理に関するセクションを作成してください。エネルギー関数、力、加速は何で、なぜそれが保守的であるのですか? Leapfrog Verletメソッドを実装したいと思われますが、上に間違っているように見えます。間違った初期化では、次の1つのシンプレクティックなオイラー法が得られます。あなたは何を比較しているのですか? – LutzL