Я создаю Python приложение для использования в sientifi c. Приложение представляет собой модель Predicive Controler (MP C), и я использую функцию scipy.optimize.minimize в качестве алгоритма оптимизации.
solution_guess = minimize(objectiveFunction,
U_guess,
arg_guess,
callback= None,
method = "SLSQP")
, где целевая функция является самодельной функцией, в которой выполняется симуляция моей системы. это выглядит примерно так:
def objectiveFunction(x,*arg):
U_test = x
dt_test = arg[0]
setpoint_test = arg[1]
pred_horizion_length_test = arg[2]
initStateValue_test = arg[3]
# Defining Model Arrays
NS_pred_horizion_test = int(pred_horizion_length_test/dt_test)+1
pred_horizion_array_test = np.linspace(0, pred_horizion_length_test, NS_pred_horizion_test)
SP_array_test = np.zeros(NS_pred_horizion_test) + setpoint_test
Y_array_test = SP_array_test * 0
# Defining parameters for the testing model
timeDelay_test = 50
initDelayValue_test = 0
K_test = 4
Tc1_test = 30
Tc2_test = 60
# Defining Model Object
obj_model_test = model.secDegModel(dt = dt_test,
K = K_test,
Tc1 = Tc1_test,
Tc2 = Tc2_test,
timeDelay = timeDelay_test,
initStateValue = initStateValue_test,
initDelayValue = initDelayValue_test
)
###########################################
#|||||||||||||||||||||||||||||||||||||||||#
# Testing Values for U on Model #
#|||||||||||||||||||||||||||||||||||||||||#
###########################################
# Running simulation of "real" model function
for k in range(NS_pred_horizion_test):
Y_array_test[k] = obj_model_test.run(u_k = U_test)
error = np.sum(abs(SP_array_test-Y_array_test))
return error
С чем я борюсь, так это с тем, как вернуть массив Y_array_test, чтобы я мог отображать его каждый раз, когда выполняется оптимизация. Я пытался использовать глобальные переменные, но я не получил его работать, и я не думаю, что это хороший способ кодирования для использования глобальных переменных. Кто-нибудь знает хороший способ решить мою проблему? может быть, используя функцию обратного вызова? (если обратный вызов - это путь к go, я не до конца понимаю, как работает этот метод или как его правильно реализовать)