2

I have two vector functions

f[x_, y_, z_] := {x, y, z}
g[x_, y_, z_] := {y, 10, x}

I want to take the cross product of these two vectors at every point. This should result in another vector function.

How would I do so without creating a loop using Cross? This seems inefficient.

Edit:

The question was in regard to interpolation functions. The method suggested in the comments does not work

(*create data to interpolate*)
(*each corressponds to the values in \
that direction for each function *)  
fx = Table[1, 1000];
fx = ArrayReshape[fx, {10, 10, 10}];
fy = Table[1, 1000];
fy = ArrayReshape[fy, {10, 10, 10}];
fz = Table[1, 1000];
fz = ArrayReshape[fz, {10, 10, 10}];
gx = Table[-1, 1000];
gx = ArrayReshape[gx, {10, 10, 10}];
gy = Table[-1, 1000];
gy = ArrayReshape[gy, {10, 10, 10}];
gz = Table[-1, 1000];
gz = ArrayReshape[gz, {10, 10, 10}];


(*interpolate to get vector interpolation function *) 
iff = ListInterpolation /@ {fx, fy, fz};
ifg = ListInterpolation /@ {gx, gy, gz};

gif[x_, y_, z_] := (#[x, y, z] & /@ ifg) ;
fif[x_, y_, z_] := (#[x, y, z] & /@ iff) ;

VectorPlot3D[{gif[x, y, z], fif[x, y, z]}, {x, 1, 10}, {y, 1, 10}, {z,
   1, 10}]

(*this does not work *) 
f[x,y,z]\[Cross]g[x,y,z] (*credit to kglr*)

I would like the cross produce between f & g.

Tomi
  • 4,366
  • 16
  • 31
  • 2
    f[x, y, z]\[Cross]g[x, y, z] or Cross @@ Through[{f, g}@##] &[x, y, z]? – kglr Apr 22 '17 at 00:21
  • This works for the example I gave. The issue is I have a 3D interpolation function. The same method does not work. I will edit the equation to reflect this and give a MWE. My mistake. Apologies. – Tomi Apr 22 '17 at 00:27
  • 2
    did you try fif[x,y,z] \[Cross] gif[x,y,z]? – kglr Apr 22 '17 at 10:55
  • @kglr's method Cross[gif[x, y, z], fif[x, y, z]] works perfectly more me. Just like cross[] in Marius' answer. – Michael E2 Apr 22 '17 at 12:23
  • I did try last night, however, I must've made an error. Both methods work. – Tomi Apr 22 '17 at 12:28

2 Answers2

2
f[x, y, z]\[Cross]g[x, y, z]

{x y - 10 z, -x^2 + y z, 10 x - y^2}

or

Cross @@ Through[{f, g}@##] &[x, y, z]

{x y - 10 z, -x^2 + y z, 10 x - y^2}

kglr
  • 394,356
  • 18
  • 477
  • 896
2

As I wrote about in this answer, the normal way to combine InterpolatingFunctions is to use FunctionInterpolation. But before I show how to do this, let me try to rephrase the InterpolatingFunctions you have used.

What you want from your example is one constant vector field $$\mathbf{f}(x,y,z) = (1,1,1)$$ and another constant vector field $$\mathbf{g}(x,y,z) = (-1,-1,-1)$$ if I understand correctly. The way I think one should do that is

coordinatePoints = Tuples[Range[1, 10], 3];
fInterpol = Interpolation[Tuples[{coordinatePoints, {{1, 1, 1}}}]];
gInterpol = Interpolation[Tuples[{coordinatePoints, {{-1, -1, -1}}}]];

Now these are InterpolatingFunctions that have vectors as output, e.g.

fInterpol[1,2,3]

{1,1,1}

as you can see when you define them:

f definition

Now, I could actually not get Mathematica 10.0.2 to make an InterpolatingFunction out of the cross product like I usually would, because it does not seem to support vector output; I get error messages when I try to do

crossFailed = FunctionInterpolation[fInterpol[x, y, z]~Cross~gInterpol[x, y, z], {x, 1, 10}, {y, 1, 10}, {z, 1, 10}]

But of course this is not needed: you can simply do:

cross[x_, y_, z_] := fInterpol[x, y, z]~Cross~gInterpol[x, y, z]

However, unless we choose some other values for $\mathbf{f}$ and/or $\mathbf{g}$, the result is always {0,0,0} :p

Marius Ladegård Meyer
  • 6,805
  • 1
  • 17
  • 26