あなたの質問はあまり明確ではありませんが、コードにはエラーの原因がいくつかあります。
例: i
> 0
x[i+1] = x[i]-v[i]*dt+(a[i]*(dt**2)*0.5)
の値を使用しようとしますが、その要素はリストv[i]
にまだ存在しません。v
具体的な例を挙げると、i
= 1 の場合は が必要ですがv[1]
、v
その段階でリストにあるのはv[0]
;だけです。v[1]
次の行まで計算されません。
このエラーにより、Python インタープリターがエラー メッセージを表示するはずです。
IndexError: list index out of range
Stack Overflow でヘルプを求める場合は、できれば次の行から始まるエラー メッセージを質問とともに投稿してください。
Traceback (most recent call last):
これにより、質問を読んでいる人がコードをデバッグしやすくなります。
FWIW、for
ループの最初の反復でi
== 0 の場合、その段階でリストに2 つの要素があるため、両方が同じ要素を参照しているx[i+1]
ため、.x[i-1]
x
x[-1]
x[1]
t
また、値をリストに格納しているのは奇妙です。その必要はありません。t
単純なfloat
値として保存しdt
、ループのたびにインクリメントします。t
それ自体はどの計算にも使用されないことに注意してください。ただし、印刷することもできます。
Basic Störmer–VerletまたはVelocity Verletのいずれかについて、式がウィキペディアのページに記載されている式と一致していないようです。たとえば、先ほど引用したコード行では、減算v[i]*dt
していますが、加算する必要があります。
おそらく、関連するLeapfrog 統合メソッドの実装を検討する必要があります。Leapfrog の同期バージョンは、コーディングが簡単で、非常に効果的な IME です。
ウィキペディアのリンクから:
x[i+1] = x[i] + v[i] * dt + 0.5 * a[i] * dt * dt
v[i+1] = v[i] + 0.5 * (a[i] + a[i+1]) * dt
a
通常、関連する力の式を使用して他のパラメータから計算されるため、値を実際にリストに格納する必要はありません。