Проблема при построении двумерной функции суммирования - PullRequest
0 голосов
/ 14 июля 2020

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

Мы должны рассмотреть плоскую апертуру с круглой границей, пересеченной семейством m концентрических c кругов с N_ {m} излучателями. . Используя круговые координаты и применяя простую алгебру, мы можем получить эту функцию с двумя переменными :

$ F (\ theta, \ phi) = 4 \ sum_ {m = 1} ^ {20 } \ sum_ {n = 1} ^ {m} I_ {m} \ cdot \ cos \ left [\ frac {\ pi (2m-1)} {4} \ cdot \ cos \ left (\ frac {(2 n -1) \ pi} {4m} \ right) \ sin (\ theta) \ cos (\ phi) \ right] \ cdot \ cos \ left [\ frac {\ pi (2m-1)} {4} \ sin \ left (\ frac {(2 n-1) \ pi} {4m} \ right) \ sin (\ theta) \ sin (\ phi) \ right] $

Поскольку m количество кругов ( 20 в этом случае), N_ {m} = 4m элементов, I_ {m} - это ток, который имеет определенное значение для каждого круга, а \ phi и \ theta - углы сферических координат (принимающие значения от - \ pi до \ pi и от 0 до \ pi соответственно).

Дело в том, что я хочу изобразить эту функцию на трехмерном графике. Я собираюсь объяснить, что я пробовал до сих пор.

Я решил определить \ phi и \ theta как numpy массивы с 50 значениями каждый. Тогда я решил создать нулевую матрицу 20x20, где будут вычисления двойной суммы. Затем я определил двойную сумму с двойным l oop.

Код, который я использовал, был следующим:

from mpl_toolkits import mplot3d
import numpy as np
import matplotlib.pyplot as plt

p=np.linspace(-np.pi, np.pi, 50) #phi angle
t=np.linspace(0,np.pi,50)        #theta angle
F=np.zeros((20,20))              #matrix 
I=np.array([1,0.961,0.851,0.689,0.510,0.377,0.360,0.429,0.497,0.521,0.494,0.427,0.340,0.257,0.199,0.178,0.181,0.191,0.200,0.204]) # I current array

for i in range(20):
    for j in range(i):
        F[i,j]= 4*I[i]*np.cos(np.pi*(2(i+1)-1)/4 * np.cos(np.pi*(2*(j+1)-1)/(4(j+1))) * np.sin(t)* np.cos(p)) * np.cos(np.pi*(2(i+1)-1)/4 * np.sin(np.pi*(2*(j+1)-1)/(4(j+1))) * np.sin(t)* np.sin(p))


ax = plt.axes(projection='3d')
ax.plot_surface(p, t, F, rstride=1, cstride=1,
                cmap='viridis', edgecolor='none')
ax.set_title('surface');

ax.set_xlabel('x')
ax.set_ylabel('y')
ax.set_zlabel('F')

При запуске файла у меня появляется следующая TypeError: 'int' объект не вызывается

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

1 Ответ

2 голосов
/ 14 июля 2020

У вас есть опечатка в вашем коде:

F[i,j]= 4*I[i]*np.cos(np.pi*(2(i+1)-1)/4 * np.cos(np.pi*(2*(j+1)-1)/(4(j+1))) * np.sin(t)* np.cos(p)) * np.cos(np.pi*(2(i+1)-1)/4 * np.sin(np.pi*(2*(j+1)-1)/(4(j+1))) * np.sin(t)* np.sin(p))

в этой строке, у вас есть опечатка, это должно быть:

F[i,j]= 4*I[i]*np.cos(np.pi*(2*(i+1)-1)/4 * np.cos(np.pi*(2*(j+1)-1)/(4*(j+1))) * np.sin(t)* np.cos(p)) * np.cos(np.pi*(2*(i+1)-1)/4 * np.sin(np.pi*(2*(j+1)-1)/(4*(j+1))) * np.sin(t)* np.sin(p))

Вы в основном пропустили 4 *.

Изменить:

Это исправляет вашу ошибку, однако вы получаете другую, поскольку F[i,j] описывает один элемент, а t, и, следовательно, np.sin(t) состоит из 50 элементы, которые не помещаются в предоставленный вами индекс.

То, как вы это сделали, излишне сложно. Попробуйте это:

  1. l oop по вашим переменным theta и phi, а также суммирование.
  2. затем суммировать, используя np.sum() вместо использования сложной векторизации . Если вы поняли, как это работает, вы все равно можете изменить его позже на скорость.
...