ベクトル場である電場を描画してみる。
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 |
## Python 3.12.2, numpy 2.2.3, matplotlib 3.10.1 import numpy as np import matplotlib.pyplot as plt k_e = 8.9875517873681764e9 #クーロン定数 1/4πε0 def compute_electric_field_point_charge(q, r0, positions): fields = np.zeros_like(positions) for i in range(positions.shape[0]): r = positions[i] - r0 r_norm = np.linalg.norm(r) if r_norm != 0: fields[i] = k_e * q * r / (r_norm**3) return fields def plot_electric_fields(): fig = plt.figure(figsize=(10, 10)) ax = fig.add_subplot(111, projection='3d') charge_position = np.array([0., 0., 0.]) charge_magnitude = 1e-10 grid_x, grid_y, grid_z = np.mgrid[-3.: 3.: 9j, -3.: 3.: 9j, -3.: 3.: 9j] positions = np.c_[grid_x.ravel(), grid_y.ravel(), grid_z.ravel()] E_point = compute_electric_field_point_charge(charge_magnitude, charge_position, positions) field_vectors = E_point.reshape(grid_x.shape[0], grid_x.shape[1], grid_x.shape[2], 3) plt.quiver(grid_x, grid_y, grid_z, field_vectors[:,:,:,0], field_vectors[:,:,:,1], field_vectors[:,:,:,2], color='blue') plt.scatter(charge_position[0], charge_position[1], color='red', s=50, label='Point Charge') plt.title('Electric Field Visualization (Optimized)') plt.xlabel('x-axis') plt.ylabel('y-axis') plt.legend() plt.show() plot_electric_fields() |
画像が止まっていると解り難いけど、マウスで回転させながら見ると、それなりになっている。numpy.mgridが便利。