[英]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.