基于Matlab的电磁场与波“带电圆棒电场电势”仿真

零、代码中用到的drawEline函数

在使用代码前记得把这个函数和仿真文件放到一个文件夹下哦

function pipi=drawEline(h1,d1,d2)
 
posAxes = get(gca, 'Position');  %获取当前坐标区位置信息
posX = posAxes(1);
posY = posAxes(2);
width = posAxes(3);
height = posAxes(4);%分解位置信息
hold on;
limX = get(gca, 'Xlim');%获取x轴范围
limY = get(gca, 'Ylim');%获取y轴范围
minX = limX(1);
maxX = limX(2);
minY = limY(1);
maxY = limY(2);
x=[h1(1).XData(d1) h1(1).XData(d2)];
y=[h1(1).YData(d1) h1(1).YData(d2)];
xNew = posX + (x - minX) / (maxX - minX) * width;
yNew = posY + (y - minY) / (maxY - minY) * height;%通过坐标变换得到箭头的绝对坐标
pipi=annotation('arrow', xNew, yNew);

一、有限长带电圆棒电场电势仿真

1.目的:

  了解有限长导体棒的电场计算方法,并用MATLAB实现形象化。

2.理论分析:

基于Matlab的电磁场与波“带电圆棒电场电势”仿真_第1张图片

3.源代码与结果:

3.1二维图源代码:

clear all
lam=1e-9;
ep0=8.85*1e-12;  %真空介电常数和电荷线密度
c0=lam/(4*pi*ep0);
Lh=3;
x=-6.5:0.11:6.5;
y=-5.5:0.11:5.5;
l=-Lh:0.1:Lh;
[X,Y,L]=meshgrid(x,y,l);
r=sqrt((Y-L).^2+X.^2);
dv=c0./r; %电势微分
v=pi/40*trapz(dv,3); 
[Ex,Ey]=gradient(-v);
figure
axis([-6,6,-5,5]);
L=line([0,0],[-3,3],'color','r','linestyle','-','linewidth',5.5);%画出带电棒
hold on
C=contour(X(:,:,1),Y(:,:,1),v,6:3:32,'c');
clabel(C,'FontSize',10);
%画出等势面,x(:,:,1)是对x的索引。
hold on
sx=0.05; %规定电场线起始点
sy=-3:0.4:3;
[Sx,Sy]=meshgrid(sx,sy);
h1=streamline(X(:,:,1),Y(:,:,1),Ex,Ey,Sx,Sy);%画流体线
for i=1:16
    h1=streamline(X(:,:,1),Y(:,:,1),Ex,Ey,Sx(i),Sy(i));
    drawEline(h1,164,165);%循环画好右半面箭头
end         
hold on
h2=streamline(X(:,:,1),Y(:,:,1),Ex,Ey,-Sx,Sy);
for i=1:16
    h2=streamline(X(:,:,1),Y(:,:,1),Ex,Ey,-Sx(i),Sy(i));
    drawEline(h2,164,165); %循环画好左半面箭头
end
xlabel('x');
ylabel('y');

3.2二维图截图:

基于Matlab的电磁场与波“带电圆棒电场电势”仿真_第2张图片

二、无限长线电荷电场仿真:

1.目的:

  将无限长线电荷与点电荷比拟,画出其电场分布,用MATLAB实现。在代码的后期优化过程中,我将电荷比作为一个输入参数,通过输入不同的参数,就可以很方便的实现不同的仿真现象。

2.理论分析:

 基于Matlab的电磁场与波“带电圆棒电场电势”仿真_第3张图片

3.源代码与结果:

3.1二维图源代码:

clear
dhb=input('请输入电荷比:');    %输入电荷比
xm=2.5;x=linspace(-xm,xm);            
ym=2;y=linspace(0,ym);                                
[X,Y]=meshgrid(x,y);                  
R1=sqrt((X+1).^2+Y.^2);                %第一个电荷到场点的距离
R2=sqrt((X-1).^2+Y.^2);                %第二个电荷到场点的距离
U=2*(log(1./R1)+dhb*log(1./R2));	   %电势
u=-3:0.5:3;                            %等势线向量 
C=contour(X,Y,U,u);clabel(C,'FontSize',10); %画1,2象限等势线并取坐标,标记等势线的值
grid on,axis equal,hold on
contour(X,-Y,U,u)	       %画34象限等势线
C=atan((X+1)./Y)+dhb*atan((X-1)./Y);%计算电场线常数
r0=0.1;                                %电场线起点半径
dth=20;                                %第一个电荷的起始角和间隔
th=dth:dth:180-dth;                    %角度向量
th=th*pi/180;                          %化为弧度
x0=r0*cos(th)-1;                       %起点横坐标
y0=r0*sin(th);                         %起点纵坐标
c=atan((x0+1)./y0)+dhb*atan((x0-1)./y0);%计算等高线常数
contour(X,Y,C,c,'b','LineWidth',1)     %画上面等值线(电场线)
contour(X,-Y,C,c,'b','LineWidth',1)    %画下面等值线(电场线)
title('直线电荷的电场线和等势线','FontSize',12)%显示标题
xlabel('\itx/a','FontSize',12),ylabel('\ity/a','FontSize',12)
txt=['电势单位:\itk\lambda\rm_1,电荷密度比:',num2str(dhb)];%电势文本
text(-xm,ym-0.5,txt,'FontSize',12)     %标记电势文本
 
Ey=Y.*(R2.^2+dhb*R1.^2);            %场强的y分量
Ex=(X+1).*R2.^2+dhb*(X-1).*R1.^2;   %场强的x分量
h=streamline(X,Y,Ex,Ey,x0,y0);%画左上部流线
set(h,'LineWidth',1,'Color','b')   
  for i=1:8
    h=streamline(X,Y,Ex,Ey,x0(i),y0(i));
    drawEline(h,264,265);
  end
h=streamline(X,-Y,Ex,-Ey,x0,-y0);      %画左下部流线
set(h,'LineWidth',1,'Color','b')       
for i=1:8
    h=streamline(X,-Y,Ex,-Ey,x0(i),-y0(i));
    drawEline(h,264,265);
end
if dhb>0                            %同种电荷情况下,电场线增多重新计算
    dth=dth*abs(1/dhb);             %第二个电荷的起始角和步长
    th=dth:dth:180-dth; %角度向量
    Nm=fix((180-2*dth)/dth);        %计算电场线条数用于箭头函数调用
    th=th*pi/180;                      %化为弧度
    x0=r0*cos(th)+1;                   %起点横坐标
    y0=r0*sin(th);                     %起点纵坐标
    c=atan((x0+1)./y0)+dhb*atan((x0-1)./y0);%计算等高线常数
    contour(X,Y,C,c,'b','LineWidth',1) %画上面等值线(电场线)
    contour(X,-Y,C,c,'b','LineWidth',1)%画下面等值线(电场线)
    h=streamline(X,Y,Ex,Ey,x0,y0); %画右上部电场线
    for i=1:Nm+1
    h=streamline(X,Y,Ex,Ey,x0(i),y0(i));
    drawEline(h,264,265);
    end
    set(h,'LineWidth',1,'Color','b') 
    h=streamline(X,-Y,Ex,-Ey,x0,-y0);  %画右下部电场线
    set(h,'LineWidth',1,'Color','b') 
    for i=1:Nm+1
    h=streamline(X,-Y,Ex,-Ey,x0(i),-y0(i));
    drawEline(h,264,265);
    end   
end

3.2二维图截图:

基于Matlab的电磁场与波“带电圆棒电场电势”仿真_第4张图片基于Matlab的电磁场与波“带电圆棒电场电势”仿真_第5张图片基于Matlab的电磁场与波“带电圆棒电场电势”仿真_第6张图片基于Matlab的电磁场与波“带电圆棒电场电势”仿真_第7张图片

你可能感兴趣的:(仿真,matlab,电磁学)