使用箭袋在matlab中绘制矢量函数
Plot vector function in matlab using quiver
我有用笛卡尔坐标表示的电偶极子的函数,我想使用 Matlab 创建矢量场。
函数是
我想出的代码是:
clear;
clc;
p = 1;
e = 8.85*10^(-12);
x =linspace(-5 , 5, 50);
z = linspace(-5 , 5 ,50);
[X, Z ] = meshgrid(x,z );
R=sqrt(X.^2+Z.^2) ;
EX =( p .* 3 .* X .* Z )./ (4.*pi.*e ./ R.^5);
EZ = p./( 4 .* pi .* e ) .* ( 3.* Z.^2 ./R.^5 -1./ R.^3);
quiver ( X , Z , EX , EZ ) ;
但它没有给我想要的输出,看起来像这样
有人有什么想法吗?我将不胜感激!
我之前的尝试没有成功,我再试一次。 :) 我相信您已经非常接近解决方案了。我注意到两件事。
首先,我认为您在 EX
的 MATLAB 方程式中有错字。不应该是EX =( p .* 3 .* X .* Z ./ R.^5 )./ (4.*pi.*e );
来对应你写的等式吗?
其次,从等长向量来看,您作为示例显示的图似乎显示了场的方向(但不是大小)。原始向量在幅度上变化很大,因此并没有真正全部显示在图中。这是因为它们随着 1/r^3
或 1/r^5
的函数而减少 - 如此之快以至于无法看到与接近原点的那些相比较小的任何一个。
所以我决定尝试使用 EX
的固定方程,并在绘制它们之前将向量 [EX(jj) EZ(jj)]
归一化为单位长度(也稍微改变了绘图范围):
p = 1;
e = 8.85*10^(-12);
x =linspace(-0.5 , 0.5, 50);
z = linspace(-0.5 , 0.5, 50);
[X, Z ] = meshgrid(x,z );
R=sqrt(X.^2+Z.^2) ;
EX =( p .* 3 .* X .* Z ./ R.^5 )./ (4.*pi.*e );
EZ = p./( 4 .* pi .* e ) .* ( 3.* Z.^2 ./R.^5 -1./ R.^3);
%// normalize the vectors so the arrows are visible
V = [EX(:) EZ(:)];
Vn = bsxfun(@rdivide, V, sqrt(sum(V.^2,2)));
Exn = reshape(Vn(:,1), size(EX));
Ezn = reshape(Vn(:,2), size(EZ));
quiver ( X , Z , Exn , Ezn ) ;
这是最终结果,稍微放大了 - 更好?
顺便说一下,您可以通过调整构建网格的矢量来控制绘图的分辨率。希望您能找到合适的选择!
我有用笛卡尔坐标表示的电偶极子的函数,我想使用 Matlab 创建矢量场。
函数是
我想出的代码是:
clear;
clc;
p = 1;
e = 8.85*10^(-12);
x =linspace(-5 , 5, 50);
z = linspace(-5 , 5 ,50);
[X, Z ] = meshgrid(x,z );
R=sqrt(X.^2+Z.^2) ;
EX =( p .* 3 .* X .* Z )./ (4.*pi.*e ./ R.^5);
EZ = p./( 4 .* pi .* e ) .* ( 3.* Z.^2 ./R.^5 -1./ R.^3);
quiver ( X , Z , EX , EZ ) ;
但它没有给我想要的输出,看起来像这样
有人有什么想法吗?我将不胜感激!
我之前的尝试没有成功,我再试一次。 :) 我相信您已经非常接近解决方案了。我注意到两件事。
首先,我认为您在 EX
的 MATLAB 方程式中有错字。不应该是EX =( p .* 3 .* X .* Z ./ R.^5 )./ (4.*pi.*e );
来对应你写的等式吗?
其次,从等长向量来看,您作为示例显示的图似乎显示了场的方向(但不是大小)。原始向量在幅度上变化很大,因此并没有真正全部显示在图中。这是因为它们随着 1/r^3
或 1/r^5
的函数而减少 - 如此之快以至于无法看到与接近原点的那些相比较小的任何一个。
所以我决定尝试使用 EX
的固定方程,并在绘制它们之前将向量 [EX(jj) EZ(jj)]
归一化为单位长度(也稍微改变了绘图范围):
p = 1;
e = 8.85*10^(-12);
x =linspace(-0.5 , 0.5, 50);
z = linspace(-0.5 , 0.5, 50);
[X, Z ] = meshgrid(x,z );
R=sqrt(X.^2+Z.^2) ;
EX =( p .* 3 .* X .* Z ./ R.^5 )./ (4.*pi.*e );
EZ = p./( 4 .* pi .* e ) .* ( 3.* Z.^2 ./R.^5 -1./ R.^3);
%// normalize the vectors so the arrows are visible
V = [EX(:) EZ(:)];
Vn = bsxfun(@rdivide, V, sqrt(sum(V.^2,2)));
Exn = reshape(Vn(:,1), size(EX));
Ezn = reshape(Vn(:,2), size(EZ));
quiver ( X , Z , Exn , Ezn ) ;
这是最终结果,稍微放大了 - 更好?
顺便说一下,您可以通过调整构建网格的矢量来控制绘图的分辨率。希望您能找到合适的选择!