Всегда было интересно как же рисовать линии напряженности не только на интуитивном уровне - от плюсы к минусу, но и на практике. Как на самом деле они выглядят в каждой точке на нашем условном поле? Сейчас и разберемся по ходу дела рассматривать и более сложные системы точек, используя силу языка python.

Теория

Любой заряд создает вокруг себя поле, которое влияет на другие заряды - электрическое поле.

Также в сумме некоторое количество зарядов создает вокруг себя поле, с различным влиянием в каждой точке. Поэтому для обнаружения и исследования электрического поля нам нужен заряд, который называют пробным. Этот заряд мы берем, чтобы «попробовать», существует ли в той или иной точке пространства электрическое поле: если в какой-то точке на этот заряд действует электрическая сила.


Сила с которой взаимодействуют два заряда описывается законом Кулона.

Пусть у нас есть два неподвижных заряда, тогда силой Кулона называется силы, выражаемой формулой:

 \vec{F_{12}} = \frac{1}{4\pi \varepsilon_0} \frac{q_1q_2}{|\vec{r_2}-\vec{r_1}|^3}|\vec{r_2}-\vec{r_1}|

где \vec{r_1} \ \vec{r_2} радиус векторы первого и второго заряда, а \varepsilon_0 диэлектрическая постоянная. Формула на самом деле очень похожа на формулу гравитационного взаимодействия. Можно сделать такую же аналогию - сила зависит от величины двух объектов и расстояния между ними, помноженную на какую-то константу.

Обобщение на случай распределенного заряда:

 \vec{F}_{12} = \frac{q_2}{4\pi \varepsilon_0} \int\limits_{V} \frac{(\vec{r_2}-\vec{r_1})\rho_1(\vec{r_1}) dV}{|\vec{r_2}-\vec{r_1}|^3}

Здесь у нас q_1 не просто заряд, а какое-то тело. Не вдаваясь в подробности, мы пользуемся аддитивностью силы (\vec{F}=\vec{F_1}+\vec{F_2}) и высчитываем силу от заряда q_2 до маленькой части тела q_2. Уменьшив размеры части тела и сложив все такие силы, мы получим интеграл.


С помощью пробного заряда можно оценить “силу влияния” какого-то поля - этой величиной называется напряженность электрического поля.

Напряженность \vec{E} в точке пробного заряда q пропорциональна силе \vec{F} и обратно пропорциональна заряду q

\vec{E} = \frac{\vec{F}}{q}

Соответственно напряженность поля в точке заряда q_2:

 \vec{E}(\vec{r_2}) = \frac{1}{4\pi \varepsilon_0} \int\limits_{V} \frac{(\vec{r_2}-\vec{r_1})\rho_1(\vec{r_1}) dV}{|\vec{r_2}-\vec{r_1}|^3}

Так же как и сила \vec{F}, напряженность электрического поля \vec{E} аддитивна

\vec{E}=\vec{E_1}+\vec{E_2}

также это свойство называется принципом суперпозиции. То есть в рассматриваемой нами статье напряженность точки \vec{E(x_0)} - точка пространства, можно получить сложив напряженность относительно q_1, q_2 и плоскости:

\vec{E} = \vec{E_1} + \vec{E_2} +  \vec{E_{пл}}

Моделирование

Для некоторого упрощения понимания результата работы было принято решение смотреть на плоскость - срез - проходящий через две точки и пересекающий перпендикулярно плоскость.

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

А именно две точкиPoint(number charge, number x, number y)

и прямую Line(number charge, number[] firstPoint, number[] secondPoint).

Сигнатуру методов указана для упрощения понимания =)

class ElectricField:
    dt0 = 0.01  # The time step for integrations
    def __init__(self, charges):
        #Инициализация поля по вводным объектам
        self.charges = charges

    def vector(self, x):
        #Возвращает все вектора поля
        return np.sum([charge.E(x) for charge in self.charges], axis=0)

    def magnitude(self, x):
        #Возвращает длину вектора
        return norm(self.vector(x))

    def angle(self, x):
        #Возвращает угол от оси абцисс до вектора в радианах
        return np.arctan2(*(self.vector(x).T[::-1])) 

Каждый из этих объектов имеет метод, который вычисляет напряженность \sim\vec{E} в какой-то пробной точке по своей специфичной для своего рода объекта формуле.

Например, для класса Point это \frac{q}{r^3}\vec{r}.

Что примечательно мы не просто так опускаем коэффициент пропорциональности k. Дело в том, что этот скаляр влияет лишь на длину всех векторов в поле, поэтому опустив, его мы не упустим наглядности результата. Весь код вы можете найти в дополнительных материалах.

Соответственно, наши объекты будут обладать начальными условиями: Point зарядом и координатами на плоскости, Line зарядом и двумя точками, на длине которой этот заряд определен.

# Создадим объекты и засунем их в поле 
charges = [Line(1, [0, -10], [0, 10]),
        Point(-1, [-1, 0]), 
           Point(1, [1, 0])]
field = ElectricField(charges)

Инициализируем дополнительно наши размеры, массивы размеров ширины и высоты, а далее пройдемся по выделенными нами точкам.

x, y = np.meshgrid(np.linspace(XMIN/ZOOM+XOFFSET, XMAX/ZOOM+XOFFSET, 41),
                      np.linspace(YMIN/ZOOM, YMAX/ZOOM, 31))
u, v = np.zeros_like(x), np.zeros_like(y)
n, m = x.shape
# Вот тут проходим по точкам
for i in range(n):
    for j in range(m):
				# Если точка лежит на прямой Е = 0
        if any(charge.is_close([x[i, j], y[i, j]]) for charge in charges):
            u[i, j] = v[i, j] = None
        else:
						# Находим длину и корректируем ее немного 
            mag = field.magnitude([x[i,j], y[i,j]])**(1/5)
						# Находим угол и суем компоненты вектора в u v массивы
            a = field.angle([x[i,j], y[i,j]])
            u[i, j], v[i, j] = mag*np.cos(a), mag*np.sin(a)

После чего нам остается кое-что поправить в графике и вывести его функцией pyplot.show()

Примеры

Пусть у нас даны начальные условия двух точек и прямой.

charges = [Line(1, [0, -10], [0, 10]),
        Point(-1, [-1, 0]), 
           Point(1, [1, 0])]

Довольно ожидаемая картина - линии напряженности выходят из положительно заряженных объектов и входят в отрицательно заряженные.

Тогда если изменить заряды на одинаковые:

Отличие лишь в направлении каждого вектора - они поменяли направление из-за знака.

Что если изменить величину зарядов:

Как и ожидалось - более заряженные объекты искривляют электрическое поле больше. Опять же аналогия с гравитационным полем: чем больше масса там больше тело изменяет пространство вокруг себя.

Однако все ли здесь хорошо?

Что происходит? Мне в школе говорили, что одинаково заряженные объекты отталкиваются, а тут получается, что не совсем?

Однако если посмотреть на всю картину, то станет ясно, кто во всем виноват:

Построим более наглядную картину, увеличив отрицательный заряд.

Очень сильно отрицательно заряженная точка искривляет поле так, что влияние этой положительно заряженной линии Line просто подавляется, но если посмотреть более пристально, то можно увидеть, что длина линий напряженности после прохождения Line немного увеличивается.

При огромном желании эти графики построить можно самому. Этот код я частично позаимствовал у tomduck. Кстати, у него еще больше показательных примеров не только 2-D, но и 3-D графиков. Очень рекомендую посмотреть хотя бы описание библиотеки.

Спасибо, что посмотрели этот пост, который был лишь для защиты проектной лабораторной по физике с моделированием.

Linear Quadrupole with Central Cluster
Linear Quadrupole with Central Cluster

Комментарии (9)


  1. Matshishkapeu
    09.11.2022 00:35
    +4

    Не проще взять вполне бесплатный FEMM и решать в нем вполне полноценные электрические и магнитные поля в двумерном и аксиально симметричном приближении? Питоновый апи есть (для извращенцев есть даже на луа), покрывает все от создания геометрии, генерацию сетки, решение уравнений, пост процессинг.


  1. agalakhov
    09.11.2022 02:37
    +5

    Эм... это очень сложный путь вычислений. Проще считать не напряженность поля, а потенциал, а потом его дифференцировать. Можно считать и четырехмерный потенциал электромагнитного поля (скалярный электрический + векторный магнитный).


    1. ksbes
      09.11.2022 16:03

      Тогда уж сразу векторный потенциал — тогда и динамику можно будет сравнительно просто моделировать.
      Но зачем? Так как сделанно — программа проще, хотя и значительно менее универсальная.


  1. AKudinov
    09.11.2022 08:05
    +10

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


    1. BigBeaver
      09.11.2022 11:14
      +2

      Тут есть интересный прикол. Заряд над бесконечной проводящей плоскостью эквивалентен паре зарядов противоположного знака, расположенных зеркально. То есть, считать-то особо и нечего — это прямо азы.

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

      Отсюда также очевидно, что сила взаимодействия между зарядом и плоскостью равна силе взаимодействия между фактическим зарядом и его зеркальным отображением, а также то, что эта сила взаимодействия является силой притяжения.


  1. dkolomiets
    09.11.2022 09:34

    Ну только у вас не силовые линии, а сами силы в каждой точке на сетке. Силовые линии, это линии уровня скального потенциала. Их относительная плотность должна быть пропорциональна модулю потенциала. Вот на последней картинке, там да - силовые линии.


    1. Matshishkapeu
      09.11.2022 11:43

      Линии уровня потенциала это вроде эквипотенциали, силовые линии будут по градиентам этого потенциала.


      1. dkolomiets
        09.11.2022 13:12

        Да, точно…


  1. mechanicmind
    09.11.2022 21:28
    +2

    У поверхности проводника векторы электрического поля имеют только нормальную составляющую…