在 Python 的 GEKKO 中实施宏观经济模型

Implementing an macroeconomic model in Python's GEKKO

这个问题在一定程度上侧重于经济优化,在一定程度上侧重于 python 实施,但也许社区中的一些人能够提供帮助。我正在尝试在 Python 的 GEKKO 平台中实施标准的连续时间宏观经济储蓄模型,但未能解决。我已经采用了 GEKKO 的 documentation 中提供的经济示例,并适应了基本的储蓄决策模型,但事情并不是很顺利。该模型最大化来自消费的效用总和,其中消费+投资=产出。例如。最大积分(U(y-i))。输出 y = k^ALPHA。投资 = dk/dt+delta*k.

谁能告诉我为什么我的代码无法解决?该平台甚至能够解决这样的模型吗?我没有看到很多经济学家使用这个平台来解决模型的例子,但不确定这是因为这个平台不适合还是其他原因。这是一个很棒的平台,如果可能的话,它真的很想让它发挥作用。提前谢谢你。

from gekko import GEKKO
import numpy as np
import matplotlib.pyplot as plt
m = GEKKO()
n=501
m.time = np.linspace(0,10,n)
ALPHA,DELTA = 0.333,0.99
i = m.MV(value=0)
i.STATUS = 1
i.DCOST = 0
x = m.Var(value=20,lb=0) # fish population
m.Equation(x.dt() == i-DELTA*x)
J = m.Var(value=0) # objective (profit)
Jf = m.FV() # final objective
Jf.STATUS = 1
m.Connection(Jf,J,pos2='end')
m.Equation(J.dt() == m.log(x**ALPHA-i))
m.Obj(-Jf) # maximize profit
m.options.IMODE = 6  # optimal control
m.options.NODES = 3  # collocation nodes
m.options.SOLVER = 3 # solver (IPOPT)
m.solve(disp=True) # Solve

您在等式 dJ/dt = ln(x**ALPHA-i) 中得到 NaN。当您包含边界 i>0i<1 时,求解器会找到一个解。

from gekko import GEKKO
import numpy as np
import matplotlib.pyplot as plt
m = GEKKO()
n=501
m.time = np.linspace(0,10,n)
ALPHA,DELTA = 0.333,0.99
i = m.MV(value=0,lb=0,ub=1)
i.STATUS = 1
i.DCOST = 0
x = m.Var(value=20,lb=0) # fish population
m.Equation(x.dt() == i-DELTA*x)
J = m.Var(value=0) # objective (profit)
Jf = m.FV() # final objective
Jf.STATUS = 1
m.Connection(Jf,J,pos2='end')
m.Equation(J.dt() == m.log(x**ALPHA-i))
m.Obj(-Jf) # maximize profit
m.options.IMODE = 6  # optimal control
m.options.NODES = 3  # collocation nodes
m.options.SOLVER = 3 # solver (IPOPT)
m.solve(disp=True) # Solve

plt.subplot(2,1,1)
plt.plot(m.time,x.value)
plt.ylabel('x')
plt.subplot(2,1,2)
plt.plot(m.time,i.value)
plt.ylabel('i')
plt.show()

代替 m.Obj()(最小化),您可以使用较新的函数 m.Minimize()m.Maximize() 来阐明 objective 函数的意图。例如,您可以切换到 m.Maximize(Jf) 以使其更具可读性。

还有一些其他示例可以帮助您 integral objectives (see solution 2) and economic dynamic optimization