[心得] 小練功 - list與多項式與MapThread

看板Mathematica作者 (Hysterisis)時間13年前 (2012/01/30 00:56), 編輯推噓0(000)
留言0則, 0人參與, 最新討論串1/2 (看更多)
與本題無關的自介: 我是自從創板就潛水follow的版民,印象中有在Math板開板討論串推文支持, 顯見吾心與本版同在XD 最早接觸Mathematica是透過某北部重考班邱姓物理教師在課堂上Show off他用 Graph函式畫出的3D愛心圖,還用Mathematica製作大考物理試題解說圖形...... 總之Mathematica就長得就一副很威的樣子,我覺得雖然入門門檻高,但之後有 一個近乎萬能的工具得以應用應該很值得,目前利用寒假努力學習中。 我的大學本科是生物領域。人家說學生物就可以把理科放掉,我覺得他們對極了 /. 對->愚蠢 舉Matrix67,一位我常關注的簡中世界的部落客為例,他的本科是語文,但他牛 得可以用Mathematica來作自然語言分析......還有一堆酷玩意兒。 Mathematica就像神秘博士的領結,領結最酷了XD - - - - - 本小練習最早的目標是要獲得 f(n) = Σijk (0<i<j<k<n) 的公式 (但因為太簡單了故有後話 btw, f(n)= n^2 (n-1)^2 (n-2) (n-3) /48) 後來變成要寫一個函式 f[一串指數, 一串變數] 輸出的結果 是所有變數的排列的指定的指數次方的多項式 ← 啥? (= =), 例如 f[{1,1},{x,y,z,w}] = xy + xz + xw + yz + yw + zw f[{2,1},{x,y,z}] = x^2 y + x y^2 + x^2 z + x z^2 + y^2z + y z^2 等等 如果在說明文件裡打polynomial,找到的方式似乎是用 CoefficientRules[] 和 FromCoefficientRules[] 這兩個函數來作,但要從無到有生成有特定規律的多項式,私自以為這兩個函數其實 很難用的樣子。 以下是我的寫法, (將Module[]框框打開,逗號換分行就是分解動作) : (*一步,定義函數f,並使用Module,全部用局域變數以免衝突*) : ClearAll[f]; f[list_, n_] := : Module[ : {varlist = Table[Subscript[k, i], {i, n}], : input = list, : pairedtuples, product1, product2, total}, : pairedtuples = : Tuples[{Subsets[varlist, {Length[input]}], Permutations[input]}]; : product1 = MapThread[Power, #] & /@ pairedtuples; : product2 = Product[i, {i, #}] & /@ product1; : total = Total[product2]; : total]; 例如 In[2]:= f[{1, 1}, 4] // TeXForm Out[2]:= k_1 k_2+k_1 k_3+k_2 k_3+k_1 k_4+k_2 k_4+k_3 k_4 過程就是從這一個東西接著湊出下個東西, 最亂糟糟的一步是要把pairedtuples這個長得像 {{指數串1,變數串1}, {指數串2,變數串2}, ... , {指數串m,變數串m}} 這樣的list值塞給Power[,] 函數 在說明文件亂搜亂試很久(約Nadal vs Djokovic第一局的時間XD),最後得到 的解法是用MapThread[ ,]這個函數,但說實在那一步詳細做了甚麼還是有點 不妥貼的感覺,簡直是個hack 。 請教諸位板友,是否有較直觀的作法? -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 218.164.2.223 ※ 編輯: jurian0101 來自: 218.164.6.1 (01/30 13:00)
文章代碼(AID): #1F9NeprX (Mathematica)
文章代碼(AID): #1F9NeprX (Mathematica)