Двумерная функция не возвращает массив значений? - PullRequest
0 голосов
/ 09 ноября 2018

Я пытаюсь построить двумерную функцию (в частности, двумерное решение Лапласа). Я определил свою функцию, и она возвращает правильное значение, когда я ввожу конкретные числа, но когда я пытаюсь выполнить массив значений (x, y ниже), он все равно возвращает только одно число. Я попытался использовать случайную функцию x и y (например, f (x, y) = x ^ 2 + y ^ 2), и это дает мне массив значений.

def V_func(x,y):
    a = 5
    b = 4
    Vo = 4
    n = np.arange(1,100,2)
    sum_list = []

    for indx in range(len(n)):
        sum_term = (1/n[indx])*(np.cosh(n[indx]*np.pi*x/a))/(np.cosh(n[indx]*np.pi*b/a))*np.sin(n[indx]*np.pi*y/a)
        sum_list = np.append(sum_list,sum_term)

    summation = np.sum(sum_list)
    V = 4*Vo/np.pi * summation

    return V

x = np.linspace(-4,4,50)
y = np.linspace(0,5,50)
V_func(x,y)

Out: 53,633709914177224

Ответы [ 2 ]

0 голосов
/ 09 ноября 2018

Определите пару массивов:

In [6]: x = np.arange(3); y = np.arange(10,13)
In [7]: x,y
Out[7]: (array([0, 1, 2]), array([10, 11, 12]))

Попробуйте простую функцию 2

In [8]: x + y
Out[8]: array([10, 12, 14])

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

Теперь попробуйте «трансляция». x[:,None] имеет форму (3,1)

In [9]: x[:,None] + y
Out[9]: 
array([[10, 11, 12],
       [11, 12, 13],
       [12, 13, 14]])

Результат (3,3): первые 3 из измененных x, вторые из y.

Я могу сгенерировать пару массивов с помощью meshgrid:

In [10]: I,J = np.meshgrid(x,y,sparse=True, indexing='ij')
In [11]: I
Out[11]: 
array([[0],
       [1],
       [2]])
In [12]: J
Out[12]: array([[10, 11, 12]])
In [13]: I + J
Out[13]: 
array([[10, 11, 12],
       [11, 12, 13],
       [12, 13, 14]])

Обратите внимание на добавленные параметры в meshgrid. Вот так мы и собираемся генерировать 2d-значения из пары 1d-массивов.

Теперь посмотрим, что делает sum. Как вы используете это в функции:

In [14]: np.sum(I + J)
Out[14]: 108

результат - скаляр. Смотрите документы. Если я укажу axis, я получу массив.

In [15]: np.sum(I + J, axis=0)
Out[15]: array([33, 36, 39])

Если вы дали V_func права x и y, sum_list может быть трехмерным массивом. Эта без оси sum уменьшает ее до скаляра.

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

0 голосов
/ 09 ноября 2018

Попробуйте это:

def V_func(x,y):
  a = 5
  b = 4
  Vo = 4
  n = np.arange(1,100,2)
  # sum_list = []
  sum_list = np.zeros(50)

  for indx in range(len(n)):
      sum_term = (1/n[indx])*(np.cosh(n[indx]*np.pi*x/a))/(np.cosh(n[indx]*np.pi*b/a))*np.sin(n[indx]*np.pi*y/a)
      # sum_list = np.append(sum_list,sum_term)
      sum_list += sum_term

  # summation = np.sum(sum_list)
  # V = 4*Vo/np.pi * summation
  V = 4*Vo/np.pi * sum_list

  return V
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...