При попытке найти магнитное поле, вызванное распределением тока, я нахожу, что гораздо проще рассмотреть парные взаимодействия (хотя функция lambda
гораздо более питонна). Рассмотрим этот подход
class Path:
# ...
def mag_func(self, x, y, z, current = 1.0, mag_const = 1.25663706212e-6):
mag_param = current * mag_const / (4 * np.pi)
s = x.shape
res = np.zeros((s[0],s[1],s[2],3))
for i in range(s[0]):
for j in range(s[1]):
for k in range(s[2]):
for idx, (xc, yc, zc) in enumerate(zip(self.x, self.y, self.z)):
res[i,j,k,:] += mag_param * \
np.cross(self.path_vectors[idx], [x[i,j,k] - xc,
y[i,j,k] - yc, z[i,j,k] - zc]) / \
np.linalg.norm([x[i,j,k] - xc, y[i,j,k] - yc,
z[i,j,k] - zc])**2
return res[:,:,:,0], res[:,:,:,1], res[:,:,:,2]
#...
u, v, w = p.mag_func(grid_x, grid_y, grid_z)
r = np.sqrt(u**2+v**2+w**2)
ax1 = plt.subplot(111,projection='3d')
ax1.plot(xp, yp, zp, 'r-')
ax1.quiver(grid_x, grid_y, grid_z, u/r, v/r, w/r,length=1)
plt.show()
, который даст
, который является правильным представлением магнитного поля, окружающего токонесущий провод.
Что касается вопроса о том, почему lambda
не работает в первую очередь, я думаю, что это связано с созданием сетки через np.meshgrid
таким образом, чтобы внешний sum
суммировалбольше очков, чем следовало бы. Повторение вышеописанным способом устраняет эту проблему. Можно было бы использовать эту функцию lambda
, но я думаю, что вам все равно придется перебирать grid_x
, grid_y
и grid_z
в указанном порядке.