如何在Python中使用for循环和数组来计算错误传播

时间:2019-04-29 08:44:41

标签: python arrays loops

我正在尝试编写一个for循环,以使用派生方法计算误差线。该公式相对简单,但是在向量/数组大小方面,我似乎在代码中遇到错误。我的代码中有很多定义的向量,我已经检查了所有向量的长度。 for循环的所有输入都是1x25大小的数组。

我试图将for循环中的索引从range(1,25)更改为range(0,24),但这似乎不起作用。

# Creating vectors
dfdvg = np.zeros(25)
dfdxi0 = np.zeros(25)
sigsquare = np.zeros(25)
vgerr = vrs
xi0err = xi0s
Asq = np.zeros(25)
Bsq= np.zeros(25)
sig = np.zeros(25)

# calculating derivatives and error vectors
for i in range(0,24):
    dfdvg[i] = (np.multiply(rms[:,i],delta[:,i]))**-1
    dfdxi0[i] = -vr[:,i]/(vr[:,i]*(np.power(delta[:,i],2)))
    Asq[i] = np.power(np.multiply(dfdvg[i],vgerr[i]),2)
    Bsq[i] = np.power(np.multiply(dfdxi0[i],xi0err[i]),2)
    sigsquare[i] = Asq[i] + Bsq[i]
    sig[i] = np.power(sigsquare[i],0.5)

q = np.power(np.multiply(rms,delta),-1)
left = np.multiply(vg,q)
right = -(beta*H)/(3*(1+zeff))

我想要的是“ sig”向量,代表每个索引的传播误差。

1 个答案:

答案 0 :(得分:0)

问题不在于数组的尺寸,而在于形状。不幸的是,您没有编写所有数组。关键是,如果您可以只使用数组(25)而不是(1,25),则一切正常:

vrs = np.random.rand(25)
vr = np.random.rand(25)
xi0s = np.random.rand(25)
rms = np.random.rand(25)
delta = np.random.rand(25)
vg = np.random.rand(25)

# Creating vectors
dfdvg = np.zeros(25)
dfdxi0 = np.zeros(25)
sigsquare = np.zeros(25)
vgerr = vrs
xi0err = xi0s
Asq = np.zeros(25)
Bsq= np.zeros(25)
sig = np.zeros(25)

# calculating derivatives and error vectors
for i in range(0,24):
    dfdvg[i] = (np.multiply(rms[i],delta[i]))**-1
    dfdxi0[i] = -vr[i]/(vr[i]*(np.power(delta[i],2)))
    Asq[i] = np.power(np.multiply(dfdvg[i],vgerr[i]),2)
    Bsq[i] = np.power(np.multiply(dfdxi0[i],xi0err[i]),2)
    sigsquare[i] = Asq[i] + Bsq[i]
    sig[i] = np.power(sigsquare[i],0.5)

q = np.power(np.multiply(rms,delta),-1)
left = np.multiply(vg,q)

(您的最后一行代码似乎无关)

所以,我认为,最好的选择是重塑阵列:

vrs=vrs.reshape(25)