我的任务是对以下 1d 菲涅耳衍射方程进行积分,红色部分为:
重点是,您正在将孔径傅里叶变换为屏幕上的图案,但现在只专注于将水平条带集成到 1d 中(暂时忽略高度)。 yprime 因此被忽略。 z 和 k 也是固定的,j 是一个虚数。我为其编写了以下代码:
import math
import numpy as np
import cmath
k=5
z=5
x=0
j=cmath.sqrt(-1)
func=math.exp((j*k/2*z)(x-xp)*(x-xp))
def X(xp1,xp2,function,N):
h=(xp2-xp1)/N
y=0.0
xp=xp1
for x in np.arange(1, N/2 +1): #summing odd order y terms
y+=4*f(xp)
xp+=2*h
xp=xp1+2*h
for x in np.arange(0, N/2): #summing even order y terms
y+=2*f(x)
xp+=2*h
integral= (h/3)*(y+f(xp1)+f(xp2))
return integral
print(simpson(0,5,func,10))
但是,它说 xp 没有定义。但我在函数中明确定义了 xp 。
有人知道可能出了什么问题吗?
谢谢
编辑:这是我的代码的更简洁的版本。但它仍然要求我定义 xp..
import math
import cmath
lamda=0.2
k=(2*math.pi)/lamda
z=0.1
def expfunc(x, xp):
func = math.exp(((1j)*k/2*z)(x-(xp))*(x-(xp)))
return(func)
def X(xp1,xp2,x,f,N):
h=(xp2-xp1)/N
y=0.0
xp=xp1
for i in np.arange(1, N/2 +1): #summing odd order y terms
y+=4*f(xp)
xp+=2*h
xp=xp1+2*h
for i in np.arange(0, N/2): #summing even order y terms
y+=2*f(xp)
xp+=2*h
integral= (h/3)*(y+f(xp1)+f(xp2))
return integral
print(X(0,1,x,expfunc,10))
您在定义变量
xp
之前尝试使用它。
import math
import numpy as np
import cmath
k=5
z=5
x=0
j=cmath.sqrt(-1)
func=math.exp((j*k/2*z)(x-xp)*(x-xp)) #xp is not defined yet
您为除
xp
之外的其他所有内容提供了初始值。
当你像你一样定义
func
时
func=math.exp((j*k/2*z)(x-xp)*(x-xp))
您定义一个名为
func
的值。您可能想要的是这样的:
func = lambda x,xp : math.exp((j*k/2*z)(x-xp)*(x-xp))
然后将
func
的呼叫更改为
y+=4*f(x, xp)
和
y+=2*f(x, xp)
我认为问题出在函数
y+=4*f(xp)
的第一个 for 循环内 X
。
最后你有
print(X(0,1,x,expfunc,10))
,其中expfunc
在代码f
中充当y+=4*f(xp)
。函数 expfunc
接受两个参数,其中之一定义为 xp
。尽管您传入 f
的变量是用名称 xp
定义的,但该函数只看到您传入了第一个参数 x
,而不是参数 xp
。
此外,我没有看到
x
中的变量 print(X(0,1,x,expfunc,10))
在任何地方定义。
此外,第二个代码片段与第一个代码片段有很大不同。如果同样的问题适用,那么您应该完全删除第一个片段和/或重新表述您的问题,因为从我在第二个卡盘中看到的情况来看,您声称得到的错误不应该出现。