1
5
忠实的Verlet序列有x n 取决于x-x的前两个值 n-1个 和x n-2型 此类序列的一个典型示例是斐波那契序列,其具有以下单线Haskell定义:
这将斐波那契序列定义为无限(懒惰)列表。自我参考
您可以采用相同的方法解决问题,如下所示:
数据结构
|
2
2
实际上,如果你继续阅读,你会发现这两种变体都在维基百科页面上显示。 基本Verlet二阶ODE x“”(t)=a(x(t))的基本二阶中心差商离散化为
注意,迭代中没有速度,加速度函数a(x)中也没有速度。这是因为只有当动力系统是保守的,即-m*a(x)是某些势函数的梯度,而势函数是静态对象时,Verlet积分才优于其他积分方法,它们只取决于位置,而不取决于时间,也不取决于速度。许多无摩擦机械系统都属于这一类。 Verlet速度现在,使用一阶中心差商,设置时间t的速度 n 到
并将其与第一个方程相加和相减,以获得
或
这是编写速度Verlet算法的一个变体。 ( 更新以使所有状态变量对应于迭代步骤前后的相同时间 ) 使用前一步从n-1到n的方程式,可以替换x n-1个 通过v n-1个 和一个 n-1个 在速度计算中。然后
为了避免任何向量x、v、a都有两个实例,可以安排更新过程,以便一切就绪。假设在迭代步骤的入口,存储的数据对应于(t n-1个 ,x n-1个 v n-1个 一 n-1个 ). 然后下一个状态被计算为
或作为代码
改变这些操作的顺序将破坏Verlet方案并显著改变结果,运算的旋转是可能的,但必须小心迭代步骤后状态的解释。 唯一需要的初始化是计算 0 =a(x 0 ). Leapfrog Verlet公司从速度Verlet的公式可以看出,对于位置的更新,不需要速度v n 但只有半点速度v n+0.5 然后
或在代码中
同样,这些操作的顺序从根本上来说是重要的,改变将导致保守系统的奇怪结果。 ( 使现代化 )但是,可以将执行序列旋转到
这对应于三元组(t n ,x n v n+0.5 )如中所示
初始化只需要计算
( 结束更新 ) 使用x计算的任何统计信息 n 和v 正0.5 或v n+0.5 由于时间索引不匹配,将以与dt成比例的误差关闭。碰撞可以单独用位置矢量来检测,但在偏转过程中,速度也需要合理地更新。 |
3
0
以下是我实施user5402建议后的解决方案:
我使用以下命令在ghci中运行它:
这似乎正是我所期望的——显然是正弦运动!我还没有绘制x(如果有人对如何在Haskell中绘制x有任何建议,欢迎他们)。此外,如果您看到任何明显的重构,请随时指出它们。谢谢 |
trpnd · 如何定义由两个任意单声道变压器组成的单声道变压器? 2 年前 |
Fabus1184 · Haskell mapM_不打印 2 年前 |
Gotthold · 基于范数约束向量的类型 2 年前 |
jian · haskell将另一个函数用作输入参数 2 年前 |
Jocafrei · 用Haskell函数实现最大公约数函数 6 年前 |