我想将f ^ 2定义为1,但保留f undefined

时间:2016-08-29 02:30:39

标签: wolfram-mathematica symbols protected user-defined-types

例如,如果我写出表达式(2 + f)(3 + f),我希望Mathematica生成7 + 5f。我总是希望f ^ 2被计算为1(或我赋给它的任何其他值),但是f是一个特殊的未定义符号。如果我定义f ^ 2:= 1我得到Tag Power受保护的错误消息。

我是Mathematica新手,自学成才,所以请尽量以基本的方式回答这个问题。

为了记录,我试图在n维时空中定义Clifford代数运算,并且能够进行这样的赋值将极大地简化任务。

2 个答案:

答案 0 :(得分:1)

ReplaceAll[Expand[(2 + f) (3 + f)], Power[f, 2] -> 1]
  

7 + 5 f

答案 1 :(得分:1)

推广到所有符号 e1,e2,e3,...,en

x = (a + a1 e1 + a2 e2 + a3 e3 + a4 e1 e2 - a5 e1 e3 + a6 e2 e3 + 
a7 e1 e2 e3);
y = (b + b1 e1 + b2 e2 + b3 e3 + b4 e1 e2 - b5 e1 e3 + b6 e2 e3 + 
b7 e1 e2 e3);


 ReplaceAll[
   Expand[x y], 
   Power[e_, 2] /; First[Characters[ToString[e]]] === "e" -> 1
 ]

我从@Edmund那里学到的这种方式更优雅:

Expand[(2 + e1)(3 + e2)] /.Power[s_Symbol,2]/; StringStartsQ["e"]@SymbolName[s]->1
6 + 3 e1 + 2 e2 + e1 e2