Pattern matching with Dt.

• To: mathgroup at yoda.physics.unc.edu
• Subject: Pattern matching with Dt.
• From: Scott Herod <sherod at picard.colorado.edu>
• Date: Mon, 24 Aug 92 18:43:10 MDT

```I have a problem in pattern matching I need to solve.

I have two systems of partial differential equations.  One is general
and of the form

2       k
F [x,u,Du,D u,...,D u] == 0;  i = 1,..,m.
i

where x is a vector denoted by (x[1], x[2], ... , x[numind]), and
u is a vector (u1, u2, ... , uj), j = numdep.  (This is only a small
part of some code so I would like to not have to change my notation.)

The other system is more specific.  Each equation is of the form

Sum[xi[k][variables]*Dt[uJ,x[k]], {k,1,numind}] +
etaJ[variables] == 0,   J=1,...,numdep.

Examples might be

Dt[u1, x[2]] - Dt[u2, x[1]] == 0,
Dt[u2, {x[2],2}] + u1*Dt[u1,x[1]] == 0.         (1)

and

xi[1][x[1],x[2],u1,u2] * Dt[u1,x[1]] + xi[2][x[1],x[2],u1,u2] * Dt[u1,x[2]] +
eta1[x[1],x[2],u1,u2]  == 0,

xi[1][x[1],x[2],u1,u2] * Dt[u2,x[1]] + xi[2][x[1],x[2],u1,u2] * Dt[u2,x[2]] +
eta2[x[1],x[2],u1,u2]  == 0.

(2)

What I need to do is solve system (2) for say Dt[_,x[2]] and replace
these terms in system (1).  It is easy to do this only.

For example, the following does this.
_______________________________________________________________________

Cat[x_,y_] := ToExpression[StringJoin[ToString[x],ToString[y]]];
UnList[{x__}] := Sequence[x];

numdep = 2;
numind = 2;

var = Flatten[{Table[x[i],{i,1,numind}], Table[Cat[u,j],{j,1,numdep}] }]

rhs[i_] := (Cat[eta,i][UnList[var]] - Sum[xi[j][UnList[var]]*
Dt[Cat[u,i],x[j]], {j,1,numind-1}]) / xi[numdep][UnList[var]];

For[i=1,i<= numdep,i++,
ru[i] = Dt[Cat[u,i],x[2]] -> rhs[i]
]
_______________________________________________________________________

However, I need the rules to also recognize that Dt[u1,x[1],x[2]]
is Dt[ Dt[u1,x[2]] , x[1]] and Dt[u1, {x[2],2}] = Dt[ Dt[u1,x[2]], x[2]].

To extend the problem I need to create these rules for each of the
ui where i = 1, ... , numdep.

I have tried something like
_______________________________________________________________________

Unprotect[Dt];
Dt[a_,b__,x[2]] := Hold[Dt[ Dt[a,x[2]],b]];
Dt[a_,x[2],z__] := Hold[Dt[ Dt[a,x[2]],z]];
Dt[a_,b__,x[2],z__] := Hold[Dt[ Dt[a,x[2]],b,z]];
Dt[a_,{x[2],c_}] := Hold[Dt[ Dt[a,x[2]],{x[2],c-1}]];
Dt[a_,b__,{x[2],c_}] := Hold[Dt[ Dt[a,x[2]],b,{x[2],c-1}]];
Dt[a_,{x[2],c_},z__] := Hold[Dt[ Dt[a,x[2]],z,{x[2],c-1}]];
Dt[a_,b__,{x[2],c_},z__] := Hold[Dt[ Dt[a,x[2]],b,z,{x[2],c-1}]];
Protect[Dt];
_______________________________________________________________________

But I only want it to convert the derivatives when it sees
something like Dt[u2,___,x[2],___] not any other derivatives
w.r.t. x[2].

Any suggestions?  I hope this explanation is clear.

Scott Herod
Applied Mathematics
University of Colorado, Boulder