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
Answer
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}]
I continue to be mystified by this however we need to take it into account.
Step 1 - Strip curly brackets
eq = eq[[1]]
Step 2 - Break it into parts
eqList = eq[[#]] & /@ Range[Length[eq]]
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}] &]
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
Comments
Post a Comment