Prof. Dr. Julio Fernando Costa Santos
Novembro de 2023 (Atualizado: 2023-11-19)
Modelo de Goodwin (1967) - Publicado no livro: Socialism, Capitalism and Economic Growth: Essays Presented to Maurice Dobb (Feinstein, C. H.)
É um modelo inspirado no sistema biológico de EDOs, chamado Modelo Lotka-Volterra ou Modelo Presa-Predador.
A ideia geral do modelo de Goodwin é tentar explicar o ciclo econômico através da relação existente no processo de Produção entre Trabalhadores e Capitalistas.
Algumas premissas do Modelo para Conveniência de Modelagem:
Progresso Tecnológico Constante, \(a\). \[\frac{Y}{L}=a=a_0.e^{\alpha.t},\;\;\;\alpha>0\]
Crescimento da Força Laboral Constante, \(N\). \[N=N_0.e^{\beta.t},\;\;\;\beta>0 \]
Apenas dois fatores de Produção: Trabalho e Capital, ambos homogêneos e não específicos.
Todas as quantidades são medidas em termos reais e líquidas.
Todos Salários são consumidos e todos os lucros poupados e investidos (Kalecki).
obs.: Não há, necessariamente, coincidência entre o crescimento da força de laboral e do número de empregos. Logo, não há premissa de pleno emprego!
Premissas mais empíricas e discutíveis:
Observações:
Dada a definição de \(a=Y/L\), temos que a participação da renda dos trabalhadores no produto é dada por: \[u=\frac{w.L}{Y}=\frac{w}{a}\]
Consequentemente, o Profit Share em termos residuais é dada por: \[\pi=1-w/a\]
Repare que pela premissa (5), temos que \(I\equiv S\equiv\pi.Y\). Portanto, temos que: \[r_k=\frac{I}{K}=\frac{\dot{K}}{K}=\frac{\dot{Y}}{Y}\] A última parte da equação acima, obtemos sabendo que a relação \(Y/K\) é constante, logo \(\dot{Y}/Y=\dot{K}/K\).
Pela premissa (1), temos: \[\ln{(Y/L)}=\ln{(a_0.e^{\alpha.t})}\] \[\ln Y-\ln L=\ln a_0 + \alpha.t\] \[\frac{\dot{Y}}{Y}-\frac{\dot{L}}{L}=\alpha \] \[\frac{\dot{L}}{L}=\frac{\dot{Y}}{Y}-\alpha \]
Como já conhecemos \(\dot{Y}/Y\), temos que: \[\frac{\dot{L}}{L}=\frac{(1-w/a)}{k}-\alpha\]
Definindo a taxa de emprego como sendo \(v\), temos: \[v=\frac{L}{N}\] Em termos dinâmicos: \[\frac{\dot{v}}{v}=\frac{\dot{L}}{L}-\frac{\dot{N}}{N} \]
Fazendo uso da premissa (2): \(\dot{N}/N=\beta\), temos:
\[\frac{\dot{v}}{v}=\frac{(1-u)}{k}-(\alpha+\beta)\]
Reorganizando:
\[\dot{v}= \left[ \frac{1}{k}-(\alpha+\beta)-\frac{u}{k}\right].v\]
Agora faremos uso da premissa (7). [Curva de Phillips]
Assume-se uma relação positiva entre a taxa de crescimento dos salários em termos reais e a taxa de emprego.
Fazendo uma aproximação linear da figura acima, temos:
\[\frac{\dot{w}}{w}=-\gamma+\rho.v\]
Sabendo que \(u=w/a\), temos em termos dinâmicos:
\[\frac{\dot{u}}{u}=\frac{\dot{w}}{w}-\alpha \]
O que substituindo uma na outra, gera:
\[\frac{\dot{u}}{u}=-(\gamma+\alpha)+\rho.v \]
Juntando a equação de movimento de \(v\) com a de \(u\), temos então o sistema de EDOs Bi-Dimensional:
\[\dot{v}=\left[\frac{1}{k}-(\alpha+\beta)-\frac{u}{v}\right].v\;\;\;\;\;\;\;\;\;(1)\]
\[\dot{u}=\left[-(\alpha+\gamma)+\rho.v\right].u\;\;\;\;\;\;\;\;\;(2)\]
Repare que se definirmos os parâmetros como: \(a_1=\frac{1}{k}-(\alpha+\beta)\); \(b_1 = 1/k\); \(a_2 = \alpha + \gamma\); \(b2 = \rho\);
Podemos reescrever o sistema bi-dimensional como:
\[\dot{v}=(a_1-b_1.u).v\] \[\dot{u}=-(a_2-b_2.v).u\]
Que é exatamente o sistema de presa-predador de Lotka-Volterra.
\[\dot{v}=(a_1-b_1.u).v\] \[\dot{u}=-(a_2-b_2.v).u\]
Parte 1
\[a_2.\frac{\dot{v}}{v}=(a_1.a_2-b_1.a_2.u)\]
\[a_1.\frac{\dot{u}}{u}=-(a_1.a_2-a_1.b_2.v)\]
\[a_2.\frac{\dot{v}}{v} + a_1.\frac{\dot{u}}{u}=-b_1.a_2.u+a_1.b_2.v \]
\[a_2.\frac{d \ln{v}}{dt} + a_1.\frac{d \ln{u}}{dt}=-b_1.a_2.u+a_1.b_2.v \]
Parte 2
\[\dot{v}=(a_1-b_1.u).v\] \[\dot{u}=-(a_2-b_2.v).u\]
\[b_2.\dot{v}=(b_2.a_1-b_2.b_1.u).v\] \[b_1.\dot{u}=-(b_1.a_2-b_1.b_2.v).u\]
\[b_2.\dot{v}+b_1.\dot{u}=(b_2.a_1.v-b_2.b_1.u.v)-(b_1.a_2.u-b_1.b_2.v.u)\] \[b_2.\dot{v}+b_1.\dot{u}=b_2.a_1.v-b_1.a_2.u\]
\[a_2.\frac{d \ln{v}}{dt} + a_1.\frac{d \ln{u}}{dt}=-b_1.a_2.u+a_1.b_2.v \] \[b_2.\dot{v}+b_1.\dot{u}=b_2.a_1.v-b_1.a_2.u\]
\[b_2.\dot{v}+b_1.\dot{u}-a_2.\frac{d \ln{v}}{dt} - a_1.\frac{d \ln{u}}{dt}=0\]
\[\int b_2.\dot{v} dt+\int b_1.\dot{u}dt-\int a_2.\frac{d \ln{v}}{dt}dt - \int a_1.\frac{d \ln{u}}{dt}dt=\int0dt\]
\[b_2.v+b_1.u- a_2.\ln{v} - a_1.\ln{u}=A\]
\[b_2.v+b_1.u- a_2.\ln{v} - a_1.\ln{u}=A\]
\[e^{b_2.v+b_1.u- a_2.\ln{v} - a_1.\ln{u}}=e^A\] \[e^{b_2.v}.e^{b_1.u}.e^{- a_2.\ln{v}}.e^{ - a_1.\ln{u}}=e^A\]
\[e^{b_2.v}.e^{b_1.u}.v^{- a_2}.u^{ - a_1}=B\] \[v^{- a_2}.e^{b_2.v}=B.e^{-b_1.u}.u^{a_1}\]
\[X_1 = X_1(v)=v^{- a_2}.e^{b_2.v}\] \[X_2=X_2(u)=e^{-b_1.u}.u^{a_1}\]
\[\frac{dX_1}{dv}=-a_2.v^{-a_2-1}.e^{-b_1.u}+b_2.v^{-a_2}.e^{b_2.v}\] \[\frac{dX_1}{dv}=v^{-a_2}.e^{b_2.v}.\left(b_2-\frac{a_2}{v}\right)\] \[\frac{dX_1}{dv}=X_1.\left(b_2-\frac{a_2}{v}\right)\]
rm(list=ls())
v = seq(0.01, 12, 0.01)
a2 = 0.1
b2 = 0.05
min = a2/b2
X1 = v^(-a2)*exp(b2*v)
plot(v,X1,
type = "l",
col = "red",
lwd = 2,
main = "X1 x v - Modelo de Goodwin")(Continuando)
\[\frac{dX_2}{du}=a_1.u^{a_1-1}.e^{-b_1.u}-b_1.v^{a_1}.e^{b_1.u}\] \[\frac{dX_2}{du}=u^{a_1}.e^{-b_1.u}.\left(\frac{a_1}{u}-b_1\right)\] \[\frac{dX_2}{du}=X_2.\left(\frac{a_1}{u}-b_1\right)\]
u = seq(0.01, 12, 0.01)
a1 = 0.1
b1 = 0.05
X2 = u^a1 * exp(-b1*u)
plot(u,X2, type = "l", col = "red", lwd = 2, main = "X2 x u - Modelo de Goodwin")rm(list=ls())
alpha = 0.05 # Taxa de Crescimento da Produtividade do Trabalho
beta = 0.04 # Taxa de Crescimento Populacional
gamma = 0.05 # Taxa de Crescimento Autônomo dos Salários Reais
rho = 0.30 # Sensibilidade do Crescimento dos Salários ao Emprego
k = 4.00 # Relação K/Y
a2 = alpha + gamma
b2 = rho
a1 = 1/k - (alpha+beta)
b1 = 1/k
v = seq(0.01, 1.5, 0.01)
u = seq(0.01, 1.5, 0.01)
funcao <- function(v,u){v^(-a2)*exp(b2*v)-u^a1*exp(-b1*u)}
z <- outer(v,u,funcao)
contour(v,u,z, col = "red",
main = "Curvas de Nível - Modelo de Goodwin",
ylab = "u - Wage Share", xlab = "v - Employment Level")Uma outra forma de visualizar é transformar a função implícita \(F(v,u)\) em uma superfície tridimensional.
Entre duas curvas de nível qualquer, temos sempre outras infinitas curvas intermediárias.
Cada curva interna, mostra uma possibilidade de órbita fechada para um par ordenado \(v,u\).
Script no R para a superfície em três dimensões da Função Implícita:
Pacote PhaseR é um pacote para plotar o digrama de fase de sistemas uni ou bi-dimensionais de EDOs.
É um pacote que tem as funcionalidades de:
Antes de usar as funcionalidades do pacote, devemos criar uma função que escreve o sistema de EDOs utilizando como inputs os parâmetros, o valor da variável(is) estado(s) e o próprio tempo.
rm(list=ls())
#install.packages("phaseR")
library(phaseR)
goodwin <- function(t, y, parameters){
# Definição dos Parâmetros e das Variáveis Estado
alpha <- parameters[1]
beta <- parameters[2]
gamma <- parameters[3]
rho <- parameters[4]
sigma <- parameters[5]
v <- y[1]
u <- y[2]
# As EDOs
dv_dt <- (1/sigma-(alpha+beta)-u/sigma)*v
du_dt <- (-(alpha+gamma)+rho*v)*u
# A lista de quem é o output da função.
list(c(dv_dt,du_dt))
}Agora iremos utilizar as funções flowField() para
plotar o diagrama de fases.
A função nullclines() para plotar as isóclinas no
diagrama de fases.
A função trajectories() para calcular e plotar a
trajetória para uma dada (ou algumas) condição(es)
inicial(ais).
goodwin.flowField <- flowField(goodwin,
xlim = xlim,
ylim = ylim,
parameters = parameters,
points = 31,
system = "two.dim",
add = FALSE,
xlab = "v",
ylab = "u",
main = "Trajetórias e Diagrama de Fase")
grid()
goodwin.nullclines <- nullclines(goodwin,
xlim = xlim,
ylim = ylim,
parameters = parameters,
system = "two.dim",
add.legend = FALSE,
lwd =3)
goodwin.trajectory <- trajectory(goodwin,
y0 = y0,
tlim = c(0,100),
tstep = 0.01,
parameters = parameters,
system = "two.dim",
col = rep("red", 4),
lwd =1.5)rm(list=ls())
library(deSolve) # pacote para resolver as EDOs
library(latex2exp) # pacote para inserir caracteres em latex no gráfico
# parte de definição do sistema de EDOs de Goodwin
derivadas <- function(t, state, parameters) {
with(as.list(c(state, parameters)), {
v_dot = (1/sigma-(alpha+beta)-u/sigma)*v
u_dot = (-(alpha+gamma)+rho*v)*u
return(list(c(v_dot,u_dot)))
})
}parms <- list(alpha = 0.15,
beta = 0.15,
gamma = 0.05,
rho = 0.30,
sigma = 1)
attach(parms)
a1 = 1/sigma - (alpha+beta)
b1 = 1/sigma
a2 = (alpha + gamma)
b2 = rho
# Cálculo do centro de gravitação.
centro_1 = a1/b1
centro_2 = a2/b2
detach(parms)
# valor inicial das EDOS.
state <- c(v = 0.60, u = 0.63)Resolução do sistema através de integração numérica pelo método de Runge-Kutta de 4ª Ordem.
Plot das figuras em fase e contra o tempo. Além disso, o cálculo do sentido no plano de fase.
Out <- ode(y = state, times=seq(0, 50, 0.25), derivadas, parms,
method = "rk4")
plot(Out[,1],Out[,2], type = "l", xlab = "Tempo", main = "Wage Share and Employment Rate - Goodwin Model",
ylab = "Wage Share and Employment Rate", col = "darkcyan", lwd = 2)
lines(Out[,1],Out[,3], type = "l", col = "tomato", lwd = 2)plot(Out[,2],Out[,3], type = "l",
xlab = "Worker's share",
ylab = "Employment level",
main = "Worker's Share x Employment Level - Goodwin Model", lwd =2)
points(centro_2,centro_1, lwd = 2, col = "darkviolet")
abline(h = centro_1, lty = 2, col = "grey")
abline(v = centro_2, lty = 2, col = "grey")
s <- seq(length(Out[,1] )- 1)
arrows(Out[s,2], Out[s,3], Out[s+1,2], Out[s+1,3], col = "red")Choque 1 \(\uparrow (v,u)\) \((v+0.05,u+0.05)\):
parms <- list(alpha = 0.15,
beta = 0.15,
gamma = 0.05,
rho = 0.30,
sigma = 1)
attach(parms)
a1 = 1/sigma - (alpha+beta)
b1 = 1/sigma
a2 = (alpha + gamma)
b2 = rho
centro_11 = a1/b1
centro_21 = a2/b2
Period_1 <- 2*pi/(((alpha+gamma)*(1/sigma - (alpha+beta)))^0.5)
detach(parms)
state <- c(v = 0.60, u = 0.63)
Out <- ode(y = state, times=seq(0, 50, 0.25), derivadas, parms,
method = "rk4")
state2 <- c(Out[nrow(Out),2]+0.05,Out[nrow(Out),3]+0.05)
parms2 <- parms
attach(parms2)
a1 = 1/sigma - (alpha+beta)
b1 = 1/sigma
a2 = (alpha + gamma)
b2 = rho
centro_12 = a1/b1
centro_22 = a2/b2
detach(parms2)
Out2 <- ode(y = state2, times=seq(50, 100, 0.25), derivadas, parms2,
method = "rk4")
Out_Final <- rbind(Out,Out2)
plot(Out_Final[,1],Out_Final[,2], type = "l", xlab = "Tempo", main = "Wage Share and Employment Rate - Goodwin Model",
ylab = "Wage Share and Employment Rate", col = "darkcyan", lwd = 2)
lines(Out_Final[,1],Out_Final[,3], type = "l", col = "tomato", lwd = 2)plot(Out_Final[,2],Out_Final[,3], type = "l",
xlab = "Worker's share",
ylab = "Employment level",
main = "Worker's Share x Employment Level - Goodwin Model", lwd =2)
points(centro_21,centro_11, lwd = 2, col = "darkviolet")
points(centro_22,centro_12, lwd = 2, col = "darkviolet")
abline(h = centro_11, lty = 2, col = "grey")
abline(v = centro_21, lty = 2, col = "grey")
abline(h = centro_12, lty = 2, col = "grey")
abline(v = centro_22, lty = 2, col = "grey")
s <- seq(length(Out_Final[,1] )- 1)
arrows(Out_Final[s,2], Out_Final[s,3], Out_Final[s+1,2], Out_Final[s+1,3], col = "red")Choque 2 \(\downarrow \rho\) \(0.30\to 0.25\):
parms <- list(alpha = 0.15,
beta = 0.15,
gamma = 0.05,
rho = 0.30,
sigma = 1)
attach(parms)
a1 = 1/sigma - (alpha+beta)
b1 = 1/sigma
a2 = (alpha + gamma)
b2 = rho
centro_11 = a1/b1
centro_21 = a2/b2
Period_1 <- 2*pi/(((alpha+gamma)*(1/sigma - (alpha+beta)))^0.5)
detach(parms)
state <- c(v = 0.60, u = 0.63)
Out <- ode(y = state, times=seq(0, 50, 0.25), derivadas, parms,
method = "rk4")
parms2 <- parms
parms2$rho <- 0.25
attach(parms2)
a1 = 1/sigma - (alpha+beta)
b1 = 1/sigma
a2 = (alpha + gamma)
b2 = rho
centro_12 = a1/b1
centro_22 = a2/b2
detach(parms2)
Out2 <- ode(y = state2, times=seq(50, 100, 0.25), derivadas, parms2,
method = "rk4")
Out_Final <- rbind(Out,Out2)
plot(Out_Final[,1],Out_Final[,2], type = "l", xlab = "Tempo", main = "Wage Share and Employment Rate - Goodwin Model",
ylab = "Wage Share and Employment Rate", col = "darkcyan", lwd = 2)
lines(Out_Final[,1],Out_Final[,3], type = "l", col = "tomato", lwd = 2)plot(Out_Final[,2],Out_Final[,3], type = "l",
xlab = "Worker's share",
ylab = "Employment level",
main = "Worker's Share x Employment Level - Goodwin Model", lwd =2)
points(centro_21,centro_11, lwd = 2, col = "darkviolet")
points(centro_22,centro_12, lwd = 2, col = "darkviolet")
abline(h = centro_11, lty = 2, col = "grey")
abline(v = centro_21, lty = 2, col = "grey")
abline(h = centro_12, lty = 2, col = "grey")
abline(v = centro_22, lty = 2, col = "grey")
s <- seq(length(Out_Final[,1] )- 1)
arrows(Out_Final[s,2], Out_Final[s,3], Out_Final[s+1,2], Out_Final[s+1,3], col = "red")