- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我编写了以下代码来绘制从光学组件射出的光的强度,它基本上是入射场上的球面傅立叶积分,因此它具有贝塞尔函数。其参数取决于积分变量 (x
) 和绘图变量 (r
)。
from sympy import *
import matplotlib.pyplot as plt
import numpy as np
from scipy.integrate import quad
from scipy.special import jn
#constants
mm = 1
um = 1e-3 * mm
nm = 1e-6 * mm
wavelength = 532*nm
klaser = 2*np.pi / wavelength
waist = 3.2*mm
angle = 2 #degrees
focus = 125 * mm
ng = 1.5 # refractive index of axicon
upperintegration = 5
#integrals
def b(angle):
radians = angle* np.pi/180
return klaser * (ng-1) * np.tan(radians)
def delta(angle):
return np.pi/(b(angle)*waist)
def integrand(x, r):
return klaser/focus * waist**2 * np.exp(-x**2) * np.exp(-np.pi * 1j * x/delta(angle)) * jn(0, waist*klaser*r*x/focus) * x
def intensity1D(r):
return np.sqrt(quad(lambda x: np.real(integrand(x, r)), 0, upperintegration)[0]**2 + quad(lambda x: np.imag(integrand(x, r)), 0, upperintegration)[0]**2)
fig = plt.figure()
ax = fig.add_subplot(111)
t = np.linspace(-3.5, 3.5, 25)
plt.plot(t, np.vectorize(intensity1D)(t))
问题是,当我绘制它时,当我更改 linspace
中使用的点数时,绘图会发生巨大变化。
我怀疑这可能是因为积分的振荡性质,因此所采取的步长可以显着改变指数的值,从而改变积分的值。
quad
如何处理这个问题?对于这个特定的应用,是否有更好的数值积分方法?
最佳答案
在调用quad
时,将 limit
参数设置为一个较大的数字。这增加了允许使用quad
来估计积分的最大子区间数。当我使用时
def intensity1D(r):
re = quad(lambda x: np.real(integrand(x, r)), 0, upperintegration, limit=8000)[0]
im = quad(lambda x: np.imag(integrand(x, r)), 0, upperintegration, limit=8000)[0]
return np.sqrt(re**2 + im**2)
并使用定义为的数组t
计算函数
t = np.linspace(1.5, 3, 1000)
我得到以下情节:
(我还删除了 from sympy import *
行。sympy
似乎没有用于你的脚本。)
您应该始终检查作为 quad
的第二个返回值的误差估计。例如:
In [14]: r = 3.0
In [15]: val, err = quad(lambda x: np.real(integrand(x, r)), 0, upperintegration, limit=8000)
In [16]: val
Out[16]: 2.975500141416676e-11
In [17]: err
Out[17]: 1.4590630152807049e-08
正如您所看到的,误差估计远大于近似积分。 quad
返回的估计值可能比较保守,但仍应谨慎对待具有如此大误差估计值的结果。我们看一下对应的虚部:
In [25]: val, err = quad(lambda x: np.imag(integrand(x, r)), 0, upperintegration, limit=8000)
In [26]: val
Out[26]: 0.0026492702707317257
In [27]: err
Out[27]: 1.4808416189183e-08
val
现在比估计误差大几个数量级。因此,当在 intensity1D()
中计算复数值的大小时,我们最终得到的估计相对误差约为 1e-5。这可能足以满足您的计算。
在 r=2.1825 附近的峰值处,误差估计的幅度仍然很小,并且比计算的积分远小:
In [32]: r = 2.1825
In [33]: quad(lambda x: np.real(integrand(x, r)), 0, upperintegration, limit=8000)
Out[33]: (6.435730031424414, 8.801375195176556e-08)
In [34]: quad(lambda x: np.imag(integrand(x, r)), 0, upperintegration, limit=8000)
Out[34]: (-6.583055286038913, 9.211333259956749e-08)
关于python - python 中的振荡积分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49055591/
我有以下动画: .example_path { position: relative; overflow: hidden; width: 530px; heig
我真的不知道这是什么。 甚至都不知道如何找到它。 我将不胜感激任何帮助。 最佳答案 想一想祖父或其他基于钟摆的时钟的滴答声。在这种情况下,完整的滴答声周期通常为一秒钟。有了钟表,我们从重力和/或弹簧驱
有人可以指导我如何在 ImageView 上创建振荡动画吗? 我有一个标签图像,我想将其设置为动画.. 任何 CABasicAnimation 的代码片段吗??? 最佳答案 您可以使用: + (voi
我正在使用 tensorflow 在 Audioset2017 数据集上训练 ResNet50在训练和验证结果期间,我的损失函数波动,总体趋势是下降的,但我担心这一点。 我已经运行了 100 个时期,
用户 U1 在时间 t1、t2、t3 穿过区域 Z1、Z2、Z3 用户 U1 在 t1、t2、t3、t4 来回穿过区域 Z1、Z2 这就是我所说的用户 « OSCILLATING »。 这被认为是一种
我是一名优秀的程序员,十分优秀!