Re: [问题] 简化向量的方法

楼主: jurian0101 (Hysterisis)   2014-01-15 22:08:26
※ 引述《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)}}
作者: LPH66 (-6.2598534e+18f)   2014-01-15 22:12:00
GCD 不行可是有 PolynomialGCD...
楼主: jurian0101 (Hysterisis)   2014-01-15 22:15:00
喵的你不早推= =每次都这样XD
作者: ToMoveJizz ( )   2014-01-18 12:21:00
好像挺威的...SetAttribute"s" 少打了个s喔

Links booklink

Contact Us: admin [ a t ] ucptt.com