1
$\begingroup$
pointofcharge = {1, 1, 1};
pointofsecond = {5, 5, 1};
s = "Segment";
electricfield = VectorPlot3D[
   Boole[(Sqrt[(x - 1)^2 + (y - 1)^2 + (z - 1)^2] > 
        1) && (Sqrt[(x - 5)^2 + (y - 5)^2 + (z - 1)^2] > 1
       )] (Normalize[{x, y, z} - pointofcharge]/
       Norm[{x, y, z} - pointofcharge]^2 - (Normalize[{x, y, z} - 
          pointofsecond]/Norm[{x, y, z} - pointofsecond]^2)), {x, -10,
     10}, {y, -10, 10}, {z, -10, 10}, PlotRange -> All, 
   VectorPoints -> 5, PlotRangePadding -> None, VectorStyle -> s];
Show[electricfield, Graphics3D[Ball[pointofcharge, .3]], 
 Graphics3D[Ball[pointofsecond, .3]], BoxRatios -> Automatic]

I encountered an issue while attempting to show the field of point charges. I am plotting a Vectorfield3D of a positive charge field subtracted by another charge field in a different position.

All is fine except for a couple vectors near the actual point-charges that cause the scaling to be way off. There are these strange vectors that are incredibly long, which I believe to be singularities. I have tried to remove them by using Boole to only render when the radius is larger than one, but that didn't work. The long vectors still exist and I have no idea what could be causing them or if my exclusion of the singularities is invalid. The output using a radius of exclusion of 1The output using a radius of exclusion of 4

I also tried simply to limit the magnitude of the vector, but nothing could remove those unusually long vectors

 restrict[v_, limit_] := Boole[Norm[v] < limit] * v;
field[point_] := ({x, y, z} - point)/Norm[{x, y, z} - point]^3;
sambob = VectorPlot3D[
   restrict[field[pointofcharge], 5], {x, -10, 10}, {y, -10, 
    10}, {z, -10, 10}, PlotRange -> All, VectorPoints -> 6, 
   PlotRangePadding -> None, VectorStyle -> s];
Show[sambob, Graphics3D[Ball[pointofcharge, .3]], 
 Graphics3D[Ball[pointofsecond, .3]], BoxRatios -> Automatic]

Restriction of vector length greater than 5Restriction of vector length greater than 2

$\endgroup$
2

1 Answer 1

1
$\begingroup$

Since the default vector points are placed without any regard to the location of the singularities, you can get very large relative differences in the norm of the field vectors. Since the default vector arrows are rescaled relative to the 3D box and not to the absolute scale of the field vectors, you have to do any clipping or damping of the relative norm variations inside the option VectorScale. It allows you to specify a scaling function as follows:

pointofcharge = {1, 1, 1};
pointofsecond = {5, 5, 1};
s = "Segment";
electricfield = 
  VectorPlot3D[(Normalize[{x, y, z} - pointofcharge]/
      Norm[{x, y, z} - pointofcharge]^2 - (Normalize[{x, y, z} - 
         pointofsecond]/Norm[{x, y, z} - pointofsecond]^2)), {x, -10, 
    10}, {y, -10, 10}, {z, -10, 10}, PlotRange -> All, 
   VectorPoints -> 5, PlotRangePadding -> None, VectorStyle -> s, 
   VectorScale -> {Automatic, Automatic, (ArcTanh[100 #5]) &}];
Show[electricfield, Graphics3D[Sphere[pointofcharge, .3]], 
 Graphics3D[Sphere[pointofsecond, .3]], BoxRatios -> Automatic]

vectorplot3d

The choice I made here is:

VectorScale -> {Automatic, Automatic, (ArcTanh[100 #5]) &

This uses a common trick: exploit the saturation of the ArcTanh (or similarly ArcTan) functions to suppress variations at large values of the norm. The norm is passed to that function as argument number #5. This is a little weird because it's the same convention that is also used in 2D VectorPlot, even though the 3D version has more coordinates that should in principle be made available in the first six arguments, before the norm. Anyway, given that VectorScale counts arguments this way, I then compress the range of norms for which the length varies appreciably, by inserting the factor 100 in the ArcTanh.

With this scaling, it is also unnecessary to exclude the region around the charges from the vector plot, so I removed the Boole statement. Theonly other change I made was to replace Ball by Sphere so that the plot works in earlier versions of Mathematica.

$\endgroup$

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

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