零、代码中用到的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.理论分析:
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:16h1=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:16h2=streamline(X(:,:,1),Y(:,:,1),Ex,Ey,-Sx(i),Sy(i));drawEline(h2,164,165); %循环画好左半面箭头
end
xlabel('x');
ylabel('y');
3.2二维图截图:
二、无限长线电荷电场仿真:
1.目的:
将无限长线电荷与点电荷比拟,画出其电场分布,用MATLAB实现。在代码的后期优化过程中,我将电荷比作为一个输入参数,通过输入不同的参数,就可以很方便的实现不同的仿真现象。
2.理论分析:
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:8h=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:8h=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+1h=streamline(X,Y,Ex,Ey,x0(i),y0(i));drawEline(h,264,265);endset(h,'LineWidth',1,'Color','b') h=streamline(X,-Y,Ex,-Ey,x0,-y0); %画右下部电场线set(h,'LineWidth',1,'Color','b') for i=1:Nm+1h=streamline(X,-Y,Ex,-Ey,x0(i),-y0(i));drawEline(h,264,265);end
end