我写了一段代码,它终于工作了,并产生了所需的结果。然而,如果对我的代码做了一个小的更改,如果我不单独定义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和其他变量如下