我关于堆栈溢出的第一篇文章,所以请原谅我。我用pymunk物理库建立了蟒蛇中一个混沌的双摆模型,而后者又使用花栗鼠C库。钟摆处于混乱状态,对初始条件表现出极大的敏感性。然而,我已经意识到,即使我在完全相同的初始条件下运行模拟(无论怎样改变零代码),这两个模拟都会很快地分开。
在我的代码中,有可能在每次运行时产生不同的结果。因为模拟是混乱的,任何微小的错误,如果在我的运行之间不是常量,就会导致很大的变化。
是什么导致了这一切?我不确定这是否是花栗鼠,蟒蛇,甚至python或我的OS/PC中的一个小缺陷造成的。
编辑:
这是我的代码:
import pyglet
import pymunk
import pymunk.pyglet_util
def add_pendulum(space):
static_body = pymunk.Body()
static_body.position = 400, 400
mass = 10
inertia = pymunk.moment_for_box(mass, 5, 100)
body1 = pymunk.Body(mass, inertia)
body1.position = 350, 400
l1 = pymunk.Poly(body1, [(50, 0), (-50, 0), (-50, 5), (50, 5)])
l1.friction = 0.1
l1.collision_type = 2
pivot_joint = pymunk.PivotJoint(static_body, body1, (400, 400))
space.add(body1, l1, pivot_joint)
mass = 10
inertia = pymunk.moment_for_box(mass, 5, 100)
body2 = pymunk.Body(mass, inertia)
body2.position = 250, 400
l2 = pymunk.Poly(body2, [(50, 0), (-50, 0), (-50, 5), (50, 5)])
l2.friction = 0.1
l2.collision_type = 2
pivot_joint2 = pymunk.PivotJoint(body1, body2, (300, 402.5))
space.add(body2, l2, pivot_joint2)
# A hack to disable all collisions
nocollisions = lambda space, arbiter: False
space.add_collision_handler(2, 2, nocollisions, nocollisions, nocollisions, nocollisions)
window = pyglet.window.Window(800, 600)
space = pymunk.Space()
add_pendulum(space)
space.gravity = (0, -10)
test = [()] # A temporary hack to hide the tuple in a mutable object
def on_draw(dt): #For graphing the moving pendulum
points = test[0]
space.step(dt)
pyglet.gl.glClearColor(0, 0, 0, 1)
window.clear()
pymunk.pyglet_util.draw(space)
points += (int(tuple(space.shapes[1].get_vertices()[1])[0]), int(tuple(space.shapes[1].get_vertices()[1])[1]))
pyglet.gl.glClearColor(200, 200, 200, 1)
pyglet.graphics.draw(len(points)/2, pyglet.gl.GL_POINTS,
('v2i', points)
)
test[0] = points
pyglet.clock.schedule_interval(on_draw, 1/1000.0)
pyglet.app.run()发布于 2016-04-14 02:30:40
对于从on_draw(dt)调用的pyglet.clock.schedule_interval函数,小矮人文档状态:
dt参数给出了秒数(由于延迟、加载和计时器不精确,可能略高于或小于请求的间隔)。
每次运行您的程序时,它都会用稍微不同的on_draw参数调用dt。您将继续调用space.step(dt),这将在每个调用中略有不同。考虑到你的程序对不断变化的环境是多么敏感,我认为这是罪魁祸首。
不确定它是否有用,但这里是另一个关于固定或可变时间步长和物理(嗯,&游戏引擎)的问题。
https://stackoverflow.com/questions/36612328
复制相似问题