我的python脚本表现为一种不可理解的方式。这是一个相当复杂的脚本,为了简单起见,我在这里最小化,希望在这里保留所有重要的功能。
问题:我试图用一组共同的参数来模拟几条实验曲线。首先,我从输入参数中计算出两个函数SLD1和SLD2,它们将用于确定实验曲线。
Phi1, Phi2, SLD1, SLD2 = nr.Par(fit_params, Files, GFP, coher)
SLD1和SLD2具有相同的尺寸,但具有不同的值。如上所述,从SLD1和SLD2我计算实验曲线并将它们存储在数组的第5列(datax和datay)。
for i in range(len(Files)):
qexp, RRexp, RRerr, qres = np.loadtxt(Files[i], unpack=True, skiprows=24, usecols=(0,1,2,3))
dataset = np.zeros(shape=(len(qexp),5))
dataset[:,0:4] = np.column_stack((qexp*10, RRexp, RRerr, qres*10))
data.append(dataset)
Phi1, Phi2, SLD1, SLD2 = nr.Par(fit_params, Files, GFP, coher)
datax = np.copy(data, order='K')
datay = np.copy(data, order='K')
for i in range(len(Files)):
q = data[i][:,0]
datax[i][:,4] = np.copy(nr.NRcalc(q, SLD1[:,i,:],GFP))
datay[i][:,4] = np.copy(nr.NRcalc(q, SLD2[:,i,:],GFP))
print(SLD2[:,1,:]- SLD1[:,1,:])
print(nr.NRcalc(data[1][:,0], SLD1[:,1,:], GFP)-nr.NRcalc(data[1][:,0], SLD2[:,1,:],GFP))
print(datax[1][:,4]-datay[1][:,4])
在我的程序概念中,在datax [i] [:,4]中,应使用SLD1计算实验曲线,并使用SLD2存储在datay [i] [:,4]中。但是,这两列是完全相同的!事实上,
print(datax[1][:,4]-datay[1][:,4])
返回一个零数组。实际上,在计算datay [i] [:,4]时,我也在覆盖datax [i] [:,4]。我无法理解的是为什么,
print(nr.NRcalc(data[1][:,0], SLD1[:,1,:], GFP)-nr.NRcalc(data[1][:,0], SLD2[:,1,:],GFP))
返回正确的值。我插入了太多np.copy命令,希望能解决问题,这似乎是一个不需要的数组链接。但是,这并没有改变输出。为了完整起见,我还发布了Nr.Calc函数:
def NRcalc(q,SLDt,GFP):
start = timeit.default_timer()
RR = np.ndarray(shape=(len(q)))
x = SLDt[:,0]
for j in range(len(q)):
k0 = np.complex256(q[j]/2.+np.sqrt(4*np.pi*GFP[6]+0j))
k = np.complex256(np.sqrt(k0**2-4*np.pi*SLDt[:,1]+0j))
rij = np.zeros(shape=(len(x),1),dtype=np.complex_)
Rij = np.zeros(shape=(len(x),1),dtype=np.complex_)
for i in range(len(x)):
if (i == len(x)-1):
rij[i] = (k0-k[i])/(k[i]+k0)
elif (i < len(x)-1):
rij[i] = (k[i+1]-k[i])/(k[i]+k[i+1])
Rij[0] = rij[0]
if (i>0):
pp = np.exp(-2j*k[i-1]*(x[i]-x[i-1])) #Phase shift of reflected wave
Rij[i] = ((rij[i] + Rij[i-1]*pp)/(1+rij[i]*Rij[i-1]*pp))
Ref=(Rij[len(x)-1])*np.conj(Rij[len(x)-1])
RR[j]=Ref.real
stop = timeit.default_timer()
print("Time taken to calculate RR", stop-start)
return RR+GFP[9]
我在这里缺少什么?提前感谢所有帮助和建议。