2013-07-09 55 views
4

模拟Flexagon的最佳方式是什么?Flexagon Simulation

在起点我最好的猜测是代表面和边,以及基于模拟这里边相遇转换。我认为在实施转型的过程中,在给定方向折叠在物理上是不可能的时候,这是显而易见的。

我要去尝试通过实验摸不着头脑,但它肯定感觉就像凡在我与设施数学的间隙拖我的那种问题。

编辑:为了澄清,我感兴趣的是什么样的数据结构,我可以用它来代表一个flexagon,我怎么能操纵这些数据结构来模拟flexagon的折叠。

+0

这不应该在math.stackexchange? – wombat

+0

我选择张贴到stackoverflow.com上的问题,因为我的问题是具体实施,即应该使用什么数据结构(s),我可以使用什么算法来操纵它们? – mdashx

+0

你试过这个吗?我很感兴趣的是看到一些代码,即使它不工作:)因为它是一种递归形式的状态机。 –

回答

1

如果你写的所有flexagon作为一个方程组的不变量,围绕法治国家小偏差可以写成一个线性系统。例如,(x1,y1)(x2,y2)之间一张纸的刚度强制

(x1 - x2)**2 + (y1 - y2)**2 - L**2 == 0 

这可以被软化到的chi2

chi2 = (x1 - x2)**2 + (y1 - y2)**2 - L**2 + other constraints... 

衍生物相对于x1x2y1y2收率线性方程。线性方程的系统是一个矩阵,而矩阵的特征值/本征矢量分解给你x1x2y1y2参数,很容易或难以弯曲的线性组合。特征向量是可能方向的基本集合,每个特征向量都告诉你在这个方向上弯曲有多难。较大的特征值更受约束。

上面的问题是,如果有真正允许的方向,即chi2相对于的导数为0(原始约束绝对满足),则矩阵是奇异的并且可以不要被颠倒以获得特征系统。如果你只想知道那些绝对允许的方向是什么,你可以计算矩阵的零空间而不是它的特征系统。然而,我怀疑(从来没有玩过折弯机)“允许”方向涉及一点弯曲,在这种情况下,chi2很小但非零。那么你会寻找小但非零的特征值。其他自由度是允许的和无趣的,例如整个对象的平移或旋转。把它变成一个纯粹的特征系统问题(没有空的空间在所有),添加约束系统与任意小的常量拉姆达:

chi2 += lambda_x * (x1 + x2)**2/4.0 + lambda_y * (y1 + y2)**2/4.0 

你会承认他们在你的解决方案,因为你而改变,他们会调整每个拉姆达。 (上面的例子给出了一个惩罚lambda_x到x中翻译和lambda_y到沿y平移)

在实施方面,可以使用任何线性代数软件来计算的解决方案,并检查用于与lambda表达式变化。我用Python来原型这样的问题(在高能物理检测器对准,其中,所述约束是象“此检测器是从检测器3厘米”和chi2从不确定导出的测量“3厘米+ - 0.1厘米” ),然后将解决方案移植到C++(BLAS)进行生产。 Python的Numpy库有足够的线性代数(它是BLAS的底层),尽管我也在Scipy中使用了通用的非线性最小化器来调试矩阵解决方案。最难的部分是让索引排列正确,当将它转换为矩阵时,而不是将通用最小化器的目标函数赋值时(因为您使用变量名称)。这更像是一个Matlab或Mathematica问题,所以如果你对其中一个问题更加适应,那就用它来代替。这个问题将需要大量的试验和错误,所以尽可能使用最多的交互式系统(其中一个具有良好的REPL或工作表/笔记本式界面)。

绘制连接图(图论理论图,而不是图),也可能有助于标记它们的约束条件。对我而言,在写出方程之前,这是必要的第一步。

通过编写一组带参数值的函数(x1等)并用OpenGL(或其他3-D网格渲染器)绘制图形,也可能有助于可视化系统。这可以告诉你是否违反了某些约束条件,因为网格瓦片会互相传递。它还可以帮助您识别由每个特征向量表示的自由度:通过由特征向量表示的线性组合来改变参数,并且您会看到它是否只是平移/旋转或者它是否进行了一些有趣的扭曲或折叠。

+0

单词。谢谢。我已经接受了正确的答案,但我将不得不花费一些时间来确保我理解一切。我肯定会报告我的努力结果。谢谢你让我朝着正确的方向发展! – mdashx

相关问题