Определение контрольных переменных и целевой функции в GEKKO - PullRequest
3 голосов
/ 04 апреля 2020

У меня есть следующая динамическая система, которую я пытаюсь решить в 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 здесь .

1 Ответ

2 голосов
/ 06 апреля 2020

На ваш вопрос об использовании FV или CV:

Из вашего описания это Похоже, это должно быть FV. В качестве первого шага в решении вашей проблемы, я рекомендую вам проверить, правильно ли установлены спецификации, переключившись на m.options.IMODE=7 и решить Это скажет вам, если у вас есть такое же количество уравнений и переменных, а также инициализирует модель , чтобы оценка параметров выполнялась быстрее.

Если вы используете CV, тогда квадратичная цель ошибки функция определена для вас с m.options.EV_TYPE=2. Вы также можете использовать m.Minimize(), если вместо этого определите CV как Var.

...