# Lists of coefficients of derivatives

I want to extract two separate lists of coefficients of derivatives. If I have, for example,

cl= A1*D[P[x, y], {x, 1}] + A2*D[P[x, y], {x, 2}] +
A3*D[Q[x, y], {y, 3}] + A4*D[Q[x, y], {y, 1}];


I want to extract the lists {A1, A2} and {A3, A4} but do not want to type all the derivative expressions into command CoefficientList. I want to extract these lists programmatically because of I have a very long list of derivatives in my actual problem, which I thought was too long to post here.

The following seems to work, but how can I do it without typing in the list of derivatives?

Coefficient[cl, {D[P[x, y], {x, 1}], D[P[x, y], {x, 2}]}]
Coefficient[cl, {D[Q[x, y], {y, 3}], D[Q[x, y], {y, 1}]}]


Longer example

 cl2=B1*Derivative[0, 1, 0][R][x, y, z] +
B2*Derivative[2, 0, 0][R][x, y, z] +
B4*Derivative[2, 1, 3][V][x, y, z] +
B3*Derivative[3, 2, 1][R][x, y, z] + B5*Derivative[4, 1, 5][V][x, y, z] + B0*V[x, y, z]  + B00*R[x, y, z];


I need list of coefficients and list of derivatives parallel to know for which derivative is appropriate coefficient. But if I have zero derivatives, they don't appear in the list?

• @Nasser It is managed now. Please try it, I think it is working, but how to do that without typing for which derivatives I want coefficient in front. I need it all. For example CoefficientList[cl,derivatives]??
– Pipe
Dec 14, 2012 at 13:53
• Use Cases to extract the set(s) of variables of interest. Coefficient[cl, Cases[Variables[cl], HoldPattern[Derivative[__][P][__]]]] Out: {A1, A2} Dec 14, 2012 at 15:08
• @Daniel Thank you Daniel
– Pipe
Dec 14, 2012 at 23:42
• I see you updated your question again. In the future please try your best to communicate what you need from the beginning so that it does not take as many cycles to get there. Does this perform as you desire? Reap[Cases[cl3, coef_*d : Derivative[__][_][__] :> Sow[coef, d], 1], _, {#, Total@#2} &][[2]] Dec 17, 2012 at 12:02

Also borrowing from Daniel's comment, perhaps you would like:

cl = A1*D[P[x, y], {x, 1}] + A2*D[P[x, y], {x, 2}] +
A3*D[Q[x, y], {y, 3}] + A4*D[Q[x, y], {y, 1}];

Cases[cl, coef_ * Derivative[__][x_][__] :> {x, coef}, 1];

{#[[1, 1]], #[[All, 2]]} & /@ GatherBy[%, First]

{{Q, {A4, A3}}, {P, {A1, A2}}}


Or somewhat less transparently as a one-liner:

Reap[Cases[cl, coef_*Derivative[__][x_][__] :> Sow[coef, x], 1], _, List][[2]]

{{Q, {A4, A3}}, {P, {A1, A2}}}


Based on the comments below I believe you may use:

Reap[Cases[cl2, coef_ * d : Derivative[__][_][__] :> Sow[coef, d], 1], _, List][[2]]


• thank you for your attention but how to know which coefficient is with which derivative? If I will have partial derivatives, I need list of derivatives and list of coefficients parallel to know how to pair them.
– Pipe
Dec 14, 2012 at 23:29
• @Pipe please give me a longer example of desired input and output. Dec 15, 2012 at 0:15
• @ longer example is in input question
– Pipe
Dec 15, 2012 at 11:17
• @Pipe Thanks, but what output do you desire? It's still not clear to me what information you need to extract and how you want them grouped. Dec 15, 2012 at 19:34
• @Wizard I want all derivatives and all appropriate coefficients. To know order with which derivative is which coefficient
– Pipe
Dec 15, 2012 at 20:36

Turning Daniel's comment into an answer:

This is working, but how to do that not to type list of derivatives

You can do this by extracting the list you are currently type automatically. In the first list, you want all derivates wrt P. If you look at the FullForm you instantly see how such a derivative is represented internally

D[P[x,y],{x,2}]//FullForm

(* Derivative[2,0][P][x,y] *)


Important for you is only the P inside this form. Therefore, you create a pattern where everything else can be anything. This is done with Blank (_) or BlankSequence (__). For the extraction you use Cases

Cases[cl, Derivative[__][P][__], Infinity]

(* {(P^(1,0))[x,y],(P^(2,0))[x,y]} *)


This list can now be used inside Coefficient

Coefficient[cl, Cases[cl,Derivative[__][P][__],Infinity]]
(* {A1,A2} *)


It should be obvious, that you can turn this immediately into a function where you only give the differential form and the variable

deqCoeffitient[deq_, var_Symbol] :=
Coefficient[deq, Cases[Variables[deq], Derivative[__][var][__]]];
deqCoeffitient[cl,Q]
(* {A4,A3} *)


To make this more robust, you should definitely read in the documentation about Patterns and Transformation Rules.

• how to know which coefficient is with which order of derivatives? Maybe it is better to print list of coefficients and list of derivatives. I need some help about code.
– Pipe
Dec 14, 2012 at 23:24