- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用 Haskell 制作 Verlet 积分器来模拟重力。积分器使用对象的前两个位置作为种子,并在此后生成其余位置。
我认为在 Haskell 中实现此目的的一个好方法是使用无限列表。然而,当实现时,我发现它在很长时间内运行得非常慢(Haskell 1700 时间步长:12 秒,Python 1700 时间步长:< 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 秒。有没有什么好方法可以让它运行得更快?
最佳答案
这个定义...
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
...导致 verlet dt acc x0 x1
被不必要地计算多次,从而构建大量不需要的列表。这可以通过手动计算时间步来看出:
verlet dt acc x0 x1
x0 : x1 : next (verlet dt acc x0 x1)
x0 : x1 : next (x0 : x1 : next (verlet dt acc x0 x1))
x0 : x1 : (verletStep dt acc x0 x1) : next (x1 : next (verlet dt acc x0 x1))
解决方案是消除不必要的列表构建:
verlet dt acc x0 x1 = x0 : x1 : x2 : drop 2 (verlet dt acc x1 x2)
where
x2 = verletStep dt acc x0 x1
drop 2
删除列表的前两个元素(在本例中为 x1
和 x2
,我们已经预先添加了它们)。 verlet
使用第二个位置 x1
和新计算的第三个位置 x2
递归调用。 (与原始定义相比,其中 verlet
使用相同的参数递归调用。这应该引起怀疑。)
关于performance - Haskell:Verlet 集成的缓慢无限列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31875005/
我使用此处找到的时间校正 Verlet 集成:http://www.gamedev.net/page/resources/_/technical/math-and-physics/a-simple-t
我正在尝试学习 Verlet 集成,主要是因为我很无聊,并且想为我正常的“弹跳球”学习练习增添趣味。 我在 http://sandbox.electricgrey.com:8080/physics/
有一个常用的verlet-integration Johnathan Dummer 在网上的公式,称为 Time-Corrected Verlet。但是我读过几个论坛帖子,人们在某些情况下会得到奇怪或
我正在使用 Haskell 制作 Verlet 积分器来模拟重力。积分器使用对象的前两个位置作为种子,并在此后生成其余位置。 我认为在 Haskell 中实现此目的的一个好方法是使用无限列表。然而,当
我知道这个标题让人大跌眼镜,但它主要是一个副作用问题。我正在编写一个 Android 应用程序,我可以将它与我在物理课上学习的数学一起使用。这是一个 2D 弹跳球应用程序。我正在使用时间校正的 Ver
我想为游戏创建一些 physx,我从小例子开始了解它是如何工作的。在此期间我遇到了一些问题,但我在 90% 内解决了它们。 为了创建我的示例,我研究了一些其他示例并创建了我使用的示例:codeflow
我正在尝试使用 verlet integration用于制作软体球体。 我主要是创建一个网格并通过 Spring 连接每个顶点。我正在使用 three.js 来渲染球体。我相信一切正常,但我不确定如何
我的印象是,如果被建模的系统确实如此,算法应该能够节约能源。我正在模拟太阳系,它应该节约能源。该程序保留了角动量并确实产生了稳定的轨道,但总能量(动能 + 重力势能)围绕某个基线振荡。振荡是显着的。是
我知道 Velocity Verlet 没有 Verlet 的初始化问题并且在其工作中有速度计算,而 Time Corrected Verlet 对于不同的时间步长是正确的但不包括速度计算。我想要像“
下面是我的 Verlet 函数代码,将从我的主脚本中调用。 % verlet.m % uses the verlet step algorithm to integrate the simple ha
我正在构建一个物理引擎,我有某种“伪 verlet”的东西在运行,我想将它升级到“真正的”verlet。所以我找到了一篇文章并开始工作。在我添加了我认为是一个很好的近似值之后,引擎不再工作了。有人可以
我是 Haskell 的新手,作为练习,我一直在尝试实现 Joel Franklin 的《物理计算方法》一书中的一些代码(用 Mathematica 编写)。我编写了以下代码以将 lambda 表达式
我正在尝试为具有周期性或反射性边界条件的二维盒子中的 lennard-jones 流体编写分子动力学模拟。模拟似乎在有反射边界的情况下运行良好,但出于某种原因,周期性盒子中的粒子在几百个积分步骤后开始
我的下面的代码(应该)求解两个物体的运动方程,但结果是粒子运行方式,我无法找到错误在哪里 import numpy as np import matplotlib.pyplot as plt plt.
对于我的建模和仿真类(class)项目,我想模拟一个太阳系。我从一颗恒星(太阳)和一颗行星(地球)开始,但我已经遇到了一些问题。我现在花了一些时间来回顾和学习不同的公式和方法来模拟行星的轨道将如何受到
问题 我实现了 Verlet 速度算法来计算 2 个物体在重力作用下相互作用的轨迹(仅限牛顿引力)。绕轨道运行的小天体质量很小,位于轨道中心的天体质量很大。 理论上,Velocity Verlet 不
我正在尝试通过速度 verlet 模拟地球-太阳系统,但不知何故,太阳不会围绕原点(质量减少的位置)运行,而是漂移。我花了很多时间查看我的算法,但找不到缺陷。 有人知道这里出了什么问题吗? 这是模拟图
我只是在测试游戏中轨道动力学的几种集成方案。我在这里以持续和适应性的步骤参加了 RK4 http://www.physics.buffalo.edu/phy410-505/2011/topic2/ap
我在理解我尝试使用 Three.js 和 yomboprime 的 GPUComputationRenderer 实现的逻辑时遇到了问题。 ( https://github.com/yomboprim
我是一名优秀的程序员,十分优秀!