How to start streamlines on the surface of a sphere? griddedInterpolant requires at least two sample points in each dimension
4 vues (au cours des 30 derniers jours)
Afficher commentaires plus anciens
I have read the documentation but I'm still having trouble
%VECTOR FIELD AND FIELD LINES OF A STATIC ELECTRIC DIPOLE%
%(1) Go ahead and define the constant 1/(4*pi*epsilon0)
epsilon0 = 8.85*((10)^(-12));
constant1 = ((4*pi)^(-1))*epsilon0;
%(2) Define the grid over which the vector field will be defined. We want a thickened spherical shell that "just barely"
% excludes the origin to avoid singularities. Keep in mind that in regards to phi(the azimuthal angle) 0 = 2*pi; We don't want redundant
%points that will cause the interpolation feature when drawing field lines to produce a "non-unique points" error.
%Same with theta(the elevation angle) which is awkward given the usual spherical coordinate convention, but for some reason only
%half the field shows up if we only vary theta from 0 to pi. By letting theta vary from 0 to 2*pi, hopefully we don't run into "non-unique
%points" error.
%(n-1) will represent the actual number of points in each vector
n=25;
rmin = 0.2;
rmax = 2.0;
phi = linspace(0,2*pi - ((n)^(-1))*2*pi,n-1);
theta = linspace(0,2*pi - ((n)^(-1))*2*pi,n-1);
r = linspace(rmin,rmax,n-1);
%(3) Form a meshgrid of Spherical coordinates from (2)
[Phi,Theta,R] = meshgrid(phi,theta,r);
%(4) Convert the entire mesh from (3) into Cartesian Coordinates
[X,Y,Z] = sph2cart(Phi,Theta,R);
%(5) Create a new meshgrid for the innermost sphere, this will serve as our starting points for drawing streamlines. Remember we must
%also convert this Spherical meshgrid to Cartesian.
phi2 = linspace(0,2*pi - ((n)^(-1))*2*pi,n-1);
theta2 = linspace(0,2*pi - ((n)^(-1))*2*pi,n-1);
rstart = rmin
[Phi2,Theta2,Rstart] = meshgrid(phi2,theta2,rstart);
[Xstart,Ystart,Zstart] = sph2cart(Phi2,Theta2,Rstart);
%(7) From the documentation of streamlines it seems that startx, starty, startz must be column vectors consisting of all the x,y,z starting points
% respectively. It seems that corresponding entries must in said column vectors form starting points.
%Extract vectors from [Xstart,Ystart,Zstart] and then transpose
Xstart2 = Xstart(:);
Ystart2 = Ystart(:);
Zstart2 = Zstart(:);
Xstart3 = Xstart2';
Ystart3 = Ystart2';
Zstart3 = Zstart2';
%(6) Plot the "position vector field" from (4) and try to draw streamlines. Hopefully we do not get the error "grid vectors must contain
%unique points". If we succesfully plot the vector field and field lines then comment this section out and move on to the actual field of
%the dipole.
figure
quiver3(X,Y,Z,X,Y,Z)
hold on
streamline(X,Y,Z,X,Y,Z,Xstart3,Ystart3,Zstart3)
I keep getting the error "griddedInterpolant requires at least two sample points in each dimension". I'm almost positive that this refers to "startx","starty", and "startz" part of the streamline argument. Furthermore I am almost positive that my set of start points satisfy the requirement of having two sample points in each dimension.
I'm trying to eventually plot the electric field of an electric dipole but first I want to plot the vector field and associated streamlines of the so-called "position vector field" (x,y,z) = (x,y,z)
I have succesfully plotted the vector field by creating a spherical meshgrid.
Now I Want to plot streamlines starting on the innermost sphere of the domain (radius = 0.2) but I'm having tremendous difficulty.
My code is shown above.
Any help is appreciated and hopefully I'll glean a greater understanding of what these functions do and how they work.
Thanks in Advanced,
Omar
0 commentaires
Réponse acceptée
Fabio Freschi
le 2 Jan 2020
It looks like streamline does not accepts coordinates coming from your spherical construction. If you start form a cartesian grid it works (note the filtering of the field to avoid the singularities)
%VECTOR FIELD AND FIELD LINES OF A STATIC ELECTRIC DIPOLE%
%(1) Go ahead and define the constant 1/(4*pi*epsilon0)
epsilon0 = 8.85*((10)^(-12));
constant1 = ((4*pi)^(-1))*epsilon0;
%(2) Define the grid over which the vector field will be defined. We want a thickened spherical shell that "just barely"
% excludes the origin to avoid singularities. Keep in mind that in regards to phi(the azimuthal angle) 0 = 2*pi; We don't want redundant
%points that will cause the interpolation feature when drawing field lines to produce a "non-unique points" error.
%Same with theta(the elevation angle) which is awkward given the usual spherical coordinate convention, but for some reason only
%half the field shows up if we only vary theta from 0 to pi. By letting theta vary from 0 to 2*pi, hopefully we don't run into "non-unique
%points" error.
%(n-1) will represent the actual number of points in each vector
n=25;
rmin = 0.2;
rmax = 2.0;
%%%%% THIS IS THE NEW PART %%%%%%
x = linspace(-rmax,rmax,n);
[X,Y,Z] = meshgrid(x,x,x);
% field
Fx = X;
Fy = Y;
Fz = Z;
% remove singularities
idx = sqrt(X.^2+Y.^2+Z.^2) < rmin;
Fx(idx) = NaN;
Fy(idx) = NaN;
Fz(idx) = NaN;
%%%%%% END %%%%%%
%(5) Create a new meshgrid for the innermost sphere, this will serve as our starting points for drawing streamlines. Remember we must
%also convert this Spherical meshgrid to Cartesian.
phi2 = linspace(0,2*pi - ((n)^(-1))*2*pi,n-1);
theta2 = linspace(0,2*pi - ((n)^(-1))*2*pi,n-1);
rstart = rmin;
[Phi2,Theta2,Rstart] = meshgrid(phi2,theta2,rstart);
[Xstart,Ystart,Zstart] = sph2cart(Phi2,Theta2,Rstart);
%(7) From the documentation of streamlines it seems that startx, starty, startz must be column vectors consisting of all the x,y,z starting points
% respectively. It seems that corresponding entries must in said column vectors form starting points.
%Extract vectors from [Xstart,Ystart,Zstart] and then transpose
Xstart2 = Xstart(:);
Ystart2 = Ystart(:);
Zstart2 = Zstart(:);
Xstart3 = Xstart2';
Ystart3 = Ystart2';
Zstart3 = Zstart2';
%(6) Plot the "position vector field" from (4) and try to draw streamlines. Hopefully we do not get the error "grid vectors must contain
%unique points". If we succesfully plot the vector field and field lines then comment this section out and move on to the actual field of
%the dipole.
x = linspace(-1,1,n);
[X,Y,Z] = meshgrid(x,x,x);
figure
quiver3(X,Y,Z,Fx,Fy,Fz)
hold on
figure, axis equal
streamline(X,Y,Z,Fx,Fy,Fz,Xstart3,Ystart3,Zstart3)
view([1 1 1]);
3 commentaires
Fabio Freschi
le 2 Jan 2020
1) Yes
2) The streamlines are created by matlab built-in function interpolating the field using the values on the cartesian meshgrid, starting from the supplied points. I filtered out the points inside the sphere using NaNs
Plus de réponses (0)
Voir également
Catégories
En savoir plus sur Polar Plots dans Help Center et File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!