Re: A pattern matching problem
- To: mathgroup at smc.vnet.net
- Subject: [mg72557] Re: A pattern matching problem
- From: carlos at colorado.edu
- Date: Mon, 8 Jan 2007 04:56:33 -0500 (EST)
- References: <enksb3$9nt$1@smc.vnet.net><ennmu1$3mc$1@smc.vnet.net>
Jens-Peer Kuska wrote:
> Hi,
>
> what is with
>
> r = u[t + h] - 2*u[t] + u[t - h] + a2*u'[t + h/2] + 4*u'[t - h/4] + c*
> u''[t + alfa*h]/12;
>
> (Cases[r, u[_] |
> Derivative[__][u][_], Infinity] /. {u[
> arg_] :> {0, arg}, Derivative[i_][u][arg_] :> {i,
> arg}}) /. {order_Integer, arg_} :> {order, D[arg, h]}
>
> Regards
> Jens
Many thanks, that is a very good start. I completed the module as
follows:
LagCoefficients[r_,u_,h_]:=Module[{clag,d,nd,md,ider,htab},
clag=(Cases[r,u[_]|Derivative[__][u][_],Infinity]/.{u[arg_]:>{0,arg},
Derivative[i_][u][arg_]:>{i,arg}})/.
{order_Integer,arg_}:>{order,D[arg,h]};
If [Length[clag]==0, Return[{}]];
d=Table[clag[[i,1]],{i,1,Length[clag]}]; md=Max[d];
nd=Table[Count[d,i],{i,0,md}]; htab=Table[{},{i,1,md+1}];
For [i=1,i<=Length[clag],i++, {ider,c}=clag[[i]];
If [c==0,Continue[]]; AppendTo[htab[[ider+1]],c] ];
Return[htab]];
Test:
r = u[t+h]-2*u[t]+u[t-h]+a^2*u'[t+h/2]+4*u'[t-h/4]+c*u''[t+alfa*h]/12;
htab=LagCoefficients[r,u,h];
returns {{-1, 1}, {-1/4, 1/2}, {alfa}} in htab, which is correct.
However boundary cases give me trouble. For example r=u[t+h]
returns {{}} instead of {{1}}