TD Introduction à la macroéconomie
2025-03-25
| Composante | Problème | Contraintes | Conditions du premier ordre |
|---|---|---|---|
| Ménage | \(\max\limits_{c_{t},l_{t},a_{t+1}} \sum_{t=0}^{\infty}\beta^{t}[u(c_{t})+v(l_{t})]\) | \(a_{t+1}=(1+r_{t})a_{t}+w_{t}(1-l_{t})+\Pi_{t}^{F}+\Pi_{t}^{I}-c_{t}\) \(a_{0}=K_{0}(1+r_{0}^{K}-\delta)\) donnée Condition de non-jeu de Ponzi |
\(\frac{v'(l_t)}{u'(c_t)}=w_t\) \(u'(c_t)=\beta(1+r_{t+1})u'(c_{t+1})\) |
| Entreprise | \(\max\limits_{K,L} F(K,L)-w_{t}L-r_{t}^{K}K\) | - | \(F_K(K_t,L_t)=r_t^K\) \(F_L(K_t,L_t)=w_t\) |
| Entreprise d’investissement | \(\max\limits_{I} \frac{r_{t+1}^{K}+1-\delta}{1+r}[(1-\delta)K_{t}+I] - [(1-\delta)K_{t}+I]\) | - | \(r_{t+1}=r_{t+1}^K-\delta\) |
Bouclage macro :


Supposons qu’une économie soit bien décrite par l’état stationnaire du modèle de croissance de Solow avec un progrès technologique constant et une croissance démographique nulle. Imaginez que nous prenions des données sur cette économie et effectuions un exercice de comptabilité de croissance.
Quelle part de croissance attribuerons-nous à l’accumulation de capital et quelle part à la technologie?
Quel est le rapport avec le résultat selon lequel sans progrès technologique, il n’y aurait pas de croissance à l’état stationnaire?
Solution. On reprend la décomposition de la croissance du PIB :
\[\begin{aligned} g & =\frac{F\left(K_{t+1},L_{t+1},A_{t+1}\right)}{F\left(K_{t},L_{t},A_{t}\right)}-1 \\ & \approx\frac{F\left(K_{t},L_{t},A_{t}\right)+F_{K}\left(K_{t},L_{t},A_{t}\right)\left(K_{t+1}-K_{t}\right)+F_{L}\left(K_{t},L_{t},A_{t}\right)\left(L_{t+1}-L_{t}\right)+F_{A}\left(K_{t},L_{t},A_{t}\right)\left(A_{t+1}-A_{t}\right)}{F\left(K_{t},L_{t},A_{t}\right)}-1 \\ & = \underbrace{\frac{F_{K}\left(K_{t},L_{t},A_{t}\right)K_{t}}{F\left(K_{t},L_{t},A_{t}\right)}}_{\text{Capital Share}}\underbrace{\frac{\left(K_{t+1}-K_{t}\right)}{K_{t}}}_{\text{Growth Rate of Capital}}+\underbrace{\frac{F_{L}\left(K_{t},L_{t},A_{t}\right)L_{t}}{F\left(K_{t},L_{t},A_{t}\right)}}_{\text{Labor Share}}\underbrace{\frac{\left(L_{t+1}-L_{t}\right)}{L_{t}}}_{\text{Growth Rate of Labor}}+\underbrace{{\frac{F_{A}\left(K_{t},L_{t},A_{t}\right)A_{t}}{F\left(K_{t},L_{t},A_{t}\right)}\frac{\left(A_{t+1}-A_{t}\right)}{A_{t}}}}_{\text{"Solow Residual"}} \end{aligned}\]
A l’état d’équilibre :
La croissance du capital est égale à la croissance technologique \(g\)
La croissance du travail est nulle
\(g = \alpha \times g + (1-\alpha)\times 0 + \text{Solow residual} \Rightarrow \text{Solow residual}=(1-\alpha)\times g\)
La croissance du PIB est donc imputable :
Remarque : La croissance du capital est également indirectement due au progrès technologique dans le sens où il permet de contrecarrer les rendements décroissants du capital.
Supposons que la véritable fonction de production à Gotham soit \(Y = AK^\alpha L^{1-\alpha}\)
Malheureusement, la criminalité est un énorme problème à Gotham, de sorte que pour chaque ouvrier, les entreprises doivent embaucher \(\gamma\) gardes de sécurité juste pour protéger leurs produits contre le vol. Les agents de sécurité qualifieront bien entendu leur activité de travail même s’ils ne produisent rien en réalité.
Utilisez la notation \(N\) pour désigner la main-d’œuvre totale (les ouvriers et les gardiens) et désignez le nombre d’ouvriers de production réels par \(L\).
Solution. Si il faut \(\gamma\) gardes par employé alors la force productive est \(L=\dfrac{N}{1+\gamma}\)
On en déduit \(Y=AK^\alpha\left(\dfrac{N}{1+\gamma}\right)^{1-\alpha}\)
Solution. L’entreprise maximise toujours ses profits
On résout \[\max_{K,N}Y-\text{Masse salariale} - \text{Cout du capital}\Leftrightarrow \max_{K,N}AK^\alpha\left(\dfrac{N}{1+\gamma}\right)^{1-\alpha}-wN-r^KK\]
Solution. On vérifie les hypothèses du modèle de Solow on a donc - \(w=\dfrac{\partial F}{\partial L}(K,L)=(1-\alpha)AK^\alpha\dfrac{N^{-\alpha}}{(1+\gamma)^{1-\alpha}}\) - \(r^K=\dfrac{\partial F}{\partial K}(K,L)=\alpha AK^{\alpha-1}\left(\dfrac{N}{1+\gamma}\right)^{1-\alpha}\)
Solution. On cherche à estimer \(A\) - L’économiste disposant de données précises sur \(K,N,Y\) estimera \(Y=A^{est}K^\alpha N^{1-\alpha}\) - En réalité la production ne dépend que de la main d’oeuvre “utile” : \(Y=AK^\alpha\left(\dfrac{N}{1+\gamma}\right)^{1-\alpha}\)
L’erreur est donc \(\dfrac{A^{est}}{A}=\dfrac{AK^\alpha\left(\dfrac{N}{1+\gamma}\right)^{1-\alpha}}{K^\alpha N^{1-\alpha}}=\left(\dfrac{1}{1+\gamma}\right)^{1-\alpha}<1\)
L’estimation de l’économiste est plus faible qu’en réalité
Solution. Du fait de la criminalité à Gotham, il faut employer des gardes et la productivité est sous-optimale par rapport à ce qui est permis par la productivité technologique.
Solution. On observerait le même effet.
Note: Tout ça est très réducteur, le travail d’un assistant n’est jamais non productif.
Supposons que nous observions que Usuria (une économie fermée) croît d’environ 6% par an, et que nous essayions de comprendre pourquoi. Nous savons que la population active est restée constante.
— Conjecture 1 : L’économie est dans un état stationnaire avec progrès technologique. Il y a eu accumulation de capital simplement pour maintenir \(\frac{K}{AL}\) constant, mais la cause de la croissance a été la croissance de la PTF.
— Conjecture 2 : L’économie est partie d’un niveau de stock de capital très faible (en dessous de l’état stationnaire) et a connu une croissance parce qu’elle converge vers l’état stationnaire, mais la PTF est restée constante.
Idéalement, si nous voulions faire la distinction entre la conjecture 1 et la conjecture 2, nous pourrions faire un exercice de comptabilité de la croissance. Malheureusement, Usuria ne produit pas de statistiques fiables sur l’accumulation du capital qui nous permettraient de le faire. Nous disposons cependant de données sur les taux d’intérêt en Usuria. Comment utiliserait-on ces données pour distinguer la conjecture 1 de la conjecture 2 ? Soyez aussi mathématiquement précis que possible.
Solution.
Conjecture 1: \(k=cste=\dfrac{K}{AL}\Rightarrow \dfrac{\partial F}{\partial K}(k,1)=cste \Rightarrow r=r^K-\delta=cste\)
La croissance économique provient exclusivement de la croissance exogène de \(A\)
Conjecture 2: \(k\) est croissant donc \(K\) croît plus vite que \(AL\)
L’hypothèse de rendements marginaux décroissants (\(\dfrac{\partial F}{\partial K}\) décroissante de \(K\)) nous dit que \(r^K\) et donc \(r\) sont donc décroissants.
La productivité marginale du capital diminue à mesure que l’accumulation de capital se rapproche de son niveau stationnaire.
\[\begin{aligned} g & =\frac{F\left(K_{t+1},A_{t+1}L_{t+1}\right)}{F\left(K_{t},A_{t}L_{t}\right)}-1 \\ & \approx\frac{F\left(K_{t},A_{t}L_{t}\right)+\frac{\partial F}{\partial K}\left(K_{t},A_{t}L_{t}\right)\left(K_{t+1}-K_{t}\right)+\frac{\partial F}{\partial AL}\left(K_{t},A_{t}L_{t}\right)\left(A_{t+1}L_{t+1}-A_{t}L_{t}\right)}{F\left(K_{t},A_{t}L_{t}\right)}-1 \\ & =\frac{1}{Y}\left(\frac{\partial{F}}{\partial{K}}\left(K_{t},A_{t}L_{t}\right)\left(K_{t+1}-K_{t}\right)+\frac{\partial{F}}{\partial{A}}\left(K_{t},A_{t}L_{t}\right)\left(A_{t+1}-A_{t}\right)\right) \end{aligned}\]
Considérons une économie correctement décrite par le modèle de croissance de Solow. La fonction de production est : \(Y = K^\alpha L^{1-\alpha}\)
La population est constante et égale à 1 et il n’y a pas de progrès technologique. Le taux d’épargne est \(s\) et le taux d’amortissement est \(\delta\).
Solution. On a \(\dfrac{k_{t+1}}{k_t}=\dfrac{(1-\delta)K_t+sY_t}{K_t}\dfrac{L_t}{L_{t+1}}=\dfrac{1-\delta +s\frac{Y_t}{K_t}}{1+n}\)
Si \(k_{t+1}=k_t\) on a donc \(1-\delta + sk^{\alpha-1}=1+n\) d’où \(k^*=\left(\dfrac{s}{\delta+n}\right)^{\frac{1}{1-\alpha}}\)
Solution. \(r=r^K-\delta=\dfrac{\partial F}{\partial K}(K,L)-\delta=\dfrac{\partial F}{\partial K}(k,1)-\delta=\alpha k^{*^{\alpha-1}}-\delta = \alpha\dfrac{\delta + n}{s}-\delta\)
Pour le reste des questions, supposez \(s = 0,4\), \(\alpha = 0,35\) et \(\delta = 0,1\) et que l’économie se trouve initialement à l’état stationnaire.
Pour le reste des questions, supposez \(s = 0,4\), \(\alpha = 0,35\) et \(\delta = 0,1\) et que l’économie se trouve initialement à l’état stationnaire.
Solution. Pour \(n=0\)
\(y^*\) augmente avec \(s\)
\(c^*=(1-s)y^*=(1-s)\left(\dfrac{s}{\delta}\right)^{\frac{\alpha}{1-\alpha}}\) elle diminue avec \(s\)
Les Friedman peuvent emprunter ou prêter au taux d’intérêt du marché. Comme ce sont les seuls à agir de cette façon et qu’ils sont petits par rapport à l’économie, nous allons supposer que l’économie globale (quantités globales, prix, etc.) reste inchangée. La consommation des Friedman sera-t-elle élevée au début puis faible à la fin, ou sera-t-elle faible au début puis élevée à la fin, ou restera-t-elle constante ?
Les Friedman peuvent emprunter ou prêter au taux d’intérêt du marché. Comme ce sont les seuls à agir de cette façon et qu’ils sont petits par rapport à l’économie, nous allons supposer que l’économie globale (quantités globales, prix, etc.) reste inchangée. La consommation des Friedman sera-t-elle élevée au début puis faible à la fin, ou sera-t-elle faible au début puis élevée à la fin, ou restera-t-elle constante ?
Solution. Le taux d’intérêt du marché est \(r=-0.125\)
On cherche à résoudre le problème \(\max_{c_1,c_2}u(c_1)+\beta u(c_2)\) avec la contrainte \(c_2=y_2+(1+r)(y_1-c_1)\)
La résolution donne \(u'(c_1)=\beta(1+r)u'(c_2)\)
Si \(r<0\) alors \(u'(c_1)<u'(c_2)\)
Comme l’utilité marginale \(u'\) est décroissante on a \(c_1>c_2\)
Supposons que les préférences en matière de consommation et de loisirs soient : \(u(c, l) = \log(c) + \alpha \log(l)\)
et que les ménages résolvent : \(\max_{c,l} u(c, l) = \log(c) + \alpha \log(l)\) \(s.t. \quad c=w(1-l)(1-\tau)+T\)
Solution. On résout le problème \(\max_{c,l}\log(c)+\alpha\log(l)\) sous contrainte \(c=w(1-l)(1-\tau)+T\)
\(\mathcal{L}(c,l,\lambda)= \log(c)+\alpha\log(l)-\lambda(c-w(1-l)(1-\tau)-T)\)
Les conditions du premières ordres donnent \(\dfrac{\partial \mathcal{L}}{\partial c}=\dfrac{1}{c}-\lambda=0\) et \(\dfrac{\partial \mathcal{L}}{\partial l}=\dfrac{\alpha}{l}-\lambda w(1-\tau)=0\) d’où \(\dfrac{\alpha}{l}=\dfrac{w}{c}(1-\tau)\)
Solution. La contrainte \(c=w(1-l)(1-\tau)+T\) implique \(\dfrac{lw}{\alpha}(1-\tau)=w(1-l)(1-\tau)+T\) d’où \(l\left(\dfrac{1}{\alpha}+1\right)=1+\dfrac{T}{w(1-\tau)}\)
On déduit \(l=\dfrac{1+\frac{T}{w(1-\tau)}}{\frac{1}{\alpha}+1}\) et \(c = \dfrac{w(1-\tau)+T}{1+\alpha}\)
Solution. \(T=0\Rightarrow l=\dfrac{1}{\frac{1}{\alpha}+1}\)
\(l\) ne dépend plus du taux d’imposition
Supposez maintenant qu’en Europe et aux États-Unis nous ayons : \(\alpha=1,54; w=1\)
mais qu’aux Etats Unis, \(\tau=0,34; T=0.102\)
et qu’en Europe, \(\tau=0,53; T=0.124\)
Supposez maintenant qu’en Europe et aux États-Unis nous ayons : \(\alpha=1,54; w=1\)
mais qu’aux Etats Unis, \(\tau=0,34; T=0.102\)
et qu’en Europe, \(\tau=0,53; T=0.124\)
Solution. L’application numérique donne - US: \(l=0.7\) - EU: \(l=0.77\)
La combinaison plus de taxes et plus de redistribution permet aux européens de travailler moins
Solution. Dans les deux cas on vérifie \(\tau(1-l)=T\) - US: \(\tau(1-l)=T=0.102\) - EU: \(\tau(1-l)=T=0.124\)
Le budget est bien à l’équilibre
Solution. Le PIB par habitant vaut \(\dfrac{Y}{1}=1-l\)
Il est donc plus bas de \(1-\dfrac{L_{EU}}{L_{US}}=1-\dfrac{0.23}{0.3}=22\%\) en Europe
Solution. On cherche le bien-être relatif en Europe (ajustement de consommation pour arriver à utilité constante)
\(u(c_{EU},l_{EU})=u(\lambda c_{US},l_{US})\Leftrightarrow \log(c_{EU})+\alpha\log(l_{EU})=\log(\lambda c_{US})+\alpha\log(l_{US})\)
On a donc \(\lambda = \dfrac{c_{EU}l_{EU}^\alpha}{c_{US}l_{US}^\alpha}=\dfrac{(1-l_{EU})l_{EU}^\alpha}{(1-l_{US})l_{US}^\alpha} =0.9\)
Solution. Le PIB par habitant est inférieur de \(22\%\) en Europe. Néanmoins le bien être n’est pas pour autant inférieur car la différence de travail est compensée par plus de loisirs en Europe. Il est en fait équivalent pour une consommation inférieure de \(10\%\)
Dans tout calcul de ce type, un paramètre important est l’élasticité de l’offre de travail. Une définition de l’élasticité souvent étudiée par les économistes du travail est connue sous le nom d’élasticité de Frisch. Elle est basée sur la réponse à la question suivante : supposons que nous augmentions les salaires mais que nous ajustions le revenu du ménage de manière à ce que la consommation reste constante : comment l’offre de travail évoluerait-elle ?
Solution. On dérive des conditions du premier ordre \(L=1-l=1-\dfrac{\alpha c}{w(1-\tau)}\)
Solution. L’élasticité de l’offre de travail par rapport aux salaires après impots et à consommation constante est donnée par
\(\dfrac{\partial (1-l)}{\partial w(1-\tau)}\dfrac{w(1-\tau)}{1-l}=\dfrac{\alpha c}{(w(1-\tau))^2}\dfrac{w(1-\tau)}{1-l}=\dfrac{\alpha c}{w(1-\tau)-\alpha c}\)
Solution. Pour \(l=0.7\) elle vaut \(2.33\) ce qui est bien plus élevé que les données réelles.
L’élasticité de Frisch mesure la sensibilité de l’offre de travail aux variations des salaires après impôts. Dans ce cadre théorique, une augmentation des impôts réduit considérablement l’offre de travail.
Prescott utilise ce cadre pour expliquer pourquoi les Européens travaillent moins que les Américains, en attribuant cet écart principalement aux différences de taxation et de transferts. Si l’élasticité de Frisch est en réalité plus faible (entre 0,4 et 1), cela signifie que les impôts et les transferts ne peuvent pas expliquer entièrement ces différences.
D’autres facteurs doivent être pris en compte:
Préférences culturelles: Les Européens pourraient simplement valoriser davantage les loisirs
Réglementations du marché du travail: Les institutions influencent la durée du travail (congés payés, protection de l’emploi)
Services publics: En Europe, des services publics plus développés (santé, éducation) réduisent le besoin de travailler davantage pour financer ces services de manière privée
Supposez que le marché du travail soit bien décrit par le modèle de recherche d’emploi.
Lorsque la COVID-19 a éclaté en mars 2020, des mesures de confinement généralisées ont été mises en place et les employeurs ont licencié un nombre record de travailleurs. Il s’agissait majoritairement de licenciements temporaires, avec l’intention explicite des employeurs de réembaucher lorsque la situation s’améliorerait.
Le nombre record de licenciements a entraîné une augmentation sans précédent des entrées de chômeurs. En outre, du fait du contexte incertain, les entreprises ont ralenti leurs efforts d’embauche.
Questions :
Supposez que le marché du travail soit bien décrit par le modèle de recherche d’emploi.
Lorsque la COVID-19 a éclaté en mars 2020, des mesures de confinement généralisées ont été mises en place et les employeurs ont licencié un nombre record de travailleurs. Il s’agissait majoritairement de licenciements temporaires, avec l’intention explicite des employeurs de réembaucher lorsque la situation s’améliorerait.
Le nombre record de licenciements a entraîné une augmentation sans précédent des entrées de chômeurs. En outre, du fait du contexte incertain, les entreprises ont ralenti leurs efforts d’embauche.
Questions :
Solution. L’augmentation des entrées de chômeurs entraîne un déplacement vers l’extérieur de la courbe de Beveridge. La baisse drastique de la demande (et de la création d’emploi) implique la rotation dans le sens des aiguilles d’une montre de la courbe de création d’emplois. Le taux de chômage augmente tandis que l’effet sur le nombre d’offres d’emploi est ambiguë. Comme il y a un déplacement de la courbe de Beveridge (et pas seulement un déplacement de la courbe de création d’emplois), la courbe de Beveridge observée sera plus à droite. Dans les faits, le taux de chômage a atteint un record de 14,7 % et le taux d’offres d’emploi a à peine baissé.
À partir de 2021, le marché du travail américain a connu une augmentation du taux de démissions. De nombreux travailleurs, après avoir réévalué leurs choix de carrière et leur équilibre entre vie professionnelle et vie privée, ont décidé de changer d’emploi.
De fait, la compétition à la recherche d’emploi devient plus rude. À un niveau donné d’offres d’emploi et de chômage, il est plus difficile de trouver un emploi adapté.
Dans le même temps, le comportement des entreprises change. Puisqu’il y a davantage de salariés cherchant à changer d’emploi, elles décident de publier davantage d’offres d’emploi.
Questions :
À partir de 2021, le marché du travail américain a connu une augmentation du taux de démissions. De nombreux travailleurs, après avoir réévalué leurs choix de carrière et leur équilibre entre vie professionnelle et vie privée, ont décidé de changer d’emploi.
De fait, la compétition à la recherche d’emploi devient plus rude. À un niveau donné d’offres d’emploi et de chômage, il est plus difficile de trouver un emploi adapté.
Dans le même temps, le comportement des entreprises change. Puisqu’il y a davantage de salariés cherchant à changer d’emploi, elles décident de publier davantage d’offres d’emploi.
Questions :
Solution. Pour un niveau donné d’offres d’emploi, la probabilité de trouver un emploi d’un chômeur diminue parce qu’ils sont en concurrence avec des personnes employées. Il s’agit d’un changement structurel du taux de sortie du chômage. De fait, la courbe de Beveridge se déplace vers l’extérieur. En parallèle, la demande des entreprises change et pour un même taux de chômage, elles augmentent le nombre d’offres d’emplois. Par conséquent, la courbe de création d’emplois tourne davantage dans le sens inverse des aiguilles d’une montre. Le nombre d’offres d’emploi augmente tandis que l’effet sur le taux de chômage est ambiguë.
Dans les faits, entre le début de 2021 et le printemps 2022, on observe une forte augmentation du taux d’offres d’emploi et une baisse du taux de chômage à 3,6 % en mars 2022.
#| '!! shinylive warning !!': |
#| shinylive does not work in self-contained HTML documents.
#| Please set `embed-resources: false` in your metadata.
#| standalone: true
#| viewerHeight: 550
from shiny import App, render, ui, reactive
import matplotlib.pyplot as plt
import numpy as np
# Data storage for past curves
past_curves = []
app_ui = ui.page_fluid(
ui.h2("Beveridge and Job Creation Curves"),
ui.layout_sidebar(
ui.sidebar(
ui.input_slider("alpha", "Beveridge curve shift", 0.5, 3.0, 1.0, step=0.1),
ui.input_slider("beta", "Job creation curve shift", 0.5, 3.0, 1.0, step=0.1),
ui.input_action_button("reset", "Reset All Curves")
),
ui.output_plot("curve_plot")
)
)
def server(input, output, session):
global past_curves
# Track changes in slider values to automatically store curves
@reactive.Effect
@reactive.event(input.alpha, input.beta)
def _():
# Define unemployment range
u = np.linspace(0.02, 0.12, 100)
# Beveridge Curve: properly convex relationship (hyperbolic)
v_beveridge = input.alpha() * 0.02 / (u + 0.02)
# Job Creation Curve with steeper slope for more dramatic changes
v_job_creation = input.beta() * (0.02 + u * 1.5)
# Store curves
past_curves.append((u, v_beveridge, v_job_creation))
if len(past_curves) > 5: # Keep only last 5 iterations
past_curves.pop(0)
# Reset button clears all past curves
@reactive.Effect
@reactive.event(input.reset)
def _():
global past_curves # Use global instead of nonlocal
past_curves = []
@output
@render.plot
def curve_plot():
# Define unemployment range
u = np.linspace(0.02, 0.12, 100)
# Current curves
v_beveridge = input.alpha() * 0.02 / (u + 0.02)
v_job_creation = input.beta() * (0.02 + u * 1.5)
# Calculate intersection points
intersections = []
for u_val, v_bev, v_job in past_curves:
# Find approximate intersection
diff = np.abs(v_bev - v_job)
idx = np.argmin(diff)
if diff[idx] < 0.01: # Only add if it's a real intersection
intersections.append((u_val[idx], v_bev[idx]))
# Calculate current intersection
diff = np.abs(v_beveridge - v_job_creation)
idx = np.argmin(diff)
if diff[idx] < 0.01:
intersections.append((u[idx], v_beveridge[idx]))
# Plot
fig, ax = plt.subplots(figsize=(10, 7))
ax.set_xlabel("Unemployment Rate", fontsize=12)
ax.set_ylabel("Vacancy Rate", fontsize=12)
ax.set_title("Beveridge Curve and Job Creation Curve", fontsize=14)
ax.set_xlim(0.02, 0.12)
ax.set_ylim(0, 0.5) # Adjusted for better visibility
# Plot previous curves with transparency
for i, (u_prev, v_b_prev, v_j_prev) in enumerate(past_curves[:-1]):
ax.plot(u_prev, v_b_prev, 'b--', alpha=0.3) # Beveridge Curve
ax.plot(u_prev, v_j_prev, 'r--', alpha=0.3) # Job Creation Curve
# Plot current curves
ax.plot(u, v_beveridge, 'b', label="Beveridge Curve", linewidth=2)
ax.plot(u, v_job_creation, 'r', label="Job Creation Curve", linewidth=2)
# Mark the current equilibrium
if intersections:
u_eq, v_eq = intersections[-1]
ax.scatter(u_eq, v_eq, color='green', s=100, zorder=5,
label=f"Equilibrium (U={u_eq:.3f}, V={v_eq:.3f})")
# Mark previous equilibrium points
for i, (u_eq, v_eq) in enumerate(intersections[:-1]):
ax.scatter(u_eq, v_eq, color='gray', s=50, alpha=0.5, zorder=4)
ax.grid(True, linestyle='--', alpha=0.7)
ax.legend(fontsize=10)
return fig
app = App(app_ui, server)