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
(sherod at newton.colorado.edu)