1

我有一个模拟,我有气球在屏幕上弹跳,每个气球都附有一根绳子。它的作用就像一个约束。绳子应该服从重力,这样如果气球不是最大长度,应该有松弛垂下。

为了解决这个问题,我用线段表示字符串。我让绳子开始垂直悬挂,然后遍历每个段,将其指向气球,然后定位它以使其连接。这使行为非常接近我想要的,但是为了确保它不会离开中心,我将它翻译回它所在的地方。问题是结束不再是连接的。如果我不必将字符串重置为垂直位置,这将起作用,但我必须确保计算松弛度。

我添加了一个临时解决方案,再次对其进行迭代以重新连接它,行为还不错,但绝对不现实。一个例子可以在这里看到:http: //www.mikerkoval.com/simulation/balloons

单击以创建气球。我不确定如何模拟重力。有没有更好的方法让这更现实?

- - -编辑 - -

我正在努力让我的价值在悬链线函数中得到解决。

我将我的功能定义为:

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 的情况

4

1 回答 1

2

我想你想要的是通过两点p0和找到悬链线曲线的参数p1,锚点和气球的位置,给定弧长s,即字符串的长度。

曲线方程为

y = a cosh (x / a)

a您需要确定的参数在哪里。让v= y1-y0h= x1- h0。通过一些代数,您可以显示a必须满足的值

sqrt(s*s - v*v) = 2 * a * sinh(h / (2a))

这篇文章很好地讨论了如何用牛顿法a迭代地解决这个问题。作者做了一个变量的替换,使得解空间接近线性,所以牛顿会很快收敛到一个好的答案。b = a/h

牛顿法是一种简单的迭代,需要曲线的显式导数和起点。上面的文章给出了导数。因为曲线非常接近线性,您可以在该线性部分选择任何起点 -b = 0.2可以。通过快速收敛,我的意思是每次迭代时正确有效数字的数量翻倍。因此,在实践中,您可能会在 6 次或更少的迭代中获得双精度浮点数的所有数字。

获得参数后,绘制所需的显式曲线将是一个简单的模式。

如果牛顿在 6 次左右的迭代中没有收敛,那么问题的实例是一个非常病态的实例。这意味着一条非常接近直线的曲线。p0所以只要在和之间画一条线p1

所有这些都应该足够快:比您当前的近似值便宜。

于 2017-06-17T04:40:19.370 回答