[心得] 小練功 - list與多項式與MapThread
與本題無關的自介:
我是自從創板就潛水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)
討論串 (同標題文章)
完整討論串 (本文為第 1 之 2 篇):
Mathematica 近期熱門文章
PTT數位生活區 即時熱門文章