       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