4
$\begingroup$

my equations are very long (several pages). Here I will provide simple example:

eq = (g[x, y, z, t])^2*D[D[f[x, y, z, t], {x, 1}] {z, 1}] + \[Alpha]*
f[x, y, z, t]*D[D[g[x, y, z, t], {y, 1}], {z, 2}] + 
g[x, y, z, t]*D[D[f[x, y, z, t], {t, 1}] {z, 2}]+D[f[x,y,z,t],{z,2}]

So, it has several functions, constant parameters, and consists of the sum of some terms. Each term is the product of some number of these functions and it's derivatives.

I want to collect, or sort, these terms according to z-derivative. So, first, I want to sort these terms according to the highest z-derivative of the function f[x,y,z,t]. So, in the example above, first term should be g[x, y, z, t]*D[D[f[x, y, z, t], {t, 1}] {z, 2}]+D[f[x,y,z,t],{z,2}], as long as it has second derivatives of the function f[x,y,z,t] over z. After that it should be (g[x, y, z, t])^2*D[D[f[x, y, z, t], {x, 1}] {z, 1}], and then f[x, y, z, t]*D[D[g[x, y, z, t], {y, 1}], {z, 2}].

Note, that the derivative could be taken over several arguments, like g[x, y, z, t]*D[D[f[x, y, z, t], {t, 1}] {z, 2}].

I looked through the examples of Collect, but didn't find a way to specify z-derivative, as a second argument. Also it would be good, if you point out, how to show only the terms with z derivatives.

Thanks in advance, Mikhail

$\endgroup$
1
$\begingroup$

I'm sure there is an easier and shorter way of doing this so consider this a starting point.

A strange thing I noticed is that when I copied and pasted your equation into a notebook it turned into a list.

eq = g[x, y, z, t]^2*D[D[f[x, y, z, t], {x, 1}] {z, 1}] + 
   α*f[x, y, z, t]*D[D[g[x, y, z, t], {y, 1}], {z, 2}] + 
  g[x, y, z, t]*D[D[f[x, y, z, t], {t, 1}] {z, 2}] + 
  D[f[x, y, z, t], {z, 2}]

Mathematica graphics

I continue to be mystified by this however we need to take it into account.

Step 1 - Strip curly brackets

eq = eq[[1]]

Mathematica graphics

Step 2 - Break it into parts

eqList = eq[[#]] & /@ Range[Length[eq]]

Mathematica graphics

This effectively breaks it at the plus sign.

Step 3 - Sort the parts

This is the significant portion. We will use the value of the zth derivative to do the sorting.

sortedEqList = 
 Sort[eqList, 
  Total@Cases[#1, 
      Derivative[i_Integer, j_Integer, k_Integer, l_Integer][f | g][x,
         y, z, t] -> k, {0, Infinity}] > 
    Total@Cases[#2, 
      Derivative[i_Integer, j_Integer, k_Integer, l_Integer][f | g][x,
         y, z, t] -> k, {0, Infinity}] &]

Mathematica graphics

Step 4 - Join the sorted parts

If you merely rejoin the parts using Plus they will be sorted back to the original order so use Inactive.

Inactive[Plus] @@ sortedEqList

Mathematica graphics

$\endgroup$
  • $\begingroup$ Thanks a lot! That perfectly works for me! $\endgroup$ – Mikhail Genkin Oct 20 '15 at 21:17
  • $\begingroup$ Advise that you wait a couple of days before accepting. It is highly probable that someone will provide a better answer. You should select the best answer, not the fastest. $\endgroup$ – Jack LaVigne Oct 20 '15 at 22:22
  • $\begingroup$ Got it, thanks. $\endgroup$ – Mikhail Genkin Oct 21 '15 at 21:10

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

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