numpy 不认识“Ei”

wyyhbhjk  于 2023-04-21  发布在  其他
关注(0)|答案(1)|浏览(130)

我试着计算圆孔的点扩散函数(PSF)。我使用sympy软件包对惠更斯积分进行积分。然后我试着将结果共轭。PSF可以通过将这两者相乘来获得。但是我得到了错误:名称'Ei'没有定义。这是我的代码

import numpy as np
import matplotlib.pyplot as plt
import sympy as smp
from sympy import conjugate, I
import math
from sympy import Ei

# Define constants in SI units

wavelength = 1e-3# m
radius = 5 #m
aperture_diameter = 5e-1 # m

#Fresnel number
F=(aperture_diameter /2)**2/(wavelength*radius)

#The Huygens integral
r = smp.symbols('r', real=True)
result=smp.integrate(radius /( wavelength)*4*smp.pi*smp.exp(-2*smp.pi*I*r/wavelength)/r).simplify()

#Conjugate the result
resultstar= conjugate(result)

#Define the PSF
PSF=result*resultstar.simplify()

PSF_np=smp.lambdify(r,PSF,'numpy')
r_vals=np.linspace(0,5,100)
y_vals=PSF_np(r_vals)
plt.plot(r_vals,y_vals)

实际上我的例子中的菲涅耳数〉1,所以我不能使用Fraunhofer近似的积分。我试图绘制这个函数,但我没有得到我预期的结果。我认为这是因为这个软件包的容量有限。请帮助我,我是一个初学者。提前感谢你。

qnyhuwrf

qnyhuwrf1#

这些错误是由于numpy不知道Ei是什么而导致的。在这种情况下,您可以使用sympy(或mpmath)来计算表达式,但它肯定会更慢。让我们看看如何做到这一点:

import matplotlib.pyplot as plt
import numpy as np

r_vals=np.linspace(0, 5, 1000)
y_vals = np.zeros_like(r_vals)
for i, rv in enumerate(r_vals):
    # evaluation may produce complex number: let's remove
    # the imaginary part if it's small
    c = complex(PSF.evalf(subs={r: rv}, chop=True))
    y_vals[i] = c.real if abs(c.imag) < 1e-08 else np.nan

plt.figure()
plt.plot(r_vals, y_vals)

或者,您可以安装并使用Sympy Plotting Backend module,它能够绘制以下表达式:

from spb import *
plot(PSF, (r, 0, 5))

相关问题