编写代码以在 Python 中集成一维菲涅耳衍射

问题描述 投票:0回答:3

我的任务是对以下 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))
python math physics numerical-integration
3个回答
0
投票

您在定义变量

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
之外的其他所有内容提供了初始值。


0
投票

当你像你一样定义

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)

0
投票

我认为问题出在函数

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))
在任何地方定义。

此外,第二个代码片段与第一个代码片段有很大不同。如果同样的问题适用,那么您应该完全删除第一个片段和/或重新表述您的问题,因为从我在第二个卡盘中看到的情况来看,您声称得到的错误不应该出现。

© www.soinside.com 2019 - 2024. All rights reserved.