模拟flexagon的最佳方法是什么?
我在起点上的最佳猜测是表示面和边,并模拟基于边相遇的变换.我在想,在实施转型的过程中,当在给定方向上折叠在物理上是不可能的时,这将是显而易见的.
我将尝试通过实验来解决这个问题,但它确实感觉就像我的设施中的数学差距阻碍了我的那种问题.
编辑:为了澄清,我感兴趣的是我可以用什么样的数据结构来表示一个flexagon,以及我如何操纵这些数据结构来模拟一个flexagon的折叠.
最佳答案 如果将flexagon的所有不变量都写为方程组,则围绕合法状态的小偏差可以写成线性系统.例如,(x1,y1)和(x2,y2)之间的纸张的刚度强制执行
(x1 - x2)**2 + (y1 - y2)**2 - L**2 == 0
这可以软化为
chi2 = (x1 - x2)**2 + (y1 - y2)**2 - L**2 + other constraints...
chi2相对于x1,x2,y1,y2的导数产生线性方程.线性方程组是一个矩阵,该矩阵的特征值/特征向量分解为您提供容易或难以弯曲的x1,x2,y1,y2参数的线性组合.特征向量是可能方向的基础集合,每个对应的特征值告诉您在该方向上弯曲的难度.较大的特征值受到更多限制.
上面的一个问题是,如果有任何方向是真正允许的,也就是说,chi2相对于p的导数是0(原始约束是绝对满足的),那么矩阵是单数的并且不能被反转获得特征系统.如果您只想知道那些绝对允许的方向是什么,您可以计算矩阵的零空间而不是其特征系统.然而,我怀疑(从未使用过flexagon)“允许”方向涉及一点点弯曲,在这种情况下,chi2很小但非零.然后你会寻找小而非零的特征值.允许其他自由度并且不感兴趣,例如整个对象的平移或旋转.要将其转换为纯粹的特征系统问题(根本没有空间),请使用任意小的常量lambda向系统添加约束:
chi2 += lambda_x * (x1 + x2)**2/4.0 + lambda_y * (y1 + y2)**2/4.0
您将在解决方案中识别它们,因为它们会随着您改变每个lambda而变化. (上面的例子给出了一个惩罚lambda_x来翻译x和lambda_y翻译为y.)
在实施方面,您可以使用任何线性代数软件来计算解决方案并检查lambda的变化.我使用Python来解决这样的问题(高能物理中的探测器对准,其中约束是像“这个探测器距离探测器3厘米”的测量值,而chi2来自不确定性“3 cm – 0.1 cm”)然后将解决方案移植到C(BLAS)进行生产. Python的Numpy库有足够的线性代数(它是引擎盖下的BLAS),虽然我也使用Scipy中的通用非线性最小化来调试矩阵解决方案.最难的部分是让索引正确排列,这在将其作为矩阵进行转换时是必要的,而不是在为通用最小化器提供目标函数时(因为您使用变量名称).这更像是一个Matlab或Mathematica问题,所以如果你对其中一个问题感觉更舒服,那么请使用它.这个问题需要大量的试验和错误,因此请使用最具交互性的系统(一个具有良好的REPL或工作表/笔记本风格的界面).
绘制连接图(图论 – 理论图,而不是图),标记其约束也是有帮助的.对我来说,这是写出方程之前必要的第一步.
通过编写一组带有参数值(x1等)的函数并使用OpenGL(或其他3-D网格渲染器)绘制图形,可能也有助于可视化系统.这可以显示是否违反了某些约束,因为网格图块会相互传递.它还可以帮助您识别每个特征向量表示的自由度:通过特征向量表示的线性组合来改变参数,您将看到它是否只是平移/旋转,或者它是否正在进行一些有趣的扭曲或折叠.