Визуализация скалярных и векторных полей

В практике очень часто встает проблема наглядного представления функций трех переменных, которые называются полем. Различают скалярные поля \(\phi(x,y,z)\) (в каждой точке пространства задано число) и векторные поля \(\vec{E}(x,y,z)\) (в каждой точке пространства задан вектор). К скалярным полям относятся электрический и гравитационный потенциалы, распределение температур, концентраций, давлений. К векторным полям относятся поле скоростей частиц среды, напряженность электрического поля и индукция магнитного поля и т.д.

Для получения в компьютере изображения поля используют массив значений функции на некоторой сетке узлов, заданных в пространстве. Важно использовать именно сетку узлов, т.е. кроме положения каждого узла (координат точки) необходимо указать связи, указать номера узлов расположенных рядом с каждым. Это необходимо для построения гладких функций, которое возможно после выполнения интерполяции данных в точках не совпадающих с узлами сетки.

Наиболее простой способ задание сеток, имеющих простую топологию связей (6 соседей для каждого узла) заключается в задании топологий через индексы трехмерного массива \(\vec{A}(i,j,k)\). В такой топологии узел (i,j,k) находится между узлами (i-1,j,k) и (i+1,j,k) по первому направлению, между узлами (i,j-1,k) и (i,j+1,k) по второму направлению и т.д. Координаты узла задаются значениями в массиве \(\vec{A}\) - три числа, имеющими смысл координат X,Y,Z. Часто один массив \(\vec{A}(i,j,k)\) для удобства заменяют тремя массивами меньшей размерности \(X(i,j,k), \, Y(i,j,k), \, Z(i,j,k)\). Обратите внимание, что для сетки параллельной осям координат многие значения в массивах X, Y, Z повторяются, но для сетки расположенной произвольно они независимы.

Прямоугольная сетка задается функцией mgrid() из модуля numpy:
x, y, z = numpy.mgrid[0:5:20j, 0:5:0.3, 0:5].

Вдоль каждой оси задаются крайние точки разбиения 0 и 5 в данном примере и параметр разбиения :20j - разбиение на 20 интервалов, :0.3 - разбиение с шагом 0,3 (последний узел 0 + 0,3*n и не превышает 5), без параметра - шаг равен 1.

Используя функции для векторов из модуля numpy можно задать аналитическую функцию на этой сетке:
def V(x, y, z):
return numpy.cos(10*x) + numpy.cos(10*y) + numpy.cos(10*z) + 2*(x**2 + y**2 + z**2)

V3D = V(x,y,z)

Функция создает массив V3D с размерами равными размеру сетки и хранит значения, соответствующее каждому узлу.