Задача кодирования с использованием уравнения Питона - Лапласа, электростатика. Как запустить функцию только в замаскированной части массива - PullRequest
0 голосов
/ 16 ноября 2018

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

    def add_flat_capacitor(self, center_x, center_y, length, width, rotation, charge):
x_shifted = self.X - center_x
y_shifted = self.Y - center_y

x_rot = np.cos(rotation) * x_shifted + np.sin(rotation) * y_shifted
y_rot = -np.sin(rotation) * x_shifted + np.cos(rotation) * y_shifted

mask_flat = (x_rot <= length / 2) & (x_rot >= -length / 2)
mask_flat &= (y_rot <= width / 2) & (y_rot >= -width / 2)

self.rho[mask_flat] += charge / mask_flat.sum() 

и функция, которая решает уравнение с формализмом Якоби

    def jacobi_solve_potential(self, max_iterations=int(1e5), eps=1e-9):
    V = np.zeros_like(self.rho, dtype=np.float64)
    V_old = np.zeros_like(self.rho, dtype=np.float64)

    error = np.inf
    iterations = 0
    while iterations < max_iterations and error > eps:

            V_old[:, :] = V
            V[1:-1, 1:-1] = V_old[2:, 1:-1]
            V[1:-1, 1:-1] += V_old[:-2, 1:-1]
            V[1:-1, 1:-1] += V_old[1:-1, :-2]
            V[1:-1, 1:-1] += V_old[1:-1, 2:]
            V += self.rho * self.ds**2
            V *= 0.25
            iterations += 1
            error = np.sum(np.abs(V - V_old)) / self.N
            V0 = V[self.n][self.n]
    return V, V0, iterations 

Итак, что функция делает, это решает уравнение Пуассона (значения зарядов на конденсаторах будут меняться при решении уравнений Пуассона, я хочу, чтобы они не изменялись => Уравнение Лапласа), мой вопрос: Как решить уравнение Лапласа? Идея довольно проста, но я не могу поместить ее в код: например, одно решение может быть таким: добавьте функцию «mask_flat» из «add_flat_capacitor» в решатель и запустите решатель только для области, где нет конденсаторов. Для области, где установлены конденсаторы V0 = заряд.

Моя проблема: 1) Можно ли просто добавить return mask_flat в конце функции add_flat_capacito и передать ее решателю в качестве аргумента? и 2) если 1) сработает, как я могу зациклить массив с маской, чтобы поместить заряды = маску, а в другом случае сделать уже написанное тело в решателе якоби?

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

edit: до сих пор не удалось решить эту проблему, с чем связано -1 голосование, и нужна ли какая-либо дополнительная информация, чтобы помочь мне?

...