MathGroup Archive 1996

[Date Index] [Thread Index] [Author Index]

Search the Archive

Dropping higher order terms

  • To: mathgroup at smc.vnet.net
  • Subject: [mg4121] Dropping higher order terms
  • From: Paul Abbott <paul at earwax.pd.uwa.edu.au>
  • Date: Wed, 5 Jun 1996 01:38:53 -0400
  • Organization: University of Western Australia
  • Sender: owner-wri-mathgroup at wolfram.com

Regarding the question: 

I want to be able to drop higher order terms in an algebraic 
expression.  As a simple example consider two matrices

(mat1 = {{-1,a,b},{a,1,0},{b,0,1}}) // MatrixForm

-1   a    b

a    1    0

b    0    1

(mat2 = {{1,0,c},{0,1,d},{c,d,1}}) // MatrixForm

1   0   c

0   1   d

c   d   1

where a, b, c, and d are small. The matrix product 

(prod = mat1 . mat2) // MatrixForm

-1 + b c      a + b d       b - c + a d

a             1             a c + d

b + c         d             1 + b c

contains terms of first and second order in a, b, c, and d. How can I 
retain only the terms first order in in a, b, c, and d?

A: Looking at

FullForm[prod]

List[List[Plus[-1, Times[b, c]], Plus[a, Times[b, d]], 
 
   Plus[b, Times[-1, c], Times[a, d]]], 
 
  List[a, 1, Plus[Times[a, c], d]], 
 
  List[Plus[b, c], d, Plus[1, Times[b, c]]]]

reveals that the terms you want to delete, say Times[b,c], are of the 
general form Times[__].  However, you do not want to delete terms like 
Times[-1,c] so  you can use pattern-matching with 
Times[_Symbol,_Symbol..], (i.e., a product of two or more Mathematica 
symbols. The repetition operator .. indicates a pattern repeated one or 
more times) to retain only the terms first order in in a, b, c, and d: 

(prod /. Times[_Symbol,_Symbol..] :> 0) // MatrixForm

-1      a       b - c

a       1       d

b + c   d       1

Here is a more complicated example:

(mat1 . mat2 . mat1 // Expand) /. 
        Times[_Symbol,_Symbol..] :> 0

       2    2           2              2
{{1 + a  + b , 0, -c + b  c}, {0, 1 + a , d}, 
 
         2            2
  {-c + b  c, d, 1 + b }}

You now want to delete all terms of the general form _^_ (i.e., 
powers).  You can again use pattern-matching: 

(% /. _^_ :> 0) // MatrixForm

1    0    -c

0    1    d

-c   d    1

Combining these rules we have:

firstorder = {Times[_Symbol,_Symbol..] :> 0, _^_ :> 0};

(mat1 . mat2 . mat1 . mat1 . mat2 // Expand) /. 
        firstorder // MatrixForm

-1        a         b - 2 c

a         1         2 d

b + 2 c   2 d       1

_________________________________________________________________ 
Paul Abbott
Department of Physics                       Phone: +61-9-380-2734 
The University of Western Australia           Fax: +61-9-380-1014
Nedlands WA  6907                         paul at physics.uwa.edu.au 
AUSTRALIA                           http://www.pd.uwa.edu.au/Paul
_________________________________________________________________

==== [MESSAGE SEPARATOR] ====


  • Prev by Date: Re: The Mathematica Journal-Supplements
  • Next by Date: Modification date message
  • Previous by thread: Re: Re: The Mathematica Journal-Supplements
  • Next by thread: Modification date message