簡體   English   中英

Function 使用相同的輸入返回不同的結果

[英]Function Returning Different Results with Same Inputs

我正在建模 function 到 model 火車的運動。 在我的腳本中,我有一個運行 function 三次的檢查。 第二次和第三次返回相同的值,但第一次返回不同的值。

    dvdtA = lambda x, v: (1 / (Tmass + mw)) * (Ap * (rg / rw)) * (((P0gauge + Patm) * V0) / (V0 + (Ap * (rg / rw) * x)) - Patm) \
        -0.5 * Cd * pa * A * (v**2) - (Cr * Tmass * g)

    dvdtD = lambda v: (1 / Tmass) * (- 0.5 * Cd * pa * A * (v**2) - (Cr * Tmass * g))
    dxdt = lambda v: v
    Ft = lambda x: (1 / (Tmass + mw)) * (Ap * (rg / rw)) * (((P0gauge + Patm) * V0) / (V0 + (Ap * (rg / rw) * x)) - Patm)
    trainMotion = np.array([dvdtA, dvdtD, dxdt, Ft])

    # Checking design constraints ######################################
    if (Ht < 0.23) and (Wt < 0.2) and (rg/rw < 1):

        # Optimization #################################################
        if RK4(trainMotion, h, tspan, v0, x0, La, slipCheck) is not None:
            if RK4(trainMotion, h, tspan, v0, x0, La, slipCheck)[1] < tFinish:
                bestParams = np.array([r0, P0gauge, rg, Ls, rp, tankMat])
                bestODE = trainMotion
                bestLa = La
                bestSlipCheck = slipCheck
                bestTime = RK4(trainMotion, h, tspan, v0, x0, La, slipCheck)[1]

這寫在一個 for 循環中,該循環隨機選擇一組參數,然后運行它們以生成您在開始時看到的 ODES。 該錯誤發生在“優化”區域下方。 RK4 上的第一次調用生成的結果集與第二次和第三次不同,它們都生成完全相同的結果。 我不明白為什么第一次與第二次和第三次不同。 此外,當我稍后在腳本中再次將那些“最佳 [ODE/LA/etc] 插入 RK4 function 時,它未通過檢查並返回 None,盡管這些參數之前已通過檢查。

作為參考,這里是 RK4 function 本身:

import math as mt
import numpy as np

def RungeKutta(fun, h, tspan, x0, y0, Ls, slipCheck):
    yArr = np.zeros([len(tspan), 2])
    yArr[0,1] = y0
    yArr[0,0] = x0
    
    for i in range(len(tspan) - 1):
        
        k1 = fun[2](yArr[i, 1])
        k2 = fun[2](yArr[i, 1] + k1 * (h/2))
        k3 = fun[2](yArr[i, 1] + k2 * (h/2))
        k4 = fun[2](yArr[i, 1] + k3 * h)

        yArr[i+1, 0] = yArr[i, 0] + h * (k1/6 + k2/3 + k3/3 + k4/6)
        
        if (fun[3](yArr[i+1, 0]) > slipCheck) or (yArr[i+1, 0] > 12.5):
            return None

        if yArr[i, 0] <= Ls:
            k1 = fun[0](yArr[i, 0], yArr[i, 1])
            k2 = fun[0](yArr[i, 0] + h/2, yArr[i, 1] + k1 * (h/2))
            k3 = fun[0](yArr[i, 0] + h/2, yArr[i, 1] + k2 * (h/2))
            k4 = fun[0](yArr[i, 0] + h, yArr[i, 1] + k3 * h)

            yArr[i+1, 1] = yArr[i, 1] + h * (k1/6 + k2/3 + k3/3 + k4/6)

        elif yArr[i, 0] > Ls:
            k1 = fun[1](yArr[i, 1])
            k2 = fun[1](yArr[i, 1] + k1 * (h/2))
            k3 = fun[1](yArr[i, 1] + k2 * (h/2))
            k4 = fun[1](yArr[i, 1] + k3 * h)
                   
            yArr[i+1, 1] = yArr[i, 1] + h * (k1/6 + k2/3 + k3/3 + k4/6)

        if i >= 3:
            if yArr[i+1, 1] < 0 and yArr[i+1, 0] > 10:
                tFinish = tspan[i]
                data = np.column_stack((yArr, tspan))
                return data, tFinish       

    return None

讓RK4總是返回2個值,調用RK4時解包

    dvdtA = lambda x, v: (1 / (Tmass + mw)) * (Ap * (rg / rw)) * (((P0gauge + Patm) * V0) / (V0 + (Ap * (rg / rw) * x)) - Patm) \
        -0.5 * Cd * pa * A * (v**2) - (Cr * Tmass * g)

    dvdtD = lambda v: (1 / Tmass) * (- 0.5 * Cd * pa * A * (v**2) - (Cr * Tmass * g))
    dxdt = lambda v: v
    Ft = lambda x: (1 / (Tmass + mw)) * (Ap * (rg / rw)) * (((P0gauge + Patm) * V0) / (V0 + (Ap * (rg / rw) * x)) - Patm)
    trainMotion = np.array([dvdtA, dvdtD, dxdt, Ft])

    # Checking design constraints ######################################
    if (Ht < 0.23) and (Wt < 0.2) and (rg/rw < 1):

        # Optimization #################################################
        data, tFinishResult = RK4(trainMotion, h, tspan, v0, x0, La, slipCheck)
        if data is not None:
            if tFinishResult < tFinish:
                bestParams = np.array([r0, P0gauge, rg, Ls, rp, tankMat])
                bestODE = trainMotion
                bestLa = La
                bestSlipCheck = slipCheck
                bestTime = tFinishResult

RK4 function:

import math as mt
import numpy as np

def RungeKutta(fun, h, tspan, x0, y0, Ls, slipCheck):
    yArr = np.zeros([len(tspan), 2])
    yArr[0,1] = y0
    yArr[0,0] = x0
    
    for i in range(len(tspan) - 1):
        
        k1 = fun[2](yArr[i, 1])
        k2 = fun[2](yArr[i, 1] + k1 * (h/2))
        k3 = fun[2](yArr[i, 1] + k2 * (h/2))
        k4 = fun[2](yArr[i, 1] + k3 * h)

        yArr[i+1, 0] = yArr[i, 0] + h * (k1/6 + k2/3 + k3/3 + k4/6)
        
        if (fun[3](yArr[i+1, 0]) > slipCheck) or (yArr[i+1, 0] > 12.5):
            return None,None

        if yArr[i, 0] <= Ls:
            k1 = fun[0](yArr[i, 0], yArr[i, 1])
            k2 = fun[0](yArr[i, 0] + h/2, yArr[i, 1] + k1 * (h/2))
            k3 = fun[0](yArr[i, 0] + h/2, yArr[i, 1] + k2 * (h/2))
            k4 = fun[0](yArr[i, 0] + h, yArr[i, 1] + k3 * h)

            yArr[i+1, 1] = yArr[i, 1] + h * (k1/6 + k2/3 + k3/3 + k4/6)

        elif yArr[i, 0] > Ls:
            k1 = fun[1](yArr[i, 1])
            k2 = fun[1](yArr[i, 1] + k1 * (h/2))
            k3 = fun[1](yArr[i, 1] + k2 * (h/2))
            k4 = fun[1](yArr[i, 1] + k3 * h)
                   
            yArr[i+1, 1] = yArr[i, 1] + h * (k1/6 + k2/3 + k3/3 + k4/6)

        if i >= 3:
            if yArr[i+1, 1] < 0 and yArr[i+1, 0] > 10:
                data = np.column_stack((yArr, tspan))
                tFinish = tspan[i]
                return data, tFinish       

    return None, None

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM