2013-07-09 27 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

相關問題