为什么更高带宽的强度分布会有噪声?
Why is there noise for higher bandwidth intensity distributions?
我一直在尝试通过计算计算评估以下电场:
它基本上是给定波长的波的总和,由波长的高斯分布的平方根加权。
我通过 Python 通过包 scipy.integrate.quad 函数对 $x$ 的每个值执行高斯正交积分来计算它。代码如下:
# Imports
import numpy as np
import scipy as sp
from scipy import integrate
# Parameters
mu = 0.635 # mean wavelength
sigma = 0.01 # std dev of wavelength distribution
# wl is wavelength
x_ara = np.arange(0, 1.4, 0.01)
# Limits of Integration
lower, upper = mu - 4*sigma, mu+4*sigma
if lower < 0 :
print('lower limit met')
lower = 1e-15 # cannot evaluate sigma = 0 due to singularity for gaussian function
# Functions
def Iprofile_func(wl, mu, sigma):
profile = np.exp(-( ((wl-mu) / (np.sqrt(2)*sigma))**2))
return profile
def E_func(x_ara, wl, mu, sigma):
return np.sqrt(Iprofile_func(wl, mu, sigma)) * np.cos(2*np.pi/wl * (x_ara))
# Computation
field_ara = np.array([])
for x in x_ara:
def E(wl):
return E_func(x, wl, mu, sigma)
field = sp.integrate.quad(E, lower, upper)[0]
field_ara = np.append(field_ara, field)
我固定 $\mu$ 的值 = 0.635,并对 $\sigma$ 的两个值执行相同的计算,$\sigma$ = 0.01 和 $\sigma$ = 0.2。我得到的数组,我在下面绘制,上面的图是波长分布,而下面的图是计算场数组:
为什么sigma值增大时计算域会出现噪声?
对于大 x,即使 lambda 的微小变化也会导致被积函数快速波动。在某些时候,数值积分例程要么需要非常非常长的时间来收敛,要么不会考虑足够多的积分点,因此每个积分点的贡献不会完全抵消,并且会准确显示您看到的噪声。当我 运行 代码时,我实际上从 scipy 收到关于达到限制 ("IntegrationWarning: The maximum number of subdivisions (50) has been achieved.") 的警告。
好消息:您知道对于足够大的 x,积分必须为零。超出合理范围就不用计算了。
示例:
x = 10,mu = 0.635,sigma = 0.01
积分界限为 mu+/-4sigma = [0.595, 0.675]
2Pi/0.595*10=105.6, 2Pi/0.675*10=93.08
这意味着被积函数在 x=10 的波长范围内大约有两次振荡。
x = 100,其他都一样
这意味着被积函数在波长范围内振荡 20 次。
x = 10,mu = 0.635,sigma = 0.1
积分界限为 mu+/-4sigma=[0.235, 1.035]
2Pi/0.235*10=267.37, 2Pi/1.035*10=60.71
这意味着被积函数在 x=10 处的波长范围内振荡了 33 次。
x = 100,其他都一样
这意味着被积函数在波长范围内有 329 次振荡。
如果 x 或 sigma 变大,将需要越来越多的积分点。因此,对于更大的 x,没有其他方法可以增加 scipy.integrate 中的限制。
我一直在尝试通过计算计算评估以下电场:
它基本上是给定波长的波的总和,由波长的高斯分布的平方根加权。
我通过 Python 通过包 scipy.integrate.quad 函数对 $x$ 的每个值执行高斯正交积分来计算它。代码如下:
# Imports
import numpy as np
import scipy as sp
from scipy import integrate
# Parameters
mu = 0.635 # mean wavelength
sigma = 0.01 # std dev of wavelength distribution
# wl is wavelength
x_ara = np.arange(0, 1.4, 0.01)
# Limits of Integration
lower, upper = mu - 4*sigma, mu+4*sigma
if lower < 0 :
print('lower limit met')
lower = 1e-15 # cannot evaluate sigma = 0 due to singularity for gaussian function
# Functions
def Iprofile_func(wl, mu, sigma):
profile = np.exp(-( ((wl-mu) / (np.sqrt(2)*sigma))**2))
return profile
def E_func(x_ara, wl, mu, sigma):
return np.sqrt(Iprofile_func(wl, mu, sigma)) * np.cos(2*np.pi/wl * (x_ara))
# Computation
field_ara = np.array([])
for x in x_ara:
def E(wl):
return E_func(x, wl, mu, sigma)
field = sp.integrate.quad(E, lower, upper)[0]
field_ara = np.append(field_ara, field)
我固定 $\mu$ 的值 = 0.635,并对 $\sigma$ 的两个值执行相同的计算,$\sigma$ = 0.01 和 $\sigma$ = 0.2。我得到的数组,我在下面绘制,上面的图是波长分布,而下面的图是计算场数组:
为什么sigma值增大时计算域会出现噪声?
对于大 x,即使 lambda 的微小变化也会导致被积函数快速波动。在某些时候,数值积分例程要么需要非常非常长的时间来收敛,要么不会考虑足够多的积分点,因此每个积分点的贡献不会完全抵消,并且会准确显示您看到的噪声。当我 运行 代码时,我实际上从 scipy 收到关于达到限制 ("IntegrationWarning: The maximum number of subdivisions (50) has been achieved.") 的警告。
好消息:您知道对于足够大的 x,积分必须为零。超出合理范围就不用计算了。
示例:
x = 10,mu = 0.635,sigma = 0.01
积分界限为 mu+/-4sigma = [0.595, 0.675]
2Pi/0.595*10=105.6, 2Pi/0.675*10=93.08
这意味着被积函数在 x=10 的波长范围内大约有两次振荡。
x = 100,其他都一样
这意味着被积函数在波长范围内振荡 20 次。
x = 10,mu = 0.635,sigma = 0.1
积分界限为 mu+/-4sigma=[0.235, 1.035]
2Pi/0.235*10=267.37, 2Pi/1.035*10=60.71
这意味着被积函数在 x=10 处的波长范围内振荡了 33 次。
x = 100,其他都一样
这意味着被积函数在波长范围内有 329 次振荡。
如果 x 或 sigma 变大,将需要越来越多的积分点。因此,对于更大的 x,没有其他方法可以增加 scipy.integrate 中的限制。