Marcos Júnio Ribeiro

Problema do consumidor no deserto

September 17, 2022 | 58 Minute Read

Consumidor no deserto

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 

params = {'legend.fontsize': 18,
          '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.

rho = np.linspace(0, 1, 25)

fig, ax = plt.subplots(1, figsize = (8, 6))
ax.plot(rho, beta_f(rho), 'r--o')
ax.ticklabel_format(useOffset = False)
ax.set_xlabel(r"$\rho$")
ax.set_ylabel(r"$\beta$")

Agora vamos criar a função de utilidade logarítimica que definimos na questão.

# Utilidade

def u(c):
    u = np.log(c)
    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):
  
    T = len(c)
    beta = beta_f(0.5)
    uv = np.zeros(T, float)
    uv = beta**np.arange(T) * u(c)

    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):
    k0 = 100
    kt = np.sum(c) - k0
    return kt

cons = [{'type':'eq', 'fun': const}]

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.

T = 10    

chute = np.ones(T, float)*0.1

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.


sol = minimize(f_welf, chute, method='SLSQP', constraints = cons)
## <string>:2: RuntimeWarning: invalid value encountered in log
c_star = sol.x    

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.


fig, ax = plt.subplots(1, 2, figsize = (14, 8))

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$")

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.