首页 > 解决方案 > 在 Python 的 GEKKO 中实现宏观经济模型

问题描述

这个问题有点集中在经济优化上,有点集中在 python 实现上,但也许社区中的一些人能够提供帮助。我正在尝试在 Python 的 GEKKO 平台中实现标准的连续时间宏观经济储蓄模型,但无法解决。我采用了 GEKKO文档中提供的经济示例,并适应了基本的储蓄决策模型,但事情并不完全奏效。该模型最大化来自消费的效用总和,其中消费 + 投资 = 产出。例如最大积分(U(yi))。输出 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

标签: pythonoptimizationmodelingeconomicsgekko

解决方案


你正在NaN等式中dJ/dt = ln(x**ALPHA-i)。当您包含 boundsi>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()澄清目标函数的意图,而不是(最小化)。例如,您可以切换到m.Maximize(Jf)以使其更具可读性。

还有一些其他示例可以帮助您实现整体目标(参见解决方案 2)经济动态优化


推荐阅读