为什么我的代码公式会影响我的结果,而数学公式是相同的?

2024-06-11 18:19:16 发布

您现在位置:Python中文网/ 问答频道 /正文

我写了一个代码,它最终工作,它产生了一个理想的结果。但是,如果a对我的代码做了一个小的更改,如果我不单独定义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]

怎么会这样?总的来说,这让我怀疑我的第一个代码。你知道吗


Tags: 代码rdtmyfunctionldtduddtdu4dtdp2dtdp3dt
1条回答
网友
1楼 · 发布于 2024-06-11 18:19:16

在第一个函数中,你直接输入u_1的值,此时的值是r[0]。 所以‘du1dt’的计算是基于这个值。然后将u_1的值改为(L_Lu_s+w_Lu_2)/w_L

而在second-in函数中,您使用value(L\u Lu\u s+w\u Lu\u 2)/w\u L作为值u\u 1来计算du1dt。这就是为什么你会得到不同的价值观。 对于u_和其他变量也一样

相关问题 更多 >