У меня есть следующая динамическая система, которую я пытаюсь решить в GEKKO
(1) d ϕ dt = - MTDM ϕ
Я следовал приведенным примерам здесь для настройки следующих уравнений в GEKKO
M, MT = get_mmt()
A = MT @ np.diag(Dhat) @ M
A = A[1:ngrid - 1]
# first node
m.Equation(phi_hat[0].dt() == 0)
# interior nodes
int_value = -A @ phi_hat # function value at interior nodes
m.Equations(phi_hat[i].dt() == int_value[i] for i in range(0, ngrid-2))
# terminal node
m.Equation(phi_hat[ngrid-1].dt() == Dhat[end] * 2 * (phi_hat[end-1] - phi_hat[end]))
Переменными состояния являются phi_hat. Я хочу минимизировать квадратичную разницу между phi_meas и phi_hat в модели. Поэтому используются следующие настройки:
phi_hat = [m.Var(value=phi_0[i]) for i in range(ngrid)]
phi_hat = m.CV(value=phi_meas)
phi_hat.FSTATUS = 1 # fit to measurement phi obtained from 'def actual'
Ошибка должна быть минимизирована путем оптимизации параметра D (аналогично Dhat ниже) в уравнении 1.
Dhat0 = 500*np.ones(ngrid-1)
Dhat = m.FV(value=Dhat0[i] for i in range(0, ngrid-1))
Dhat.STATUS = 1 # adjustable parameter
Надеюсь, эти настройки правы. Пожалуйста, поправьте меня, если это не так. Я немного запутался здесь, не уверен, стоит ли мне использовать Dhat = m.CV(value=Dhat0[i] for i in range(0, ngrid-1))
вместо m.FV
. Dhat
- это вектор контрольных переменных, которые необходимо оценить.
Отправьте это, я хотел бы попросить помощи о том, как определить целевую функцию (f = sum((phi(:) - phi_tilde(:)).^2))
, используя m.Minimize ().
У меня есть следующие настройки для симуляции
m.options.IMODE = 5 # simultaneous dynamic estimation
m.options.NODES = 5 # collocation nodes
m.solve()
РЕДАКТИРОВАТЬ: Подробное описание проблемы, которую я пытаюсь решить, можно найти здесь . Примечание: упомянутое здесь уравнение 1 на самом деле является уравнением 2 здесь .