Problema do consumidor no deserto
Consumidor no deserto
Marcos Júnio Ribeiro
16/09/2022
Suponha que você esteja no Deserto do Saara e só tenha uma única garrafa de água com uma quantidade \(k_0\). Você vai ficar por um longo tempo lá e não pode beber a água toda em um único dia senão morrerá de sede. Logo, você consumirá um montante de água de modo a maximizar sua utilidade. Formalmente podemos escrever o problema como:
\[V(c_0, c_1, c_2, \cdots, c_T) = \sum_{t =0}^T \beta^t U(c_t), \]
onde \(c_t\) é a quantidade de água consumida, \(\beta\) é um fator de desconto intertemporal e a utilidade é logarítmica: \(U(c) = \ln(c)\). Destaca-se também que a quantidade de água na garrafa no próximo período é a quantidade que tem hoje menos a quantidade consumida hoje, ou seja:
\[k_{t+1} = k_{t} - c_{t},\]
Além disso, a quantidade de água consumida é não negativa em todo período, logo \(k_t \geq 0\) e ao final do período \(T\) não sobrará mais água, ou seja \(k_{T+1} = 0\). Dito isto, o problema pode ser escrito como:
\[\text{Max} \sum_{t=0}^T \beta^t U(c_t),\] sujeito a \[c_0 + c_1 + \cdots + c_T = k_0,\]
Encontre a Equação de Euler e o consumo ótimo de água.
1 Solução analítica
Do enunciado da questão temos que:
\[\begin{equation} \tag{1} V(c_0, c_1, c_2, \cdots, c_T) = \sum_{t =0}^T \beta^t U(c_t), \end{equation}\]
Onde \(c_t\) é a quantidade de água consumida, \(\beta\) é um fator de desconto intertemporal e a utilidade é logarítmica: \(U(c) = \ln(c)\). Destaca-se também que a quantidade de água na garrafa no próximo período é a quantidade que tem hoje menos a quantidade consumida hoje, ou seja:
\[\begin{equation}\label{eq:bgc} \tag{2} k_{t+1} = k_{t} - c_{t}, \end{equation}\]
A quantidade de água consumida é não negativa em todo período, logo \(k_t \geq 0\) e ao final do período \(T\) não sobrará mais água, ou seja \(k_{T+1} = 0\). Dito isto, o problema pode ser escrito como:
\[\begin{equation}\label{eq:max_util} \tag{3} \text{Max} \sum_{t=0}^T \beta^t U(c_t), \end{equation}\] sujeito a \[c_0 + c_1 + \cdots + c_T = k_0,\]
Considerando a Equação 2, podemos escrever o consumo de outros períodos \(t-1\), \(t\), \(t+1\) da seguinte maneira:
\[c_{t-1} = k_{t-1} - k_{t}\] \[c_{t} = k_{t} - k_{t+1}\] \[c_{t+1} = k_{t+1} - k_{t+2}\]
Substituindo essas expressões na Equação 3 temos:
\[\begin{equation}\label{eq:sum_util} \tag{4} U(k_0 - k_1) + \beta U (k_1 - k_2) \cdots \beta^{t-1}U(k_{t-1} - k_t) + \beta^t U(k_{t} - k_{t+1}) + \beta^{t+1} U(k_{t+1} - k_{t+2}) + \cdots \end{equation}\]
Vamos derivar a Equação 4 em relação a \(k_t\):
\[\begin{equation} \tag{5} - \beta^{t-1} U'(k_{t-1} - k_t) + \beta^{t} U' (k_t - k_{t+1}) = 0, \end{equation}\]
Podemos reorganizar essa expressão para encontrar a Equação de Euler:
\[\begin{equation}\label{eq:euler} \tag{6} U'(c_t) = \beta U'(c_{t+1}), \end{equation}\]
Sabemos que a utilidade é logarítmica, logo podemos reescrever a Equação 6 como:
\[\begin{equation*} \dfrac{1}{c_t} = \dfrac{\beta}{c_{t+1}}, \end{equation*}\] Que pode ser escrito como: \[\begin{equation}\label{eq:ct} \tag{7} c_t = \dfrac{c_{t+1}}{\beta} \end{equation}\]
Vamos resolver esse problema de trás pra frente. Sabemos que no período \(T\) você bebeu toda a água e não deixou nada para o período \(T+1\), ou seja, \(c_{T} = k_T\). Logo, podemos escrever a Equação 7 como:
\[\begin{equation}\label{eq:ct-1} \tag{8} c_{T-1} = \dfrac{c_{T}}{\beta} = \dfrac{k_{T}}{\beta}, \end{equation}\]
Agora vamos substituir a restrição orçamentária \((k_{T} = c_{T-1} - k_{T-1}\)) nessa última Equação:
\[c_{T-1} = \frac{1}{\beta} (k_{T-1} - c_{T-1}),\]
Ao resolvermos para \(c_{T-1}\) temos:
\[\begin{equation}\label{eq:ct-1p2} \tag{9} c_{T-1} = \left( \dfrac{1}{1+\beta} \right) k_{T-1}, \end{equation}\]
Análogo a Equação 8 podemos escrever \(c_{T-2}\) como:
\[c_{T-2} = \dfrac{c_{T-1}}{\beta},\]
Agora vamos substituir \(c_{T-1}\) nessa última Equação pela Equação 9:
\[c_{T-2} = \left( \dfrac{1}{\beta + \beta^2} \right) k_{T-1},\]
O próximo passo é substituir a restrição orçamentária \((k_{T-1} = c_{T-2} - k_{T-2}\)) nessa última Equação e resolver para \(c_{T-2}\):
\[\begin{equation} c_{T-2} = \left( \dfrac{1}{1+\beta + \beta^2} \right) k_{T-2}, \end{equation}\]
Se repetirmos esse processo \(T\) vezes chegaremos a seguinte solução:
\[c_{T-T} = \left( \dfrac{1}{1 + \beta + \beta^2 + \beta^3 + \cdots + \beta^T} \right) k_{T-T},\]
O denominador dessa expressão é a soma de uma PG finita.
\[\begin{align} \sum_{t=0}^T \beta^t = \frac{1 - \beta^{T+1}}{1 - \beta}, \end{align}\]
Logo, podemos reescrever \(c_{T-T}\) como:
\[\begin{equation} \tag{10} c_0 = \left( \frac{1 - \beta}{1 - \beta^{T+1}} \right) k_0. \end{equation}\]
2 Solução numérica
Vamos resolver essa questão em Python. O primeiro passo é importar as bibliotecas que vamos utilizar.
# Importar bibliotecas
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.pylab as pylab
from scipy.optimize import minimize
# Definir parâmetros gráficos
= {'legend.fontsize': 18,
params 'figure.figsize': (14, 8),
'axes.labelsize': 20,
'axes.titlesize':20,
'xtick.labelsize':20,
'ytick.labelsize':20}
pylab.rcParams.update(params)
A preferência intertemporal \(\beta\) pode ser escrita em função de um parâmetro \(\rho\), \(\beta = \frac{1}{1+\rho}\). Abaixo criei essa função.
# Preferência intertemporal
def beta_f(rho):
return np.divide(1, 1 + rho)
Abaixo criei uma figura para analisar a relação entre \(\rho\) e \(\beta\). Note que, quando \(\rho\) aumenta (diminui) ele valoriza mais (menos) o consumo presente em relação ao futuro. Se \(\rho\) aumenta, \(\beta\) diminui, bebe mais água no presente.
= np.linspace(0, 1, 25)
rho
= plt.subplots(1, figsize = (8, 6))
fig, ax 'r--o')
ax.plot(rho, beta_f(rho), = False)
ax.ticklabel_format(useOffset r"$\rho$")
ax.set_xlabel(r"$\beta$") ax.set_ylabel(
Agora vamos criar a função de utilidade logarítimica que definimos na questão.
# Utilidade
def u(c):
= np.log(c)
u return u
O próximo passo é criar a função de bem estar (Equação 3). Vamos supor que \(\rho = 0.5\), logo, \(\beta = 0.667\). É importante ressaltar que queremos maximizar essa função, no entanto, o solver do python só minimiza, então devemos negar o resultado final da função.
# Bem estar
def f_welf(c):
= len(c)
T = beta_f(0.5)
beta = np.zeros(T, float)
uv = beta**np.arange(T) * u(c)
uv
return (-np.sum(uv)) # note o sinal de menos
Agora vamos criar a restrição de igualdade do problema. Para isso
criei a função const
e uma lista com um dicionário no qual
eu indico que essa é uma restrição de igualdade. Caso haja dúvidas veja
a documentação
da biblioteca. Note também que na função estou definindo \(k_0 = 100\), ou seja, no período 0 a
quantidade de água na garrafa é 100. Obviamente, poderia ser outro
valor.
\[ c0 + c1 + c2 + ...+ cT = k0 \] \[ c0 + c1 + c2 + ...+ cT - k0 = 0 \]
def const(c):
= 100
k0 = np.sum(c) - k0
kt return kt
= [{'type':'eq', 'fun': const}] cons
Agora imagine que você vai ficar 10 dias no deserto, logo, \(T=10\). Além disso precisamos chutar um valor inicial para o consumo, que vai ser de \(0.1\) para cada um dos dez dias.
= 10
T
= np.ones(T, float)*0.1 chute
Vou utilizar a função optimize.fmin_slsqp
do Scipy para
achar a trajetória ótima do consumo ao longo desses dez dias. O primeiro
parâmetro dessa função é a função de bem estar que criei, o segundo é o
chute inicial o terceiro é o método de otimização que utilizamos e o
quarto é a restrição de igualdade. Logo, o solver vai me retornar um
vetor de tamanho dez.
= minimize(f_welf, chute, method='SLSQP', constraints = cons) sol
## <string>:2: RuntimeWarning: invalid value encountered in log
= sol.x c_star
Ao printar a saída do solver vemos que foi necessário 62 iterações do
algoritmo até encontrar a solução ótima (nit: 62
). Vemos
também que houve sucesso no processo de otimização
(success: True
).
print(sol)
## fun: -8.209032353879186
## jac: array([-0.02963305, -0.02910805, -0.02960443, -0.02985406, -0.02902222,
## -0.02974117, -0.02935791, -0.02953494, -0.02945697, -0.02948117])
## message: 'Optimization terminated successfully'
## nfev: 692
## nit: 62
## njev: 62
## status: 0
## success: True
## x: array([33.74362766, 22.90663148, 15.01634138, 9.9236492 , 6.80297574,
## 4.43005854, 2.98643873, 1.98398039, 1.32386943, 0.88242744])
Podemos printar diretamente o consumo ótimo que foi salvo em um
objeto chamado c_star
.
print(c_star)
## [33.74362766 22.90663148 15.01634138 9.9236492 6.80297574 4.43005854
## 2.98643873 1.98398039 1.32386943 0.88242744]
Por fim, vou plotar a trajetória do consumo ótimo encontrado pelo solver e a quantidade de água restante na garrafa durante os dez dias no deserto. Note que o consumo é decrescente ao longo do período.
= plt.subplots(1, 2, figsize = (14, 8))
fig, ax
0].plot(np.arange(0, T), c_star, 'r--o')
ax[0].ticklabel_format(useOffset = False)
ax[0].set_title("Consumo")
ax[0].set_xlabel("Período t")
ax[0].set_ylabel(r"$c_t$")
ax[##
1].plot(np.arange(0, T), 100 - np.cumsum(c_star), 'b--o')
ax[1].set_title("Quantidade de água")
ax[1].set_xlabel("Período t")
ax[1].set_ylabel(r"$k_t$") ax[
Teste aí na sua casa o que acontece com o consumo caso os valores de \(\rho\) e \(\beta\) sejam diferentes. Teste também se a solução numérica é igual a solução analítica que calculamos.