在 GEKKO 中定义控制变量和 objective 函数

Defining control variables and objective function in GEKKO

我试图在 GEKKO 中解决以下动力系统

(1) d ϕ d t = − M T D M ϕ

我按照给定的例子 here 在 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'

必须通过优化等式 1 中的参数 D(与下面的 Dhat 相同)来最小化误差。

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.FVDhat 是必须估计的控制变量向量。

Post这个,我想求助一下如何使用m.Minimize().

定义objective函数(f = sum((phi(:) - phi_tilde(:)).^2))

我有以下模拟设置

m.options.IMODE = 5  # simultaneous dynamic estimation
m.options.NODES = 5  # collocation nodes
m.solve()

编辑:可以找到我试图解决的问题的详细描述 here. Note: Equation 1 mentioned here is actually equation 2 here

关于使用 FVCV 的问题:

根据您的描述,听起来应该是 FV。作为解决问题的第一步,我建议您通过切换到 m.options.IMODE=7 来验证您是否正确设置了规格并解决。这将告诉您是否有相同数量的方程和变量以及 initializes the model 以便参数估计更快。

如果您使用 CV,则平方误差 objective 函数是用 m.options.EV_TYPE=2 为您定义的。如果将 CV 定义为 Var,也可以使用 m.Minimize()