1

Python での verlet アルゴリズムの実装に問題があります。私はこのコードを試しました:

x[0] = 1
v[0] = 0
t[0] = 0
a[0] = 1
for i in range (0, 1000):
    x[i+1] = x[i] - v[i] * dt + (a[i] * (dt**2) * 0.5)
    v[i] = (x[i+1] - x[i-1]) * 0.5 * dt
    t[i+1] = t[i] + dt

しかし、それは正しく機能していません。なにが問題ですか?Verlet アルゴリズムの一般的なコードを探しています。

4

2 に答える 2

3

あなたの質問はあまり明確ではありませんが、コードにはエラーの原因がいくつかあります。

例: 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]xx[-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通常、関連する力の式を使用して他のパラメータから計算されるため、値を実際にリストに格納する必要はありません。

于 2015-03-12T13:11:10.363 に答える