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]],z]}&; curl@intf[x, y, z] (* Out[] := {0,0,0} *) I've posted my best attempt in an answer below, but I'm wondering what other solution approaches there are.