Take the 2-minute tour ×
Mathematica Stack Exchange is a question and answer site for users of Mathematica. It's 100% free, no registration required.

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?

share|improve this question
    
@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 '12 at 13:53
1  
Use Cases to extract the set(s) of variables of interest. Coefficient[cl, Cases[Variables[cl], HoldPattern[Derivative[__][P][__]]]] Out: {A1, A2} –  Daniel Lichtblau Dec 14 '12 at 15:08
    
@Daniel Thank you Daniel –  Pipe Dec 14 '12 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]] –  Mr.Wizard Dec 17 '12 at 12:02
add comment

2 Answers 2

up vote 1 down vote accepted

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]]

Mathematica graphics

share|improve this answer
    
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 '12 at 23:29
    
@Pipe please give me a longer example of desired input and output. –  Mr.Wizard Dec 15 '12 at 0:15
    
@ longer example is in input question –  Pipe Dec 15 '12 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. –  Mr.Wizard Dec 15 '12 at 19:34
    
@Wizard I want all derivatives and all appropriate coefficients. To know order with which derivative is which coefficient –  Pipe Dec 15 '12 at 20:36
show 7 more comments

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} *)

Further reading

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.

share|improve this answer
    
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 '12 at 23:24
add comment

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.