% 清除工作區
clear all
% 用戶輸入
a = input('輸入點電荷的位置如[1,0,1;2,0,2]表示位置在(1,0,1),(2,0,2): ');
Q = input('輸入點電荷的電荷量,+-表示電性,如[1,-1]: ');
a1 = input('電場線角度間隔: '); % 角度間隔
% 設置繪圖范圍
xmin = min(a(:,1)) - 4;
xmax = max(a(:,1)) + 4;
ymin = min(a(:,2)) - 4;
ymax = max(a(:,2)) + 4;
zmin = min(a(:,3)) - 4;
zmax = max(a(:,3)) + 4;
% 創建網格
x = linspace(xmin, xmax, 20); % 減少網格密度以提高性能
y = linspace(ymin, ymax, 20);
z = linspace(zmin, zmax, 20);
[X, Y, Z] = meshgrid(x, y, z);
% 計算距離和電勢
g = size(a, 1); % 電荷數量
U = zeros(size(X));
for i = 1:g
? ? R = sqrt((X - a(i,1)).^2 + (Y - a(i,2)).^2 + (Z - a(i,3)).^2);
? ? U = U + Q(i) ./ R; % 計算電勢
end
% 計算電場強度
[Ex, Ey, Ez] = gradient(-U, x(2)-x(1), y(2)-y(1), z(2)-z(1));
% 創建圖形
figure;
hold on;
axis equal;
grid on;
view(3);
xlabel('x');
ylabel('y');
zlabel('z');
title('三維點電荷系統的電場線', 'FontSize', 14);
% 繪制電荷
for i = 1:g
? ? if Q(i) > 0
? ? ? ? plot3(a(i,1), a(i,2), a(i,3), 'r+', 'MarkerSize', 16, 'LineWidth', 2);
? ? else
? ? ? ? plot3(a(i,1), a(i,2), a(i,3), 'bo', 'MarkerSize', 16, 'LineWidth', 2);
? ? end
end
% 生成電場線
r0 = 0.2; % 電場線起始半徑
theta = deg2rad(a1:a1:180); ? % 極角范圍 (0° 到 180°)
phi = deg2rad(0:a1:360); ? ? ?% 方位角范圍 (0° 到 360°)
% 只從正電荷發出電場線
for i = 1:g
? ? if Q(i) > 0
? ? ? ? for j = 1:length(theta)
? ? ? ? ? ? for k = 1:length(phi)
? ? ? ? ? ? ? ? % 球坐標轉直角坐標 (修正z坐標公式)
? ? ? ? ? ? ? ? x_start = a(i,1) + r0 * sin(theta(j)) * cos(phi(k));
? ? ? ? ? ? ? ? y_start = a(i,2) + r0 * sin(theta(j)) * sin(phi(k));
? ? ? ? ? ? ? ? z_start = a(i,3) + r0 * cos(theta(j));
? ? ? ? ? ? ? ??
? ? ? ? ? ? ? ? % 繪制電場線
? ? ? ? ? ? ? ? streamline(X, Y, Z, Ex, Ey, Ez, x_start, y_start, z_start);
? ? ? ? ? ? end
? ? ? ? end
? ? end
end
% 設置圖形屬性
axis([xmin xmax ymin ymax zmin zmax]);
light('Position',[1 1 1]);
lighting gouraud;
material shiny;
hold off;