我是Haskell的新手,作为练习,我一直在尝试实现Joel Franklin的书《物理计算方法》中用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)2x来自书中的练习):
verlet (\x v t -> -(2*pi)^2*x) 1 0 0.01 1000
我的问题是这不是真正的Verlet方法 - 这里xn+1=xn+dt*vn+1/2*a(xn,vn,n),而在维基百科中描述的Verlet方法是xn+1=2*xn-xn-1+a(xn,vn,n)。我应该如何重新编写此函数,以更忠实地表示Verlet积分方法?
另外,有没有一种更优雅简洁的编写方法?是否有线性代数库可以使这更容易?谢谢您的建议。
在数据/新类型声明中的构造函数中出现解析错误:(Double,Double,Double)
我会将此帖移到另一个线程。 - castle-bravo