【问题标题】:Using functions to create Electric Field array for 2d Density Plot and 3d Surface Plot使用函数为 2d 密度图和 3d 表面图创建电场阵列
【发布时间】:2018-05-03 18:42:23
【问题描述】:

下面是我的代码,我应该使用电场方程和给定的变量来创建方程的密度图和曲面图。我得到“图像数据的无效维度”可能是因为函数 E 采用多个变量并试图将它们全部显示为多个维度。我知道问题是我必须将 E 变成一个数组才能显示密度图,但我不知道该怎么做。请帮忙。

import numpy as np
from numpy import array,empty,linspace,exp,cos,sqrt,pi
import matplotlib.pyplot as plt

lam = 500 #Nanometers
x = linspace(-10*lam,10*lam,10)
z = linspace(-20*lam,20*lam,10)
w0 = lam
E0 = 5

def E(E0,w0,x,z,lam):
    E = np.zeros((len(x),len(z)))
    for i in z:
        for j in x:
            E = ((E0 * w0) / w(z,w0,zR(w0,lam)))
            E = E * exp((-r(x)**2) / (w(z,w0,zR(w0,lam)))**2)
            E = E * cos((2 * pi / lam) * (z + (r(x)**2 / (2 * Rz(z,zR,lam)))))
    return E

def r(x):
    r = sqrt(x**2)
    return r

def w(z,w0,lam):
    w = w0 * sqrt(1 + (z / zR(w0,lam))**2)
    return w

def Rz(z,w0,lam):
    Rz = z * (1 + (zR(w0,lam) / z)**2)
    return Rz

def zR(w0,lam):
    zR = pi * lam
    return zR

p = E(E0,w0,x,z,lam)

plt.imshow(p)

【问题讨论】:

  • E 在您的情况下是一维的。为了显示为图像,它需要是二维或三维的。
  • 不确定您到底想做什么,但您的问题可能从这里开始E = ((E0 * w0) / w(z,w0,zR(w0,lam)))。您正在将使用 np.zeros 创建的二维数组重新分配给一维数组。此外,您从未使用过ij。您是否尝试单独分配数组的每个值?如果是这样,你必须索引它(比如E[0][1] is row0 col1)
  • 啊,所以 E 应该是 x 和 z 维度,并且应该使用我在函数 E() 中尝试做的电场函数绘制,但我不是确定如何做到这一点

标签: python arrays function numpy matplotlib


【解决方案1】:

我花了太多时间和思考,但在搜索了类似问题的类似代码示例后,我终于弄明白了。正确的代码如下:

import numpy as np
from numpy import array,empty,linspace,exp,cos,sqrt,pi
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

lam = 500*10**-9 #Nanometers
x1 = linspace(-10*lam,10*lam,100)
z1 = linspace(-20*lam,20*lam,100)

[x,y] = np.meshgrid(x1,z1)
w0 = lam
E0 = 5
r = sqrt(x**2)
zR = pi * lam
w = w0 * sqrt(1 + (y / zR)**2)
Rz = y * (1 + (zR / y)**2)

E = (E0 * w0) / w
E = E * exp((-r**2 / w**2))
E = E * cos((2 * pi / lam) * (y + (r**2 / (2 * Rz))))

def field(x,y):
    lam = 500*10**-9
    k = (5 * lam) / lam * sqrt(1 + (y / (pi*lam))**2)
    k *= exp(((-sqrt(x**2)**2 / (lam * sqrt(1 + (y / pi * lam)**2))**2)))
    k *= cos((2 / lam) * (y + ((sqrt(x**2)**2 / (2 * y * (1 + (pi * lam / y)**2))))))
    return k

#Density Plot
f = field(x,y)
plt.imshow(f)
plt.show()

#Surface Plot
fig = plt.figure()
ax = fig.gca(projection='3d')
surf = ax.plot_surface(x,y,E,rstride=1,cstride=1)
plt.show

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-02
    • 2015-11-03
    • 1970-01-01
    相关资源
    最近更新 更多