Đây là chương trình viết trên Matlab mô phỏng điện trường bao quanh thanh dài tích điện đều. Vector cường độ điện trường biểu diễn trên mạng lưới 3D các điểm trong không gian. Cường độ điện trường được tính toán bằng cách chia nhỏ thanh dài ra thành nhiều đoạn nhỏ, mỗi đoạn có thể xem như một điện tích điểm, tạo ra điện trường theo định luật Coulomb. Tại mỗi vị trí trong không gian, điện trường được tích phân lại theo các “điện trường Coulomb” từ các phần nhỏ ấy.
Kết quả tính toán thể hiện như hình dưới.
Code chương trình
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 | function Electric_field_vector_Rod % Author: Tran Hai Cat % Created: 2019.02.01 clc; clear all; close all; %% INPUT DATA Q = 2e-9; % charges L = 2; N = 50; streak_arrow = 1; % 1-MUI TEN CONG, 0-MUI TEN THANG xmin = -1; xmax = 3; ymin = -1; ymax = 1; zmin = -1; zmax = 1; %% CALCULATION lambda = Q/L; dx = L/N; dq = lambda*dx; Nx = 20; Ny = 11; Nz = 11; x = linspace(xmin,xmax,Nx); y = linspace(ymin,ymax,Ny); z = linspace(zmin,zmax,Nz); [X,Y,Z] = meshgrid(x,y,z); ke = 9e9; Ex = zeros(size(X)); Ey = zeros(size(Y)); Ez = zeros(size(Z)); r1 = sqrt(Y.^2+Z.^2); x_rod = 0; for iN = 1:N r = sqrt((X-x_rod).^2+Y.^2+Z.^2); E = ke*dq./r./r; Ex = Ex+E./r.*(X-x_rod); % x-component of vector field Ey = Ey+E./r.*Y; % y-component of vector field Ez = Ez+E./r.*Z; % z-component of vector field condition = find((r1<0.3)&(X>0)&(X<2)); Ex(condition) = 0; Ey(condition) = 0; Ez(condition) = 0; x_rod = x_rod+dx; end %% FIGURES figure('name','Electric Field Rod','color','w','numbertitle','off'); if streak_arrow streakarrow3d(X,Y,Z,Ex,Ey,Ez,2,1); else quiver3(X,Y,Z,Ex,Ey,Ez,'AutoScaleFactor',3); end hold on % Draw the rod: x1 = linspace(0,2,2); phi = linspace(0,2*pi,20); y1 = 0.1*cos(phi); z1 = 0.1*sin(phi); [X1,Y1] = meshgrid(x1,y1); Z1 = zeros(size(Y1)); for i = 1:length(x1) Z1(:,i,:) = z1; end mesh(X1,Y1,Z1,'FaceColor','interp'); %% Axis properties axis equal axis([xmin xmax ymin ymax zmin zmax]); rotate3d on xlabel('X, m'); ylabel('Y, m'); zlabel('Z, m'); view(-20,30); box on grid off set(gca,'color','w') function hh=streakarrow3d(X,Y,Z,U,V,W,np,AC) %% Bertrand Dano 03-09 % Copyright 1984-2009 The MathWorks, Inc. DX=abs(X(1,1,1)-X(1,2,1)); DY=abs(Y(1,1,1)-Y(2,1,1)); DZ=abs(Z(1,1,1)-Z(1,1,2)); DD=min([DX DY DZ]); ks=DD/100; % Size of the "dot" for the tuft graphs np=np*10; alpha = 3; % Size of arrow head relative to the length of the vector beta = .15; % Width of the base of the arrow head relative to the length XYZ=stream3(X,Y,Z,U,V,W,X,Y,Z); Vmag=sqrt(U.^2+V.^2+W.^2); Vmin=min(Vmag(:));Vmax=max(Vmag(:)); Vmag=Vmag(:); cmap=colormap; for k=1:length(XYZ) F=XYZ(k); [L M]=size(F{1}); if L<np F0{1}=F{1}(1:L,:); if L==1 F1{1}=F{1}(L,:); else F1{1}=F{1}(L-1:L,:); end else F0{1}=F{1}(1:np,:); F1{1}=F{1}(np-1:np,:); end P=F1{1}; if AC==1 vcol=floor((Vmag(k)-Vmin)./(Vmax-Vmin)*64); if vcol==0; vcol=1; end COL=[cmap(vcol,1) cmap(vcol,2) cmap(vcol,3)]; else COL='k'; end hh=streamline(F0); set(hh,'color',COL,'linewidth',.5); if L>1 x1=P(1,1); y1=P(1,2); z1=P(1,3); x2=P(2,1); y2=P(2,2); z2=P(2,3); u=x2-x1; v=y2-y1; w=z2-z1; uv=sqrt(u.*u + v.*v); xa1=x2+u-alpha*(u+beta*(v+eps)); xa2=x2+u-alpha*(u-beta*(v+eps)); xa3=x2+u-alpha*u; ya1=y2+v-alpha*(v-beta.*(u+eps)); ya2=y2+v-alpha*(v+beta.*(u+eps)); ya3=y2+v-alpha*v; za1=z2+w-alpha*w; za2=z2+w-alpha*(w+beta.*(uv+eps)); za3=z2+w-alpha*(w-beta.*(uv+eps)); plot3([x2 xa1 xa2 x2 xa3 xa3 x2],[y2 ya1 ya2 y2 ya3 ya3 y2],[z2 za1 za1 z2 za2 za3 z2],'color',COL); hold on end end axis image |