先上图:
等量正电荷
等量异号电荷
maltab代码如下:
clear;
q = 1.602e-19; %元电荷带电量
Mode = input('等量正电荷请输入1,等量异号电荷请输入2,等量负电荷请输入3:');
if(Mode == 1)
q1 = q;
q2 = q;
elseif(Mode ==2)
q1 = q;
q2 = -q;
elseif(Mode == 3)
q1 = -q;
q2 = -q;
end
radius = 1; %点电荷半径
x = 20; y = 20; %x和y轴显示边界值
k = 9e+9; %k = 1/4πε
delta = 1;%引入距离误差以消除点电荷处点位无限大的问题
phi = linspace(-pi,pi,20); %电场线发射范围
for a =1:18
%--------------左半部分--------------%
%计算电势
[X,Y]=meshgrid(-x:0.5:0,-y:0.5:y);%获取左半部分矩阵
r1=sqrt((X+a).^2 + Y.^2 + delta);
r2=sqrt((X-a).^2 + Y.^2 + delta);
V1=q1*(k./r1) + q2*(k./r2);
%画等势线
min1 = min(V1,[],"all");
max1 = max(V1,[],"all");
range = linspace(min1,max1,100);
contour(X,Y,V1,range);
hold on;
%计算电场强度并绘制
if(Mode == 1)
[Ex,Ey]=gradient(-V1);
startx = -a + radius* cos(phi);
starty = radius*sin(phi);
elseif(Mode == 2)
[Ex,Ey]=gradient(-V1);
startx = -a + radius* cos(phi);
starty = radius*sin(phi);
elseif(Mode == 3)
[Ex,Ey]=gradient(V1);
startx = -a + radius*cos(phi);
starty = radius*sin(phi);
end
%quiver(X1,Y1,Ex1,Ey1); %绘制箭头矢量图
streamline(X,Y,Ex,Ey,startx,starty); %绘制电场强度线
%--------------右半部分--------------%
%计算电势
[X,Y]=meshgrid(0:0.5:x,-y:0.5:y);%获取左半部分矩阵
r1=sqrt((X+a).^2 + Y.^2+delta);
r2=sqrt((X-a).^2 + Y.^2+delta);
V2=q1*(k./r1)+q2*(k./r2);
%画等势线
min2 = min(V2,[],"all");
max2 = max(V2,[],"all");
range2=linspace(min2, max2,100);
contour(X,Y,V2,range2);
hold on;
%计算电场强度
if(Mode == 1)
[Ex,Ey]=gradient(-V2);
startx = a - radius*cos(phi);
starty = -radius*sin(phi);
elseif(Mode == 2)
[Ex,Ey]=gradient(V2);
startx = a - radius*cos(phi);
starty = -radius*sin(phi);
elseif(Mode == 3)
[Ex,Ey]=gradient(V2);
startx = a - radius*cos(phi);
starty = -radius*sin(phi);
end
%quiver(X,Y,Ex,Ey); %绘制箭头矢量图
%phi = linspace(-pi,pi,30);%左半部分已定义
streamline(X,Y,Ex,Ey,startx,starty);%绘制电场强度线
%标记正电荷位置
if(q1>0)
plot(-a,0,'r+','MarkerSize',5)
end
if(q2>0)
plot(a,0,'r+','MarkerSize',5)
end
hold off;
drawnow;%刷新图窗
end