MTALAB实现矢量场的可视化
场是一个非常重要的概念,很多物理现象都涉及到场的分析。如何去描述一个场呢?可以通过等势面、场线和场强度矢量三个方面去描述。在MATLAB中可以借用三个函数去描绘一个物理场:quiver、streamline和contour。以电场为例,quiver可以用来表示电场的方向,streamline则可以表示电场线分布,而contour则可以用来表示电势的分布。
在物理学中,场是一个非常重要的概念,很多物理现象都涉及到场的分析。如何去描述一个场呢?可以通过等势面、场线和场强度矢量三个方面去描述。在MATLAB中可以借用三个函数去描绘一个物理场:quiver、streamline和contour。以电场为例,quiver可以用来表示电场的方向,streamline则可以表示电场线分布,而contour则可以用来表示电势的分布。
图1:正电荷和负点电荷的场分布
图2:两个等量同种点电荷的电势分布
图3:电介质的极化
图4:点电荷体系的电场分布
如图4所示:其中的箭头表示电场的方向、蓝色的线条表示电场线的分布。电场线的疏密表示电场强度的大小。而品红虚线则表示等势面的分布。在这个程序中可以生成任意多个不同位置、电荷量的空间电场分布。需要注意的是,在这张图中,因为quiver箭头显示的大小原因,其模长进行了归一化,所以只是表示方向而不能反映此处的电场强度大小。
磁场
磁场和电场的性质不同。翻开任何一本电动力学的教材,(当然,你极可能翻开的是郭硕鸿老师的那本),它都会告诉你电场是有源无旋场,所以所有的电场线必然是起始于正电荷终结于无穷远,或者起始于无穷远,终止于正电荷,而磁场则是有旋无源场,磁感线永远是闭合的,出去多少就要回来多少。磁场的仿真相比电场要复杂的多,因为要对电流元进行积分才能确认空间中某点的磁场分量Bx, By和Bz. 这里简单地仿真了环形通电线圈地磁场分布。用红色和蓝色标记不同的线圈,用点标记穿出平面向外的电流,用叉标记穿入平面向内的电流。右边的子图则是在参考平面(Z=0)处的电场分布。如果你还记得中学物理老师教你的所谓的左手力、右手场的定则(实际上,这根本就是无稽之谈),就可以很容易地判断中心的磁场方向。
图5:电流大小、方向相同、半径不同的一对单匝线圈
图6:电流大小、方向和半径均相同的一对单匝线圈
图7:电流大小、半径相同、方向不同的一对单匝线圈
图8:电流方向、半径相同、半径不同的一对单匝线圈
图9:通电螺旋管
最后,不妨展示一下三维的磁场分布, 这里用红色和蓝色代表方向不同的环形通电线圈,电流的大小和线圈的半径相同。
图10:磁场的三维可视化
clc;clear;close all;
%% 环形线圈磁场可视化
% 线圈参数 R:线圈半径;I:电流大小和方向;z;线圈位置% ds =1;电流大小、方向相同、半径不同的一对单匝线圈
% ds =2;电流大小、方向和半径均相同的一对单匝线圈
% ds =3;电流大小、半径相同、方向不同的一对单匝线圈
% ds = 4;电流方向、半径相同、半径不同的一对单匝线圈
%ds=5;多匝螺线管磁场分布
ds =5;
% 模式
coil_turns=5;%螺线管的数
Zreference=0;%x参考平面的位置
if ds ==1
R = [1,2];
I =[15,15];
z = [-3,3];
elseif ds==2
R = [1,1];
I =[15,15];
z =[-3,3];
elseif ds == 3
R = [1,1];
I =[-15,15];
z = [-3,3];
elseif ds == 4
R = [1,1];
I = [15,5];
z = [-3,3];
else
for i= 1:coil turns
R(j)= 1;
I(j)= 15;
z(j)= -3+j;
end
end
% 定义空间范围和网格
%x-z 平面
L=5;
x_xz= linspace(-L,,40);
z_xz = linspace(-L,L,40);
[Xxz,Zxz]= meshgrid(x_xz,z_xz);
Bxxz = zeros(size(X xz));
Bz_xz=zeros(size(Z xz));
%x-y 平面
x_xy= linspace(-L,L,40);
y_xy= linspace(-L,L,40);
[X_xy,Y_xy]= meshgrid(x_xy,y_xy);
Bx_xy= zeros(size(X_xy));
By_xy= zeros(size(Y xy));
%计算 x-z平面的磁场
for i= 1:numel(X xz)
r =[X_xz(i),0,Z xz(i)];
h1 =0;
h2 = 0;
for j= 1:length(R)[Bx1,~,Bz1]=biotSavartLaw(R(j),I(j),[0,0,z(j)],r);h1 = h1+ Bx1;
h2 = h2+Bz1;
end
Bx xz(i)= h1;
Bz xz(i)= h2;
end
%计算 x-y 平面的磁场
for i= 1:numel(X xy)
r =[X_xy(i),Yxy(i),Z reference];
h1 =0;
h2 = 0;
h3 = 0;
for j=1:length(R)
[Bx1,By1,Bz1]=biotSavartLaw(R(j),I(j)[0,0,z(j)],r);
h1+Bx1;h1 =
h2 =h2+By1;
h3+Bz1;h3 =
end
Bx_xy(i)= h1;
By_xy(i)= h2;
Bz_xy(i)= h3 ;
end
%绘制 x-z平面的磁场figure('position',[0 01920 1200],'color','k');%%显示x-z平面的场分布
subplot(1,2,1)
B =sqrt(Bxxz.^2+Bz xZ.^2);
quiver(Xxz,Z xz,Bx_xz./B,Bz xz./B,'AutoScale','on','LineWidth',1,'color','w');
hold on
for i= 1:length(R)
for i= 1:length(R)
if mod(i,2)== 0
s =[1,0,0];
else
s = [0,0,1];
end
DrawCircle(R(i)z(i),I(i),s,0.3)
end
%% 画出流线表示电场线
startx_xz=linspace(-4,4,5);
startzxz=linspace(-4,4,5);
[startXxz,startZxz]=meshgrid(startxxz,startz xz);
startPointsxz=[startXxz:),startZ xz(:)];
streamline(X_xz, Z_xz, Bx_xz, Bz_xz, startPoints_xz(:,1), startPoints_xz(:,2));
xlabel('X');
ylabel('z');
axis equal;axis([-L,L,-L,L]);
set(gca,'color','k')
title('Magnetic FieldinX-Z Plane');
%% 显示x-y平面的场分布
subplot(1,2,2)
for i=1:length(R)
if mod(i,2)== 0
s=[1,0,0];%偶数个线圈标记为红色
else
s=[0,0,1];%奇数个线圈标记为蓝色
end
show circuit(R(i)0.3,s)
end
B_direction(X_xy,Y_xy,Bx_xy,By_xy,Bz_xy)
xlabel('x');ylabel('Y');
axis equal;
axis([-L,L,-L,L]);
set(gca,'color','k')
title(['$B_{xy} \ \rm{at} \ Z = ',num2str(Z_reference),'\ \rm{mm}$'],'Interpreter','latex','color','b','fontname','times new roman','fontsize',20);
function[Bx,By,Bz]=biotSavartLaw(R,I,center,r)
% 根据毕奥 -萨伐尔定律计算某点的磁场
mu0=4*pi*1e-7;%真空磁导率
% 分割圆线圈为多个小段
numSegments =100;
phi = linspace(0,2*pi,numSegments);
dphi =phi(2)-phi(1);
% 初始化磁场分量
Bx = 0;
By = 0;
Bz = 0;
% 计算每个小段的贡献
for j= 1:numSegments
%计算小段的位置
r_prime=center+R*[cos(phi(j)),sin(phi(j)),0];
% 计算小段的电流元
dl=R*[-sin(phi(j)),cos(phi(j)),0]* dphi;
% 计算位置矢量差
dr =r-rprime;
dr mag = norm(dr);
%计算毕奥 -萨伐尔定律的分子
cross product=cross(dl,dr);
% 计算该小段对磁场的贡献
dB=(mu0*I/(4*pi))*(cross_product /dr_mag^3);% 累加磁场分量
Bx=Bx+ dB(1);
By= By + dB(2);
Bz =Bz + dB(3);
end
end
function DrawCircle(R,z,I,S,r)
o=linspace(0,2*pi,20);
xf 1=r*cos(o)+R;yf 1 = r*sin(o)+z;
xf 2=r*cos(o)-R;yf 2 = r*sin(o)+;
%画出右边的电流元截面
plot(xf_1,yf_1,'g','LineWidth',2)
hold on
fill(xf 1,yf 1,s,'FaceAlpha',0.5);
% 画出左边的电流元截面
plot(xf_2,yf_2,'g','LineWidth',2)
fill(xf 2,yf 2,s,'FaceAlpha',0.5);
if I>0
%如果电流大于0,则表示从上面看是逆时针,右边标记为x,左边标记为
plot(R,z,'yx','Markersize',10);
plot(-R,z,'y.','MarkerSize',10);
else
%如果电流小于8,则表示从上面看是顺时针,右边标记为·,左边标记为x
plot(R,z,'W.','MarkerSize',10);plot(-R,z,'wx','MarkerSize',10);
end
end
Function show circuit(R,r,s)
% 绘制表示电流的圆环
o= linspace(0,2*pi,100);
x1=R*cos(o);y1=R* sin(o);
x2=(R-r)*cos(t);y2=(R-r)* sin(t);
plot(x1,y1,'g','LineWidth',2);hold on;
plot(x2,y2,'g','LineWidth',2);
fill([x1, fliplr(x2)], [y1, fliplr(y2)],s,'facealpha',0.5,'EdgeColor','none');
end
function B_direction(X,Y,Bx,By,Bz)
% 标记垂直平面的磁场
threshold = 1e-3; % 用于判断磁场是否接近垂直的阈值
hold on
for i = 1:numel(X)
if abs(Bx(i)) < threshold && abs(By(i)) < threshold
if Bz(i) > 0
plot(X(i), Y(i), 'w.', 'MarkerSize', 10); % 如果是垂直纸面向外标记为点磁场 elseif
Bz(i) < 0
plot(X(i), Y(i), 'wx', 'MarkerSize', 10); % 如果是垂直纸面向里标记为×磁场 end
end
end
end
更多推荐
所有评论(0)