我有一个模拟,我有气球在屏幕周围弹跳,每个气球都附有一个字符串。它的功能类似于约束。弦应该服从重力,这样如果气球不是最大长度,应该松弛下垂。
为了解决这个问题,我用线段表示字符串。我让字符串开始直接向下悬挂,然后遍历每个段,将其指向气球,然后定位它以便连接。这使得行为非常接近我想要的行为,但是为了确保它不会离开中心,我将它转换回它所根深蒂固的地方。问题是结束不再是连接。如果我没有必要将字符串重置为垂直位置,这将起作用,但我必须确保计算松弛。
我添加了一个临时解决方案,再次迭代它以重新连接它,行为很不错,但它绝对不现实。这里可以看到一个例子:http://www.mikerkoval.com/simulation/balloons
单击以创建气球。我不确定如何模拟重力。有没有更好的方法来使这更现实?
----- ---- EDIT
我正在努力让我的价值在接触网功能中得到解决。
我将我的功能定义为:
var k = function (a){
return Math.pow((2 * a[0]*Math.sinh(h/(2 * a[0])) - sqrt(s*s- v*v)), 2)
}
然而,当我打电话
var sol = numeric.uncmin(k, [1]);
它运行一点然后抛出一个Nan错误。我试图弄清楚问题出在哪里,但是我很难成功,因为我正在努力学习用uncmin进行的操作
答案 0 :(得分:2)
我认为你想要的是通过两个点p0
和p1
找到悬链曲线的参数,锚点和气球的位置给出弧长s
,这是字符串的长度。
曲线的等式是
y = a cosh (x / a)
其中a
是您需要确定的参数。让v
= y1
- y0
和h
= x1
- h0
。通过一些代数,您可以显示a
的值必须满足
sqrt(s*s - v*v) = 2 * a * sinh(h / (2a))
This article很好地讨论了如何使用Newton's method迭代地a
解决此问题。作者对变量b = a/h
进行了替换,使得解空间接近线性,因此Newton将很快收敛到一个好的答案。
牛顿方法是一个简单的迭代,需要曲线的显式导数和起点。上面的文章给出了衍生物。由于曲线非常接近线性,因此您可以在该线性部分上选择任何起始点 - b = 0.2
即可。通过快速收敛,我的意思是每次迭代时正确有效数字的数量加倍。因此在实践中,您可能会在6次或更少次迭代中获得双精度浮点数的所有数字。
获得参数后,绘制所需的显式曲线将是一个简单的模式。
如果Newton 在6次迭代中收敛,那么问题的实例是非常恶劣的。这意味着曲线几乎是一条直线。因此,只需在p0
和p1
之间划一条线!
所有这一切都应该足够快:比你目前的近似值便宜。