【问题标题】:Problem when plotting a two-dimensional summation function绘制二维求和函数时的问题
【发布时间】:2020-07-14 16:45:17
【问题描述】:

我目前正在开展一个关于天线群理论的项目。我开始从连续的平面孔径分布发展成形图案的理论。下一步是在离散数量的辐射元素上发展这一理论。

我们应该考虑一个平面孔径,其圆形边界被一组具有 N_{m} 个辐射器的 m 个同心圆切开。使用圆坐标并应用一些简单的代数,我们可以得到这个two-variable Function

$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)。

事实上,我想在 3D 图上表示这个函数。我将解释我到目前为止所做的尝试。

我决定将 \phi 和 \theta 定义为 numpy 数组,每个数组有 50 个值。然后我决定创建一个 20x20 的零矩阵,将在其中进行双和计算。然后我用双循环定义了双和。

我使用的代码如下:

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' object is not callable

我不知道它出了什么问题,也不知道如何改进程序以获得图表,甚至提高效率。

【问题讨论】:

  • stackoverflow 不支持 latex

标签: python arrays numpy matplotlib mplot3d


【解决方案1】:

您的代码中有错字:

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. 循环遍历变量 thetaphi,以及求和。
  2. 之后使用np.sum() 求和,而不是使用复杂向量化。如果您了解它是如何工作的,那么您可以在以后更改它以提高速度。

【讨论】:

  • 你好。我试图实施您对代码的建议。尽管如此,我还是发现了一些困难。首先,如果变量 p 和 t 有 50 个元素,那么我进行计算的矩阵应该是 50x50 矩阵?其次,为了循环遍历这些变量以及求和,我应该执行 4 次“for ... in range(50)”操作吗?提前谢谢你。
  • 是的,将F[theta, phi] 想象成一个二维函数,你会得到一个具有 50x50 函数值的网格。您可以绘制此网格并获得 2D 功能表面。
  • 2.: 不,为什么?您需要遍历所有函数值(range(50) 乘以 2)和求和(range(20)range(i)),没有任何改变。
猜你喜欢
  • 2020-09-03
  • 2014-07-22
  • 2017-01-27
  • 2015-08-02
  • 2014-01-17
  • 2011-03-04
  • 2010-12-15
  • 1970-01-01
  • 2013-01-21
相关资源
最近更新 更多