How can I calculate a vector derivative (i.e. divergence, gradient, curl) of interpolated data? For sample data, you can use:
f[x_, y_, z_] := Exp[I z] {1, 0, 0}
testdata=Flatten[Table[N@{x,y,z,f[x,y,z]},{x,0,4 Pi,Pi/10},{y,0,4 Pi,Pi/10},{z,0,4 Pi,Pi/10}],2];
intf = Interpolation[testdata]
I know that for 1D data, like
dim1 = Table[N@{z, f[0, 0, z]}, {z, 0, 2 Pi, Pi/10}];
int1 = Interpolation@dim1;
you can do D[int1[x],x]
. However, I can't seem to get convince MMA that the interpolated function intf
actually returns a "vector" quantity (i.e. Length@intf[x,y,z]->3
), so that I can do something like:
curl = {D[#[[3]],y]-D[#[[2]],z],-(D[#[[3]],x]-D[#[[1]],z]),D[#[[2]],x]-D[#[[1]],y]}&;
curl@intf[x, y, z]
(* Out[] := {0,0,0} *)
Similarly, this should work for gradient:
grad = {D[#[[1]], x], D[#[[2]], y], D[#[[3]], z]} &;
and divergence:
div = (D[#[[1]], x] + D[#[[2]], y] + D[#[[3]], z])&;
I've posted my best attempt in an answer below, but I'm wondering what other solution approaches there are.
D[#[[1]], y]
? $\endgroup$Derivative
for this. e.g.Derivative[0,0,1][intf][x,y,z]
. (I have to go now, so I can not post a solution) $\endgroup$D[f, {{x1, x2, ...}}] gives the vector derivative
$\endgroup$