Haskell を使用して Verlet インテグレーターを作成し、重力をモデル化しています。インテグレータは、オブジェクトの最初の 2 つの位置をシードとして使用し、その後残りを生成します。
Haskell でこれを行う良い方法は、無限リストを使用することだと思いました。ただし、実装すると、長時間非常にゆっくりと実行されることがわかりました (Haskell 1700 のタイム ステップ: 12 秒、Python 1700 のタイム ステップ: < 1 秒)。
同様のパフォーマンスを持つ 1 次元積分器の関連コードを次に示します。
verletStep dt acc xn xn1 = 2*xn1 - xn + (acc xn1)*dt*dt
verlet dt acc x0 x1 = x0 : x1 : next (verlet dt acc x0 x1)
where
next (xn : xs@(xn1:_)) = (verletStep dt acc xn xn1) : next xs
無限リストの生成にも使用zipWith
してみましたが、同様のパフォーマンスが得られます。
なぜこれに時間がかかるのですか?ガベージ コレクション自体は約 5 秒です。これをより速く実行する良い方法はありますか?