Вводя сферические координаты, мы получаем задачу без ограничений.
Ничто не мешает ограничить
- ровно Ваши ограничения на невыход за пределы сферы. Но вот расстояния считать ... Кажется идея сферических координат понятнее человеку, но вычислительно сложнее.
4) Сильно хотелось получить экспериментальное подтверждение, что заряды будут располагаться на сфере и не будет зарядов во внутренних точек шара. Интуитивно кажется, что на сфере им будет сильно тесно, а во всём шаре как-то по просторнее будет. Но это обманчивое впечатление.
Рассмотрим более простую плоскую задачу о размещении 12-ти точек либо равномерно по окружности, либо с одной в центре. В первом случае получим энергию
, во втором
. Так что предположение об уходе всех зарядов на окружность/сферу можно считать опровергнутым.
Программа вычисления энергии (PARI/GP, нумерация точек с нуля):
Код:
? n=12; s=0; for(a=0,n-1, xa=cos(2*Pi*a/n); ya=sin(2*Pi*a/n); for(b=a+1,n-1, xb=cos(2*Pi*b/n); yb=sin(2*Pi*b/n); s+=1/sqrt((xa-xb)^2+(ya-yb)^2); )); print(s)
59.807361517912216645287326607752374640 - 12 точек равномерно по окружности
? n=12; n1=n-1; s=0; for(a=1,n-1, xa=cos(2*Pi*a/n1); ya=sin(2*Pi*a/n1); s+=1/sqrt(xa^2+ya^2); for(b=a+1,n-1, xb=cos(2*Pi*b/n1); yb=sin(2*Pi*b/n1); s+=1/sqrt((xa-xb)^2+(ya-yb)^2); )); print(s)
59.575675119700148343736842593912324610 - 11 точек равномерно по окружности, 12-я (которая первая) в центре
Примечательно что для
ситуация обратная, выгоднее размещать заряды по окружности. А для
выгоднее одну посадить в центр.
Разумеется для больших
выгодной окажется другая конфигурация, не только строго на окружности и в центре.
Для 3D задачи ситуация думаю аналогичная, начиная с некоторого
(понятно что больше
) выгоднее оставить заряды в центре/объёме, он(и) будут дальше от соседей чем если бы все были на сфере.
Кроме того, Вы кажется смешиваете две совершенно разные задачи: распределение зарядов в объёме и точно на сфере. Статья лишь про вторую. И заголовок данной темы тоже только про вторую. Вы уж определитесь какую хотите решать, они имеют кардинально разные решения (вероятно для всех n больше нескольких наименьших).
Пару советов с точки зрения программирования.
Для отладки алгоритма полезно ограничиться двухмерной задачей, и считать быстрее, и показать проще, и точных решений известно больше.
Если точки неким образом отсортировать по убыванию расстояния от текущей, то можно обрывать расчёт силы как только накопленная сила стала раз в 10 больше оставшейся (т.е. что учёт всех остальных точек даст точно менее 10% текущей накопленной величины), это легко оценить просто домножив последнюю найденную силу на количество необработанных точек. Да, вектор силы при этом будет не совсем точным (как по величине, так и по направлению), но при достаточно малом шаге вычислений это внесёт лишь малые колебания траектории, не более. Вопрос лишь как отсортировать точки по расстоянию до текущей ... Но вдруг у Вас это ещё где-нибудь понадобится и тогда можно будет воспользоваться бесплатно.
Можно проверять что направление силы/перемещения всех точек не меняло знака с прошлой итерации, т.е. что все заряды перемещаются (примерно) в ту же сторону. Если для какой-то поменяло, то лучше уменьшить шаг итераций. Этим наверное будут гаситься колебания из-за погрешностей вычислений.
Ещё для гашения колебаний можно сначала вычислить все силы - и обнулить например все что меньше медианной (или меньше 20% от максимальной, или ещё как), этим обрубятся мелкие перемещения при наличии больших. Фактически трение, но зависимое от текущих сил, т.е. точность решения не ухудшает, но думаю ускоряет схождение.