如何以数字方式从高斯光束中获取功率?

计算科学 数字
2021-12-06 15:51:45

给定一组评估电场的点,我想从高斯光束中获得功率。请按照我的推理告诉我什么假设可能是错误的

功率定义为:

P=|E|2dA

我们在面积上积分,那么功率是一个不依赖于几何的量。如果我们计算高斯光束横截面或球面上的积分,两个结果应该是相同的(我认为??)

为了测试这一点,我编写了一个代码来获取两个区域的电场(下面的代码),我在这里寻求如何在两种情况下集成电场的帮助。

高斯电场

我正在使用这个pdf中的表达式 (3.11)并且不改变传播方向,它是腰部的高斯光束,在方向上传播w0z^

横截面

查看 Stackoverflow结果,我正在使用半径等于高斯腰的向日葵种子排列

领域

没什么特别的,我有均匀分布在球坐标中的点矩阵。θϕ

现在,我的源代码是用 Julia 语言编写的:

using Plots
plotly()

function E_gaussian(x,y,z, k₀, w₀, E₀)
    first_term = exp(im*k₀*z)/(1 + 2*im*z/(k₀*w₀^2))
    second_term = exp(  - ((x^2 + y^2)/w₀^2)*(1/(1 + 2*im*z/(k₀*w₀^2)))  )
    E = E₀*first_term*second_term
    return E
end

function createGaussianSection(nPoints, α, w₀ )
    b = round(α*sqrt(nPoints)) # number of boundary points
    ϕ = (sqrt(5)+1)/2 # golden ratio
    screen = zeros(nPoints,3)
    for k=1:nPoints
        r = radius_sunflower(k,nPoints,b)
        θ = 2*pi*k/ϕ^2
        screen[k,1] = w₀*r*cos(θ)
        screen[k,2] = w₀*r*sin(θ)
        screen[k,3] = 0
    end
    return screen
end

function radius_sunflower(k,n,b)
    if k>n-b
        r = 1 # put on the boundary
    else
        r = sqrt(k-1/2)/sqrt(n-(b+1)/2) # apply square root
    end
    return r
end

function getE_GassianSection(screen, k₀,  w₀, E₀)
    nPoints = size(screen,1)
    E_laser = zeros(Complex{Float64}, nPoints )

    for k =1:nPoints
        xₛ = screen[k,1]
        yₛ = screen[k,2]
        zₛ = screen[k,3]
        E_laser[k] = E_gaussian(xₛ, yₛ, zₛ, k₀,  w₀, E₀)
    end
    return E_laser
end



function createSphere(Radius, θNintervals, φNintervals, w₀, k₀)
    θ_range = range(0, stop=π, length=θNintervals)
    φ_range = range(0, stop=2π, length=φNintervals)

    xₛ = Radius.*[cos(φ)*sin(θ) for θ in θ_range, φ in φ_range]
    yₛ = Radius.*[sin(φ)*sin(θ) for θ in θ_range, φ in φ_range]
    zₛ = Radius.*[cos(θ) for θ in θ_range, φ in φ_range]

    screen = zeros(size(xₛ,1),size(xₛ,2),3)
    screen[:,:,1] = xₛ
    screen[:,:,2] = yₛ
    screen[:,:,3] = zₛ

    return screen, θ_range, φ_range
end


function getE_Sphere(screen, k₀,  w₀, E₀)
    nΘ = size(screen,1)
    nΦ = size(screen,2)
    E_sphere = zeros(Complex{Float64},nΘ, nΦ )

    for θ in 1:nΘ, φ in 1:nΦ
        xₛ = screen[θ,φ,1]
        yₛ = screen[θ,φ,2]
        zₛ = screen[θ,φ,3]
        E_sphere[θ,φ] = E_gaussian(xₛ, yₛ, zₛ, k₀,  w₀, E₀)
    end
    return E_sphere
end

k₀ =  1
w₀ = 30/k₀
E₀ = 1

screenGaussin = createGaussianSection(5000, 0, w₀)
E_section = getE_GassianSection(screenGaussin, k₀,  w₀, E₀)
Intensity_section = real.( conj.(E_section).*E_section)
scatter(screenGaussin[:,1], screenGaussin[:,2], zcolor=Intensity_section, axis=:equal, label="", xlabel="x", ylabel="y")



Radius = 50/k₀
θNintervals = φNintervals = 25
screen, θ_range, φ_range = createSphere(Radius, θNintervals, φNintervals, w₀, k₀)
E_sphere = getE_Sphere(screen, k₀,  w₀, E₀)
Intensity_sphere = real.( conj.(E_sphere).*E_sphere)
scatter3d(screen[:,:,1],screen[:,:,2],screen[:,:,3], zcolor =Intensity_sphere , label="")

结果如下,颜色为局部强度: 在此处输入图像描述 在此处输入图像描述

从我展示的所有内容中,我只有Points我如何找到区域整合它们???

1个回答

感谢收件箱上的人们帮助我。

  1. 我不需要完整的球体,只有一半的球体包含与横截面相同的能量。

  2. 我可以使用我的点网格并想象它们之间的一个小区域。我设置一个点并根据最近的邻居创建一个正方形。

    2.1 在球坐标系中,面积元素为为了将此表达式转换为离散情况,我们使用以及是最近邻的平均值dA=r2sin(θ)dθdϕdθ=θ[i+1]θ[i]dϕ=ϕ[i+1]ϕ[i]θθ=(θ[i+1]+θ[i])/2

    2.2 为简单起见,截面积可以只是一个正方形网格点

  3. 此过程仅适用于远场,也就是说,如果与高斯腰部相比,球体的半径应该很大(我在示例中使用了错误的值选择)

对于所有感兴趣的人,这里有完整的工作代码:

function E_gaussian(x,y,z, k₀, w₀, E₀)
    first_term = exp(im*k₀*z)/(1 + 2*im*z/(k₀*w₀^2))
    second_term = exp(  - ((x^2 + y^2)/w₀^2)*(1/(1 + 2*im*z/(k₀*w₀^2)))  )
    E = E₀*first_term*second_term
    return E
end

function createGaussianSection(nPoints, w₀ )
    x_range = range(-w₀, stop=w₀, length=nPoints)
    y_range = range(-w₀, stop=w₀, length=nPoints)
    screen = zeros(nPoints, nPoints, 3)
    screen[:,:,1] = [x for x in x_range, y in y_range]
    screen[:,:,2] = [y for x in x_range, y in y_range]
    screen[:,:,3] .= 0
    return screen, x_range, y_range
end



function createSphere(Radius, θNintervals, φNintervals, w₀, k₀)
    θ_range = range(0, stop=π/2, length=θNintervals)
    φ_range = range(0, stop=2π, length=φNintervals)

    xₛ = Radius.*[cos(φ)*sin(θ) for θ in θ_range, φ in φ_range]
    yₛ = Radius.*[sin(φ)*sin(θ) for θ in θ_range, φ in φ_range]
    zₛ = Radius.*[cos(θ) for θ in θ_range, φ in φ_range]

    screen = zeros(size(xₛ,1),size(xₛ,2),3)
    screen[:,:,1] = xₛ
    screen[:,:,2] = yₛ
    screen[:,:,3] = zₛ

    return screen, θ_range, φ_range
end


function getE(screen, k₀,  w₀, E₀)
    nΘ = size(screen,1)
    nΦ = size(screen,2)
    E_sphere = zeros(Complex{Float64},nΘ, nΦ )

    for θ in 1:nΘ, φ in 1:nΦ
        xₛ = screen[θ,φ,1]
        yₛ = screen[θ,φ,2]
        zₛ = screen[θ,φ,3]
        E_sphere[θ,φ] = E_gaussian(xₛ, yₛ, zₛ, k₀,  w₀, E₀)
    end
    return E_sphere
end

k₀ =  1
w₀ = 30/k₀
E₀ = 1


screenGaussin, x_range, y_range = createGaussianSection(150, 2*w₀)
E_section = getE(screenGaussin, k₀,  w₀, E₀)
Intensity_section = real.( conj.(E_section).*E_section)

I_section = 0
for x = 1:(length(x_range)-1), y = 1:(length(y_range)-1)
    global I_section
    E_mean = (E_section[x, y] + E_section[x+1, y] + E_section[x, y+1]+E_section[x+1, y+1])/4
    ΔA = (x_range[x+1]-x_range[x])*(y_range[y+1]-y_range[y])
    I_section += real(conj(E_mean)*E_mean)*ΔA
end
println("Total Power Section: ", round(I_section,digits=3))


Radius = 1000/k₀
θNintervals = φNintervals = 200
screen, θ_range, φ_range = createSphere(Radius, θNintervals, φNintervals, w₀, k₀)
E_sphere = getE(screen, k₀,  w₀, E₀)
Intensity_sphere = real.( conj.(E_sphere).*E_sphere)

I_sphere = 0
for θ = 1:(θNintervals-1), φ = 1:(φNintervals-1)
    global I_sphere
    E_medio = (E_sphere[θ, φ] + E_sphere[θ+1, φ] + E_sphere[θ, φ+1]+E_sphere[θ+1, φ+1])/4
    ΔA = (Radius^2)*sin(   (θ_range[θ]+θ_range[θ+1])/2  )*(θ_range[θ+1]-θ_range[θ])*(φ_range[φ+1]-φ_range[φ])
    I_sphere += real(conj(E_medio)*E_medio)*ΔA
end
println("Total Power Sphere: ", round(I_sphere,digits=3))

println("Relation:",round(I_section/I_sphere,digits=3))

结果:

Total Power Section: 1413.028
Total Power Sphere: 1413.567
Relation:1.0