※ 引述《brains (不认识)》之铭言:
: 各位好, 现在在x-y平面上面要计算一函数Epsk(x,y),
: 但是x,y只能定义在一个特殊的六角形里面.
: A_____B
: / \
: F/ \C
: \ /
: E\_____/D
: A=(-2*pi/3, 2*pi/sqrt(3))
: B=( 2*pi/3, 2*pi/sqrt(3))
: C=( 4*pi/3, 0 )
: D=( 2*pi/3,-2*pi/sqrt(3))
: E=(-2*pi/3,-2*pi/sqrt(3))
: F=(-4*pi/3, 0 )
: 若一开始用np.linspace建构x, y向量, 其座标范围涵盖这个六角形,
: 请问如何用python特殊写法限制(x,y)在此六角形里面呢?
: 例如一维的情形可用 Z = [a for a in LIST if CONDITION]来构造Z.
: 但这里二维的情况该如何写呢?
: ==================================
: #!/usr/bin/python3
: import numpy as np
: Lk = 100
: t0 = 1
: t1 = 1
: mu = 0
: x = np.linspace(-4.*np.pi/3.,4.*np.pi/3.,Lk)
: y = np.linspace(-2.*np.pi/np.sqrt(3.),2.*np.pi/np.sqrt(3.),Lk)
: # 限制x,y于六角形内?
: Epsk = - 2.*t1*np.cos(kx/2.)
: - 4.*t0*np.cos(kx/2.)*np.cos(ky*np.sqrt(3.)/2.) + mu
网络上确实有很多方法, 但面对目前简单已知的六角形, 直接定义六个边界
再进行限制即可.
kpx = []
kpy = []
for i in x:
for j in y:
if ( j<-np.sqrt(3.)*(i-2.*np.pi/3.) + 2.*np.pi/np.sqrt(3.) and
j< 2.*np.pi/np.sqrt(3.) and
j< np.sqrt(3.)*(i+2.*np.pi/3.) + 2.*np.pi/np.sqrt(3.) and
j>-np.sqrt(3.)*(i+2.*np.pi/3.) - 2.*np.pi/np.sqrt(3.) and
j>-2.*np.pi/np.sqrt(3.) and
j> np.sqrt(3.)*(i-2.*np.pi/3.) - 2.*np.pi/np.sqrt(3.) ):
#print(i,j)
kpx.append(i)
kpy.append(j)
kpoints = list(zip(kpx,kpy))