猿问

python quad 集成似乎不准确

我是python的新手,正在尝试以数字方式集成函数。一切似乎都正常,但是我得到的结果与我在Mathematica中得到的结果(我知道是正确的)有很大不同。有人可以帮我弄清楚发生了什么吗?


这是代码:


def integrand(x, d, a, b, l, s, wavelength, y):

    return b*(np.sinc((np.pi*a/(wavelength*s))*(y + s*b*x/l))**2)*np.cos((np.pi*d/(wavelength*s))*(y + s*b*x/l))**2



def intensity(y):

    result, error = si.quad(integrand, -1/2, 1/2, epsrel = 1e-16, epsabs = 1e-16,

                            args=(0.0006, 0.000150, 0.000164, 0.8, 1.06, 0.0000006328, y))

    return result

例如,如果我计算强度(0),我会在 python 中得到 0.0001580120220796804,在 Mathematica 中得到 0.000158898。在 0.5% 以内,所以这看起来没问题。但是如果我计算强度(0.001),我会在 python 中得到 1.8729902318383768e-05,在 Mathematica 中得到 0.00012034,它们相差近一个数量级。请注意,我已尝试减少绝对误差和相对误差,但这没有任何效果。


任何帮助,将不胜感激。


这是Mathematica代码:


NumInt[d_, a_, b_, l_, s_, lambda_, y_] := NIntegrate[b Sinc[(a Pi/(s lambda)) (y - (s*b*

      x/l))]^2 Cos[(d Pi/(s lambda)) (y - (s*b*x/l))]^2, {x, -1/2,

1/2}]

然后


NumInt[0.0006, 0.000150, 0.000164, 0.8, 1.06, 0.0000006328, 0.001]


qq_遁去的一_1
浏览 215回答 1
1回答

慕妹3146593

numpy.sinc定义为sin(pi*x)/(pi*x)。Mathematica的Sinc函数不包含的因数pi。要修复差异,请np.pi从sinc()Python 代码中的参数中删除。当我进行更改时,我得到的结果与 Mathematica 一致(我修改intensity()为还返回由 返回的错误quad):In [12]: intensity(0)Out[12]: (0.00015889773970382816, 1.764119291800849e-18)In [13]: intensity(0.001)Out[13]: (0.00012034021042092513, 1.3360447239754727e-18)
随时随地看视频慕课网APP

相关分类

Python
我要回答