Re: [問題] 簡化向量的方法

看板Mathematica作者 (Hysterisis)時間11年前 (2014/01/15 22:08), 編輯推噓3(302)
留言5則, 3人參與, 最新討論串2/2 (看更多)
※ 引述《ToMoveJizz (土木技師)》之銘言: : 向量通常使用List來表示 : 比如說{Ax^2,Ay^2,Az^2} : 有沒有辦法讓mathematica把這個A提出來? : A可能是很複雜的expression 原本想推把List換成Plus,這樣就可以用Simplify提出公因數。 對{Ax^2,Ay^2,Az^2}可以這樣做。 但細想,要是原始List長得像{-1,1,1-x^2,1-x} 就完蛋了XD 順便提一下,原本乘法能進不能出的原因是 Times 的 Attribute 含有 Listable 於是Times[A, List[1,2,3]] 自動轉變成 List[Times[A,1], Times[A,2], Times[A,3]] ^^^^^ ^^^^餓虎撲羊 可執行代碼 Unprotect[Times]; ClearAttributes[Times, Listable]; SetAttribute[Times, Protected]; 讓 A {1,2,3} 即使沒有Hold[]也乖乖保持原樣。 復原代碼 Unprotect[Times]; SetAttribute[Times, {Listable,Protected}]; ===== 寫出來也不難,當作練習。 我考量之內最快最通用的寫法是利用內建函數FactorList, 然後作一些步驟去人工找最小公因式 <- 內建函數GCD當然"沒有"這個功能 ===== Clear[common]; common[exp_List] := Module[{a, b, int, sym, out}, a = FactorList /@ exp; (*factor乘數表*) b = Union @@ a[[All, 2 ;;, 1]]; (*"非整數"符號表*) int = GCD @@ a[[All, 1, 1]] ; (*公共整數因子*) sym = Times @@ (*公共符號因子*) MapThread[Power, {b, Min /@ Table[ If[MemberQ[#[[All, 1]], sym], Cases[#, {sym, x_Integer} :> x][[1]], 0] & /@ a, {sym, b}]}]; out = int*sym; (*"最大公因式"*) {out, Simplify[exp/out]} (*輸出*) ] 兩組測資 = = In[1]:= common[{2 A x^2, 6 A y^2, 2 A z^2, 8 A}] Out[1]= {2 A, {x^2, 3 y^2, z^2, 4}} = = In[2]:= common[{2A x^2 (-1+x^2), 6A(2-3x+x^2) y^2, 2A (3-4x+x^2) z^2, 8A(-2+x+x^2)}] Out[2]= {2A (-1+x), {x^2 (1+x), 3 (-2+x) y^2, (-3+x) z^2, 4 (2+x)}} -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.112.213.88 ※ 編輯: jurian0101 來自: 140.112.213.88 (01/15 22:14)

01/15 22:12, , 1F
GCD 不行可是有 PolynomialGCD...
01/15 22:12, 1F

01/15 22:15, , 2F
喵的你不早推= =
01/15 22:15, 2F

01/15 22:15, , 3F
每次都這樣XD
01/15 22:15, 3F

01/18 12:21, , 4F
好像挺威的...
01/18 12:21, 4F

01/22 21:54, , 5F
SetAttribute"s" 少打了個s喔
01/22 21:54, 5F
文章代碼(AID): #1IrfPT3j (Mathematica)
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 2 之 2 篇):
文章代碼(AID): #1IrfPT3j (Mathematica)