我是 Haskell 的新手,作为练习,我一直在尝试实现 Joel Franklin 的著作Computational Methods in Physics中的一些代码(用 Mathematica 编写) 。我编写了以下代码以将 lambda 表达式(加速度)作为第一个参数。通常,加速度的形式为 x'' = f(x',x,t),但并不总是所有三个变量的形式。
-- Implementation 2.1: The Verlet Method
verlet _ _ _ _ 0 = []
verlet ac x0 v0 dt n = take n $ zip [0,dt..] $ verlet' ac x0 v0 0 dt
where verlet' ac x0 v0 t0 dt =
let
xt = x0 + dt*v0 + 0.5*(dt^2)*(ac x0 v0 t0)
vt = v0 + dt*(ac x0 v0 t0)
in
xt:(verlet' ac xt vt (t0+dt) dt)
在 ghci 中,我将使用以下命令运行此代码(加速函数 a = -(2pi) 2 x 来自书中的一个练习):
verlet (\x v t -> -(2*pi)^2*x) 1 0 0.01 1000
我的问题是这不是真正的 Verlet 方法 - 这里 x n+1 = x n + dt*v n +1/2*a(x n ,v n ,n),而维基百科中描述的 Verlet 方法x n+1 = 2*x n - x n-1 +a(x n ,v n ,n)。我将如何重新编写此函数以更忠实地表示 Verlet 集成方法?
切线,有没有办法更优雅和简洁地写这个?是否有线性代数库可以使这更容易?我很感激你的建议。