Внедрение макроэкономической модели c в GEKKO Python - PullRequest
3 голосов
/ 23 марта 2020

Этот вопрос сосредоточен в некоторой степени на экономической c оптимизации и в некоторой степени на python реализации, но, возможно, некоторые члены сообщества смогут помочь. Я пытаюсь внедрить стандартную модель непрерывной макроэкономической экономии c на платформе GEKKO Python, но не смог ее решить. Я взял экономичный c пример, представленный в документации GEKKO и адаптированный к базовой модели принятия решения об экономии c, но все не совсем получается. Модель максимизирует сумму полезности от потребления, где потребление + инвестиции = выпуск. Например, максимальный интеграл (U (yi)). Выход у = к ^ АЛЬФА. инвестиции = 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

1 Ответ

2 голосов
/ 24 марта 2020

Вы получаете NaN в уравнении dJ/dt = ln(x**ALPHA-i). Когда вы включаете границы i>0 и i<1, решатель находит решение.

Solution

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) и economi c динамика c оптимизация .

...