为什么我的代码的公式会影响我的结果,而数学上是一样的



我写了一段代码,它终于工作了,并产生了所需的结果。然而,如果对我的代码做了一个小的更改,如果我不单独定义u_1, u_2, u_3, u_4, u_d值,而是将它们直接放入du1dt, du2dt, du3dt, du4dt, duuddt方程中,我的结果就会发生巨大的变化。就数学而言,这应该没有什么区别,为什么在python代码中会有区别?

def myFunction(r,t):
g = 9.81
L_L = 20
L_r = 20
L_d = 60
u_s = 0.08
w_d = 4

u_1 = r[0]
u_2 = r[1]
u_3 = r[2]
u_4 = r[3]
u_d = r[4]
p_1 = r[5]
p_2 = r[6]
p_3 = r[7]
p_4 = r[8]
deltap_L = r[9]
deltap_R = r[10]
w_r = r[11]
w_L = r[12]

du1dt =  - g*((p_2-p_1)/L_L + deltap_L/L_L) - (u_1)
du2dt =  - g*((p_2-p_1)/L_L - deltap_L/L_L) - (u_2)
du3dt =  - g*((p_4-p_3)/L_r - deltap_R/L_r) - (u_3)
du4dt =  - g*((p_4-p_3)/L_r + deltap_R/L_r) - (u_4)
duddt =  (- g*((p_3-p_2)/L_d)) - (u_d)
u_1 = (L_L*u_s + w_L*u_2)/w_L
u_2 = (w_d*u_d)/w_L
u_3 = (w_L*u_2)/w_r
u_4 = (L_r*u_s + w_r*u_3)/w_r
u_d = (w_r*u_3)/w_d
dp1dt =  - u_1
dp2dt = - u_1
dp3dt = + u_4
dp4dt =  + u_4
ddeltap_Ldt = - u_1
ddeltap_Rdt = u_4 
dwrdt = -u_s
dwldt = u_s

return (du1dt, du2dt, du3dt, du4dt, duddt, dp1dt, dp2dt, dp3dt, dp4dt, ddeltap_Ldt, ddeltap_Rdt, dwrdt, dwldt)
r0 = ([0,0,0,0,0,0,0,0,0,0,0,20,20])
t = np.linspace(0,250,1000)
r = odeint(myFunction, r0, t)

u1 = r[:,0]
u2 = r[:,1]
u3 = r[:,2]
u4 = r[:,3]
ud = r[:,4]
p1 = r[:,5]
p2 = r[:,6]
p3 = r[:,7]
p4 = r[:,8]
deltapL = r[:,9]
deltapR = r[:,10]
wR = r[:,11]
wl = r[:,12]

如果有小的变化,它将是:

def myFunction(r,t):
g = 9.81
L_L = 20
L_r = 20
L_d = 60
u_s = 0.08
w_d = 4

u_1 = r[0]
u_2 = r[1]
u_3 = r[2]
u_4 = r[3]
u_d = r[4]
p_1 = r[5]
p_2 = r[6]
p_3 = r[7]
p_4 = r[8]
deltap_L = r[9]
deltap_R = r[10]
w_r = r[11]
w_L = r[12]

du1dt =  - g*((p_2-p_1)/L_L + deltap_L/L_L) - ((L_L*u_s + w_L*u_2)/w_L)
du2dt =  - g*((p_2-p_1)/L_L - deltap_L/L_L) - ((w_d*u_d)/w_L)
du3dt =  - g*((p_4-p_3)/L_r - deltap_R/L_r) - ((w_L*u_2)/w_r)
du4dt =  - g*((p_4-p_3)/L_r + deltap_R/L_r) - ((L_r*u_s + w_r*u_3)/w_r)
duddt =  (- g*((p_3-p_2)/L_d)) - ((w_r*u_3)/w_d)
dp1dt =  - u_1
dp2dt = - u_1
dp3dt = + u_4
dp4dt =  + u_4
ddeltap_Ldt = - u_1
ddeltap_Rdt = u_4 
dwrdt = -u_s
dwldt = u_s

return (du1dt, du2dt, du3dt, du4dt, duddt, dp1dt, dp2dt, dp3dt, dp4dt, ddeltap_Ldt, ddeltap_Rdt, dwrdt, dwldt)
r0 = ([0,0,0,0,0,0,0,0,0,0,0,20,20])
t = np.linspace(0,250,1000)
r = odeint(myFunction, r0, t)

u1 = r[:,0]
u2 = r[:,1]
u3 = r[:,2]
u4 = r[:,3]
ud = r[:,4]
p1 = r[:,5]
p2 = r[:,6]
p3 = r[:,7]
p4 = r[:,8]
deltapL = r[:,9]
deltapR = r[:,10]
wR = r[:,11]
wl = r[:,12]

为什么?总的来说,这让我怀疑我的第一个代码。

在第一个函数中,您直接放入u1的值,此时该值为r[0]。因此,"du1dt"的计算是基于该值的。然后,在将u1的值更改为(L_Lu_s+w_Lu2(/w_L之后。

而在第二个函数中,您使用值(L_Lu_s+w_Lu2(/w_L作为值u1来计算du1dt。这就是为什么你会得到不同的价值观。u2和其他变量如下

相关内容

最新更新