---
title: "2. Zašto država postoji? Tržišni neuspjesi i funkcije države"
---
Jedno od temeljnih pitanja ekonomske teorije i javnih politika jest treba li nam država u tržišnom gospodarstvu i, ako da, kolika bi njezina uloga trebala biti. Na prvi pogled, tržište se može činiti kao samodostatan mehanizam koji putem cijena i konkurencije učinkovito raspoređuje resurse. Međutim, već i osnovni uvid u funkcioniranje realnih ekonomija pokazuje da tržišta često ne ostvaruju ishode koji su društveno poželjni. Upravo iz tog razloga razvija se potreba za državom kao institucijom koja nadopunjuje i ispravlja tržišne procese.
U klasičnoj ekonomskoj teoriji tržište je percipirano kao mehanizam koji, pod određenim uvjetima, vodi do Pareto-efikasne alokacije resursa. No ti uvjeti — savršena konkurencija, potpune informacije, nepostojanje eksternalija — rijetko su zadovoljeni u praksi. U stvarnim gospodarstvima javljaju se brojna odstupanja od idealnog modela, što otvara prostor za intervenciju države.
## Tržišni neuspjesi kao temeljno opravdanje državne intervencije
Postoji nekoliko temeljnih razloga zbog kojih tržište samo po sebi ne može osigurati optimalne društvene ishode. Iako tržišni mehanizam u mnogim situacijama učinkovito raspoređuje resurse putem cijena i konkurencije, u stvarnim uvjetima često dolazi do odstupanja od idealnog modela. Ta odstupanja nazivamo tržišnim neuspjesima, a upravo oni predstavljaju osnovno opravdanje za intervenciju države [@stiglitz2015; @musgrave1989].
## Javna dobra
Javna dobra su dobra koja imaju dvije ključne karakteristike: **nerivalnost** i **neisključivost**.
Nerivalnost znači da korištenje dobra od strane jedne osobe ne smanjuje mogućnost da ga koriste i druge osobe. Drugim riječima, granični trošak dodatnog korisnika jednak je nuli ili vrlo blizu nuli. Primjerice, kada se uključi javna rasvjeta u gradu, činjenica da se jedna osoba koristi tom rasvjetom ne smanjuje dostupnost svjetla za druge. Slično vrijedi i za nacionalnu obranu ili signal javne televizije — jednom kada su osigurani, dodatni korisnici ne povećavaju troškove u značajnoj mjeri.
Neisključivost označava situaciju u kojoj je teško ili nemoguće spriječiti pojedince da koriste određeno dobro, čak i ako za njega nisu platili. To znači da ne postoji učinkovit mehanizam naplate po pojedinačnom korisniku. Na primjer, kada država osigurava nacionalnu sigurnost ili funkcioniranje pravosudnog sustava, nemoguće je isključiti pojedinca iz tih usluga zato što nije izravno platio njihovo korištenje.
Upravo kombinacija nerivalnosti i neisključivosti dovodi do specifičnog problema u tržišnom sustavu — problema „švercerana" (engl. *free-rider problem*). Budući da pojedinci znaju da ne mogu biti isključeni iz korištenja dobra, imaju poticaj da ne sudjeluju u njegovu financiranju, očekujući da će trošak snositi netko drugi. Ako svi razmišljaju na taj način, dobro se neće proizvesti u dovoljnoj količini ili se uopće neće proizvesti, iako je društveno korisno.
Zbog toga privatni sektor nema dovoljno poticaja za proizvodnju javnih dobara. Poduzeće koje bi pokušalo proizvesti takvo dobro ne bi moglo naplatiti njegovu upotrebu, pa ne bi moglo pokriti troškove proizvodnje. Tržišni mehanizam tako zakazuje, jer ne postoji način da se uspostavi veza između plaćanja i korištenja dobra. Uloga države postaje ključna: ona preuzima organizaciju i financiranje javnih dobara, najčešće putem poreza, čime se problem švercerana rješava obveznim sudjelovanjem svih građana [@olson1965].
Važno je napomenuti da u praksi postoji čitav spektar dobara između čistih javnih i čistih privatnih dobara. Neka dobra mogu biti djelomično rivalna ili djelomično isključiva, poput cesta s naplatom cestarine ili digitalnih sadržaja. Međutim, koncept javnih dobara ostaje ključan za razumijevanje zašto tržište u određenim slučajevima ne može samo osigurati optimalne ishode.
### Interaktivni prikaz: javno dobro i problem švercerana
Kod javnih dobara svaka jedinica istovremeno koristi svim potrošačima (nerivalnost), pa se agregatna potražnja dobiva **vertikalnim zbrajanjem** pojedinačnih krivulja D~i~. Zbroj predstavlja marginalnu društvenu korist ΣD~i~ = MSB. Društveni optimum Q\* je tamo gdje MSB siječe MC. No bez prisilne koordinacije svaki pojedinac plaća samo prema vlastitoj krivulji potražnje — najviše što bi tržište osiguralo (Q~M~) određuje pojedinac s najvećom spremnošću da plati. Razlika između Q~M~ i Q\* posljedica je **problema švercerana**.
```{ojs}
//| echo: false
viewof pg_controls = Inputs.form({
n: Inputs.range([2, 6], {value: 4, step: 1, label: "Broj potrošača (n):"}),
a_top: Inputs.range([30, 60], {value: 45, step: 1, label: "Najviša spremnost platiti (a₁):"}),
delta: Inputs.range([3, 12], {value: 6, step: 1, label: "Heterogenost potrošača (Δ):"}),
mc: Inputs.range([30, 90], {value: 60, step: 1, label: "Razina graničnog troška (MC):"})
})
```
```{ojs}
//| echo: false
pg_n = pg_controls.n
```
```{ojs}
//| echo: false
pg_a_top = pg_controls.a_top
```
```{ojs}
//| echo: false
pg_delta = pg_controls.delta
```
```{ojs}
//| echo: false
pg_mc = pg_controls.mc
```
```{ojs}
//| echo: false
{
const n = pg_n;
const a_top = pg_a_top;
const delta = pg_delta;
const MC = pg_mc;
const slope = 0.5; // common slope b for all individual demands
const Qmax = 100;
const Pmax = 200;
// Build individual demand intercepts: a_1 > a_2 > ... > a_n
const a_i = d3.range(n).map(i => a_top - i * delta);
// Quantity grid
const Qs = d3.range(0, Qmax + 0.5, 0.5);
// Individual demand curves
const indivCurves = a_i.map((a, idx) =>
Qs.map(q => ({Q: q, P: Math.max(0, a - slope * q), id: `D${idx + 1}`}))
.filter(p => p.P >= 0 && p.P <= Pmax)
);
// Vertical aggregate: MSB(q) = Σ max(0, a_i - slope*q)
const msb = Qs.map(q => {
const total = a_i.reduce((acc, a) => acc + Math.max(0, a - slope * q), 0);
return {Q: q, P: total};
}).filter(p => p.P >= 0 && p.P <= Pmax);
// MC: horizontal line at level MC
const mcLine = [{Q: 0, P: MC}, {Q: Qmax, P: MC}];
// Social optimum: where MSB = MC
// Sum of individuals still in market at q: those with a_i > slope*q
// Solve numerically by scanning
let Qstar = 0;
for (let i = msb.length - 1; i >= 0; i--) {
if (msb[i].P >= MC) { Qstar = msb[i].Q; break; }
}
// Market (free-rider) provision: highest individual D_1 meets MC
// a_1 - slope*Q = MC => Q = (a_1 - MC)/slope, if positive
const Qm = Math.max(0, (a_i[0] - MC) / slope);
const P_star = MC; // price/level along MC line
// Color palette for individual curves (light to dark navy/teal)
const palette = ["#90CDF4", "#63B3ED", "#4299E1", "#3182CE", "#2B6CB0", "#1A365D"];
// Build marks dynamically
const indivMarks = indivCurves.map((curve, idx) =>
Plot.line(curve, {x: "Q", y: "P", stroke: palette[idx % palette.length], strokeWidth: 1.5})
);
// Labels on individual curves at their right end
const indivLabels = a_i.map((a, idx) => {
const xEnd = Math.min(Qmax * 0.9, (a / slope) * 0.85);
const yEnd = Math.max(0, a - slope * xEnd);
return {x: xEnd, y: yEnd, label: `D${idx + 1}`, color: palette[idx % palette.length]};
});
return Plot.plot({
width: 760,
height: 520,
marginLeft: 65,
marginBottom: 55,
style: {fontSize: "12px", fontFamily: "Roboto, system-ui, sans-serif", color: "#4A5568"},
x: {label: "Količina javnog dobra (Q) →", domain: [0, Qmax], grid: false},
y: {label: "↑ Cijena / Korist (P)", domain: [0, Pmax], grid: true},
marks: [
Plot.ruleY([0], {stroke: "#CBD5E0"}),
// Individual demand curves
...indivMarks,
// Aggregate MSB curve (thick, dark)
Plot.line(msb, {x: "Q", y: "P", stroke: "#1A202C", strokeWidth: 3}),
// MC line (horizontal)
Plot.line(mcLine, {x: "Q", y: "P", stroke: "#C53030", strokeWidth: 2.5}),
// Dashed guides
Plot.ruleY([P_star], {stroke: "#A0AEC0", strokeDasharray: "4,3"}),
Plot.ruleX([Qm], {y1: 0, y2: P_star, stroke: "#A0AEC0", strokeDasharray: "4,3"}),
Plot.ruleX([Qstar], {y1: 0, y2: P_star, stroke: "#A0AEC0", strokeDasharray: "4,3"}),
// Equilibrium dots
Plot.dot([{Q: Qm, P: P_star}],
{x: "Q", y: "P", r: 5, fill: "#C53030", stroke: "white", strokeWidth: 2}),
Plot.dot([{Q: Qstar, P: P_star}],
{x: "Q", y: "P", r: 5, fill: "#1A202C", stroke: "white", strokeWidth: 2}),
// Curve labels (individual)
Plot.text(indivLabels, {x: "x", y: "y", text: "label",
fill: d => d.color, fontSize: 11, fontWeight: 600, dy: -8}),
// MSB label
Plot.text([{x: Qmax * 0.65, y: msb.find(p => p.Q >= Qmax * 0.65)?.P ?? 0,
label: "ΣDᵢ = MSB"}],
{x: "x", y: "y", text: "label", fill: "#1A202C",
fontSize: 13, fontWeight: 700, dy: -10}),
// MC label
Plot.text([{x: Qmax * 0.05, y: MC, label: `MC = ${MC}`}],
{x: "x", y: "y", text: "label", fill: "#C53030",
fontSize: 12, fontWeight: 600, dy: -8, textAnchor: "start"}),
// Price label
Plot.text([{x: 1, y: P_star, label: `P* = ${P_star.toFixed(0)}`}],
{x: "x", y: "y", text: "label", textAnchor: "start", dy: 12,
fontSize: 11, fill: "#4A5568"}),
// Quantity labels
Plot.text([{x: Qm, y: 3, label: `Q_M = ${Qm.toFixed(1)}`}],
{x: "x", y: "y", text: "label", textAnchor: "middle",
fontSize: 11, fill: "#C53030"}),
Plot.text([{x: Qstar, y: 3, label: `Q* = ${Qstar.toFixed(1)}`}],
{x: "x", y: "y", text: "label", textAnchor: "middle",
fontSize: 11, fill: "#1A202C"}),
// Headline readout: underprovision gap
Plot.text([{x: 2, y: Pmax * 0.97,
label: `Premala tržišna proizvodnja: Q* − Q_M = ${(Qstar - Qm).toFixed(1)}`}],
{x: "x", y: "y", text: "label", textAnchor: "start",
fontSize: 14, fill: "#1A202C", fontWeight: 700})
]
});
}
```
## Eksternalije
Eksternalije su učinci ekonomskih aktivnosti na treće strane koji nisu uključeni u tržišne cijene. Drugim riječima, riječ je o situacijama u kojima djelovanje jednog ekonomskog subjekta utječe na dobrobit drugih, a da se taj učinak ne odražava u cijeni proizvoda ili usluge.
**Negativne eksternalije** uključuju pojave poput zagađenja okoliša, buke ili prometnih gužvi. Na primjer, tvornica koja ispušta štetne plinove u atmosferu ne snosi puni trošak tog zagađenja, već dio troška snosi društvo kroz narušeno zdravlje i okoliš. U takvom slučaju tržište dovodi do prekomjerne proizvodnje jer proizvođač ne internalizira sve troškove.
**Pozitivne eksternalije** nastaju kada neka aktivnost generira dodatne koristi za društvo. Primjeri uključuju obrazovanje, cijepljenje ili istraživanje i razvoj. Obrazovaniji pojedinci ne doprinose samo vlastitom dohotku, već i produktivnosti cijelog gospodarstva. Međutim, pojedinci često ne uzimaju u obzir te šire koristi prilikom donošenja odluka, pa tržište proizvodi manje takvih aktivnosti nego što je društveno optimalno.
U oba slučaja dolazi do odstupanja od optimalne razine proizvodnje. Država intervenira kako bi ispravila te neusklađenosti. Kod negativnih eksternalija uvodi poreze (npr. porez na emisije CO₂) ili regulaciju, dok kod pozitivnih eksternalija koristi subvencije i javna ulaganja kako bi potaknula poželjne aktivnosti [@stiglitz2015].
### Interaktivni prikaz: negativna eksternalija (zagađenje)
Dijagram ispod prikazuje standardni model negativne eksternalije. Krivulja **MPC** (*marginalni privatni trošak*) odražava ono što proizvođač uzima u obzir; krivulja **MSC** (*marginalni društveni trošak*) uključuje i vanjske troškove koje snosi društvo. Tržišno ravnotežno presjecište MPC i potražnje (D) daje premašenu količinu Q~M~ po prenoj niskoj cijeni P~MPC~. Društveno optimalna razina proizvodnje je Q\*, koja se postiže uz cijenu P\*. Osjenčani trokut između Q\* i Q~M~ predstavlja **gubitak blagostanja** (DWL).
```{ojs}
//| echo: false
viewof ext_controls = Inputs.form({
ext: Inputs.range([5, 40], {value: 20, step: 1, label: "Vanjski trošak po jedinici (e):"}),
eps_d_ext: Inputs.range([0.3, 2.5], {value: 1.0, step: 0.05, label: "Elastičnost potražnje |εD|:"}),
eps_s_ext: Inputs.range([0.3, 2.5], {value: 1.0, step: 0.05, label: "Elastičnost ponude εS:"})
})
```
```{ojs}
//| echo: false
ext_val = ext_controls.ext
```
```{ojs}
//| echo: false
eps_d_ext = ext_controls.eps_d_ext
```
```{ojs}
//| echo: false
eps_s_ext = ext_controls.eps_s_ext
```
```{ojs}
//| echo: false
{
// Fix MPC/D equilibrium at (Qm, Pmpc) = (60, 50)
const Qm = 60;
const Pmpc = 50;
const Qmax = 110;
const Pmax = 110;
const e = ext_val;
// MPC slope from elasticity: |εD| = (P/Q)*(1/b_d) => b_d = P/(Q*|εD|)
const b_d = Pmpc / (Qm * eps_d_ext);
// Demand: P = a_d - b_d*Q, at (Qm, Pmpc): a_d = Pmpc + b_d*Qm
const a_d = Pmpc + b_d * Qm;
// MPC slope: εS = (P/Q)*(1/b_s) => b_s = P/(Q*εS)
const b_s = Pmpc / (Qm * eps_s_ext);
// MPC: P = c_s + b_s*Q, at (Qm, Pmpc): c_s = Pmpc - b_s*Qm
const c_s = Pmpc - b_s * Qm;
// MSC = MPC + e => P = (c_s + e) + b_s*Q
// Social optimum: MSC = D => (c_s + e) + b_s*Q* = a_d - b_d*Q*
const Qstar = (a_d - c_s - e) / (b_d + b_s);
const Pstar = a_d - b_d * Qstar;
// Data arrays
const Qs = d3.range(0, Qmax + 1);
const demand = Qs.map(q => ({Q: q, P: a_d - b_d * q})).filter(p => p.P >= 0 && p.P <= Pmax);
const mpc = Qs.map(q => ({Q: q, P: c_s + b_s * q})).filter(p => p.P >= 0 && p.P <= Pmax);
const msc = Qs.map(q => ({Q: q, P: c_s + e + b_s * q})).filter(p => p.P >= 0 && p.P <= Pmax);
// DWL triangle: vertices at (Q*, Pstar), (Qm, Pmpc), (Qm, Pstar)
// More precisely: intersection of MSC with D at Q*, and MPC with D at Qm
const dwlTri = [
{Q: Qstar, P: Pstar},
{Q: Qm, P: Pmpc},
{Q: Qm, P: Pstar}
];
// DWL area
const dwl = 0.5 * Math.abs(Pstar - Pmpc) * Math.abs(Qm - Qstar);
return Plot.plot({
width: 760,
height: 500,
marginLeft: 65,
marginBottom: 55,
style: {fontSize: "12px", fontFamily: "Roboto, system-ui, sans-serif", color: "#4A5568"},
x: {label: "Količina (Q) →", domain: [0, Qmax], grid: false},
y: {label: "↑ Cijena / Trošak (P)", domain: [0, Pmax], grid: true},
marks: [
Plot.ruleY([0], {stroke: "#CBD5E0"}),
// DWL triangle (shaded)
Plot.line([...dwlTri, dwlTri[0]],
{x: "Q", y: "P", stroke: "#C53030", strokeWidth: 1,
fill: "#FEB2B2", fillOpacity: 0.65, curve: "linear"}),
// Curves
Plot.line(demand, {x: "Q", y: "P", stroke: "#1f77b4", strokeWidth: 2.5}),
Plot.line(mpc, {x: "Q", y: "P", stroke: "#2ca02c", strokeWidth: 2}),
Plot.line(msc, {x: "Q", y: "P", stroke: "#C53030", strokeWidth: 2}),
// Dashed guides
Plot.ruleY([Pstar], {stroke: "#A0AEC0", strokeDasharray: "4,3"}),
Plot.ruleY([Pmpc], {stroke: "#A0AEC0", strokeDasharray: "4,3"}),
Plot.ruleX([Qstar], {y1: 0, y2: Pstar, stroke: "#A0AEC0", strokeDasharray: "4,3"}),
Plot.ruleX([Qm], {y1: 0, y2: Pmpc, stroke: "#A0AEC0", strokeDasharray: "4,3"}),
// Equilibrium dots
Plot.dot([{Q: Qm, P: Pmpc}],
{x: "Q", y: "P", r: 5, fill: "#2ca02c", stroke: "white", strokeWidth: 2}),
Plot.dot([{Q: Qstar, P: Pstar}],
{x: "Q", y: "P", r: 5, fill: "#C53030", stroke: "white", strokeWidth: 2}),
// Curve labels
Plot.text([{x: Qmax * 0.82, y: a_d - b_d * Qmax * 0.82, label: `D (|εD|=${eps_d_ext.toFixed(2)})`}],
{x: "x", y: "y", text: "label", fill: "#1f77b4", fontSize: 12, fontWeight: 600, dy: -8}),
Plot.text([{x: Qmax * 0.82, y: c_s + b_s * Qmax * 0.82, label: `MPC (εS=${eps_s_ext.toFixed(2)})`}],
{x: "x", y: "y", text: "label", fill: "#2ca02c", fontSize: 12, fontWeight: 600, dy: -8}),
Plot.text([{x: Qmax * 0.7, y: c_s + e + b_s * Qmax * 0.7, label: `MSC (e=${e})`}],
{x: "x", y: "y", text: "label", fill: "#C53030", fontSize: 12, fontWeight: 600, dy: -8}),
// Price & quantity labels on axes
Plot.text([{x: 1, y: Pstar, label: `P* = ${Pstar.toFixed(1)}`}],
{x: "x", y: "y", text: "label", textAnchor: "start", dy: -7, fontSize: 11, fill: "#C53030"}),
Plot.text([{x: 1, y: Pmpc, label: `P_MPC = ${Pmpc.toFixed(1)}`}],
{x: "x", y: "y", text: "label", textAnchor: "start", dy: 12, fontSize: 11, fill: "#2ca02c"}),
Plot.text([{x: Qstar, y: 2, label: `Q* = ${Qstar.toFixed(1)}`}],
{x: "x", y: "y", text: "label", textAnchor: "middle", dy: 0, fontSize: 11, fill: "#C53030"}),
Plot.text([{x: Qm, y: 2, label: `Q_M = ${Qm.toFixed(1)}`}],
{x: "x", y: "y", text: "label", textAnchor: "middle", dy: 0, fontSize: 11, fill: "#2ca02c"}),
// DWL readout
Plot.text([{x: 2, y: Pmax * 0.97,
label: `Gubitak blagostanja (DWL) = ${dwl.toFixed(1)}`}],
{x: "x", y: "y", text: "label", textAnchor: "start",
fontSize: 14, fill: "#C53030", fontWeight: 700})
]
});
}
```
### Interaktivni prikaz: pozitivna eksternalija (obrazovanje)
Kod pozitivnih eksternalija društvene koristi premašuju privatne. Krivulja **MPB** (*marginalna privatna korist*) odražava potražnju koju potrošači sami iskazuju, dok krivulja **MSB** (*marginalna društvena korist*) uključuje i vanjske koristi (npr. veću produktivnost cijelog gospodarstva od obrazovanijih pojedinaca). Tržišno presjecište MPB i ponude (S) daje **nedovoljnu** količinu Q~M~ po cijeni P~M~. Društveno optimalna razina je Q\* uz cijenu P\*. Osjenčani trokut prikazuje **propuštenu društvenu korist** — gubitak blagostanja zbog premale proizvodnje.
```{ojs}
//| echo: false
viewof pos_controls = Inputs.form({
extb: Inputs.range([5, 40], {value: 20, step: 1, label: "Vanjska korist po jedinici (b):"}),
eps_d_pos: Inputs.range([0.3, 2.5], {value: 1.0, step: 0.05, label: "Elastičnost potražnje |εD|:"}),
eps_s_pos: Inputs.range([0.3, 2.5], {value: 1.0, step: 0.05, label: "Elastičnost ponude εS:"})
})
```
```{ojs}
//| echo: false
extb_val = pos_controls.extb
```
```{ojs}
//| echo: false
eps_d_pos = pos_controls.eps_d_pos
```
```{ojs}
//| echo: false
eps_s_pos = pos_controls.eps_s_pos
```
```{ojs}
//| echo: false
{
// Fix MPB/S market equilibrium at (Qm, Pm) = (50, 50)
const Qm = 50;
const Pm = 50;
const Qmax = 110;
const Pmax = 110;
const b = extb_val;
// MPB slope from elasticity: b_d = P/(Q*|εD|)
const b_d = Pm / (Qm * eps_d_pos);
// MPB: P = a_d - b_d*Q, at (Qm, Pm): a_d = Pm + b_d*Qm
const a_d = Pm + b_d * Qm;
// Supply slope: b_s = P/(Q*εS)
const b_s = Pm / (Qm * eps_s_pos);
// S: P = c_s + b_s*Q, at (Qm, Pm): c_s = Pm - b_s*Qm
const c_s = Pm - b_s * Qm;
// MSB = MPB + b => P = (a_d + b) - b_d*Q
// Social optimum: MSB = S => (a_d + b) - b_d*Q* = c_s + b_s*Q*
const Qstar = (a_d + b - c_s) / (b_d + b_s);
const Pstar = c_s + b_s * Qstar;
// MSB at Q_M (top-left vertex of DWL triangle)
const MSB_Qm = a_d + b - b_d * Qm;
const Qs = d3.range(0, Qmax + 1);
const mpb = Qs.map(q => ({Q: q, P: a_d - b_d * q})).filter(p => p.P >= 0 && p.P <= Pmax);
const msb = Qs.map(q => ({Q: q, P: a_d + b - b_d * q})).filter(p => p.P >= 0 && p.P <= Pmax);
const supply = Qs.map(q => ({Q: q, P: c_s + b_s * q})).filter(p => p.P >= 0 && p.P <= Pmax);
// DWL triangle: area between MSB (top) and S (bottom), from Q_M to Q*
// Vertices: (Q_M, P_M) on S, (Q_M, MSB(Q_M)) on MSB, (Q*, P*) intersection
const dwlTri = [
{Q: Qm, P: Pm},
{Q: Qm, P: MSB_Qm},
{Q: Qstar, P: Pstar}
];
// DWL area = 0.5 * (MSB(Q_M) - P_M) * (Q* - Q_M)
const dwl = 0.5 * Math.abs(MSB_Qm - Pm) * Math.abs(Qstar - Qm);
return Plot.plot({
width: 760,
height: 500,
marginLeft: 65,
marginBottom: 55,
style: {fontSize: "12px", fontFamily: "Roboto, system-ui, sans-serif", color: "#4A5568"},
x: {label: "Količina (Q) →", domain: [0, Qmax], grid: false},
y: {label: "↑ Cijena / Korist (P)", domain: [0, Pmax], grid: true},
marks: [
Plot.ruleY([0], {stroke: "#CBD5E0"}),
// DWL triangle (shaded — propuštena korist)
Plot.line([...dwlTri, dwlTri[0]],
{x: "Q", y: "P", stroke: "#D69E2E", strokeWidth: 1,
fill: "#FAF089", fillOpacity: 0.65, curve: "linear"}),
// Curves
Plot.line(mpb, {x: "Q", y: "P", stroke: "#1f77b4", strokeWidth: 2.5}),
Plot.line(msb, {x: "Q", y: "P", stroke: "#2B6CB0", strokeWidth: 2}),
Plot.line(supply, {x: "Q", y: "P", stroke: "#2ca02c", strokeWidth: 2}),
// Dashed guides
Plot.ruleY([Pstar], {stroke: "#A0AEC0", strokeDasharray: "4,3"}),
Plot.ruleY([Pm], {stroke: "#A0AEC0", strokeDasharray: "4,3"}),
Plot.ruleX([Qstar], {y1: 0, y2: Pstar, stroke: "#A0AEC0", strokeDasharray: "4,3"}),
Plot.ruleX([Qm], {y1: 0, y2: MSB_Qm, stroke: "#A0AEC0", strokeDasharray: "4,3"}),
// Equilibrium dots
Plot.dot([{Q: Qm, P: Pm}],
{x: "Q", y: "P", r: 5, fill: "#1f77b4", stroke: "white", strokeWidth: 2}),
Plot.dot([{Q: Qstar, P: Pstar}],
{x: "Q", y: "P", r: 5, fill: "#2B6CB0", stroke: "white", strokeWidth: 2}),
// Curve labels
Plot.text([{x: Qmax * 0.82, y: a_d - b_d * Qmax * 0.82, label: `D = MPB (|εD|=${eps_d_pos.toFixed(2)})`}],
{x: "x", y: "y", text: "label", fill: "#1f77b4", fontSize: 12, fontWeight: 600, dy: -8}),
Plot.text([{x: Qmax * 0.7, y: a_d + b - b_d * Qmax * 0.7, label: `MSB (b=${b})`}],
{x: "x", y: "y", text: "label", fill: "#2B6CB0", fontSize: 12, fontWeight: 600, dy: -8}),
Plot.text([{x: Qmax * 0.82, y: c_s + b_s * Qmax * 0.82, label: `S (εS=${eps_s_pos.toFixed(2)})`}],
{x: "x", y: "y", text: "label", fill: "#2ca02c", fontSize: 12, fontWeight: 600, dy: -8}),
// Price & quantity labels on axes
Plot.text([{x: 1, y: Pstar, label: `P* = ${Pstar.toFixed(1)}`}],
{x: "x", y: "y", text: "label", textAnchor: "start", dy: -7, fontSize: 11, fill: "#2B6CB0"}),
Plot.text([{x: 1, y: Pm, label: `P_M = ${Pm.toFixed(1)}`}],
{x: "x", y: "y", text: "label", textAnchor: "start", dy: 12, fontSize: 11, fill: "#1f77b4"}),
Plot.text([{x: Qm, y: 2, label: `Q_M = ${Qm.toFixed(1)}`}],
{x: "x", y: "y", text: "label", textAnchor: "middle", dy: 0, fontSize: 11, fill: "#1f77b4"}),
Plot.text([{x: Qstar, y: 2, label: `Q* = ${Qstar.toFixed(1)}`}],
{x: "x", y: "y", text: "label", textAnchor: "middle", dy: 0, fontSize: 11, fill: "#2B6CB0"}),
// DWL readout
Plot.text([{x: 2, y: Pmax * 0.97,
label: `Propuštena korist (DWL) = ${dwl.toFixed(1)}`}],
{x: "x", y: "y", text: "label", textAnchor: "start",
fontSize: 14, fill: "#B7791F", fontWeight: 700})
]
});
}
```
## Asimetrične informacije
U mnogim tržišnim transakcijama informacije nisu ravnomjerno raspoređene među sudionicima. Jedna strana često ima više ili kvalitetnije informacije od druge, što nazivamo informacijskom asimetrijom. Takve situacije mogu dovesti do loših odluka, nepovjerenja među sudionicima tržišta pa čak i do potpunog kolapsa tržišta.
Jedan od najpoznatijih primjera je tržište rabljenih automobila, gdje prodavatelj ima više informacija o kvaliteti vozila od kupca. Kupci, svjesni tog problema, spremni su platiti samo prosječnu cijenu, što dovodi do toga da kvalitetni proizvodi nestaju s tržišta — fenomen poznat kao problem „limuna" (*adverse selection*).
Slični problemi pojavljuju se i na financijskim tržištima. Prije globalne financijske krize 2008. godine, investitori često nisu imali potpune informacije o rizicima financijskih instrumenata koje su kupovali, što je pridonijelo destabilizaciji financijskog sustava.
U takvim uvjetima država intervenira kako bi poboljšala funkcioniranje tržišta. To čini kroz uvođenje standarda kvalitete, obvezno objavljivanje informacija i osnivanje regulatornih tijela koja nadziru tržišne aktere. Cilj je smanjiti neizvjesnost i povećati povjerenje među sudionicima tržišta [@stiglitz2015; @rosen2014].
### Interaktivni prikaz: tržište limuna (adverse selection)
Kada kupci ne razlikuju kvalitetu, spremni su platiti samo prosječnu cijenu. Ta cijena je preniska za prodavače kvalitetne robe (krivulja **S~visoka~**), pa oni napuštaju tržište. Ostaje samo loša roba (krivulja **S~loša~**), a ravnoteža se pomiče s točke (Q₁, P~visoka~) na (Q₂, P~niska~). U graničnim slučajevima tržište se može potpuno urušiti.
```{ojs}
//| echo: false
viewof asi_controls = Inputs.form({
qprem: Inputs.range([5, 40], {value: 20, step: 1, label: "Premija za kvalitetu (Δ):"}),
eps_d_asi: Inputs.range([0.3, 2.5], {value: 1.0, step: 0.05, label: "Elastičnost potražnje |εD|:"}),
eps_s_asi: Inputs.range([0.3, 2.5], {value: 1.0, step: 0.05, label: "Elastičnost ponude εS:"})
})
```
```{ojs}
//| echo: false
qprem_val = asi_controls.qprem
```
```{ojs}
//| echo: false
eps_d_asi = asi_controls.eps_d_asi
```
```{ojs}
//| echo: false
eps_s_asi = asi_controls.eps_s_asi
```
```{ojs}
//| echo: false
{
// Anchor low-quality equilibrium at (Q2, P_niska) = (60, 50)
const Q2 = 60;
const P_low = 50;
const Qmax = 110;
const Pmax = 120;
const dQ = qprem_val;
// Demand slope from elasticity at low-quality eq
const b_d = P_low / (Q2 * eps_d_asi);
const a_d = P_low + b_d * Q2; // D: P = a_d - b_d*Q
// Supply slope from elasticity at low-quality eq
const b_s = P_low / (Q2 * eps_s_asi);
const c_s = P_low - b_s * Q2; // S_low: P = c_s + b_s*Q
// S_high shifted up by Δ: P = (c_s + Δ) + b_s*Q
// High-quality equilibrium: D = S_high
// a_d - b_d*Q = (c_s + Δ) + b_s*Q
const Q1 = (a_d - c_s - dQ) / (b_d + b_s);
const P_high = a_d - b_d * Q1;
const Qs = d3.range(0, Qmax + 1);
const demand = Qs.map(q => ({Q: q, P: a_d - b_d * q})).filter(p => p.P >= 0 && p.P <= Pmax);
const sLow = Qs.map(q => ({Q: q, P: c_s + b_s * q})).filter(p => p.P >= 0 && p.P <= Pmax);
const sHigh = Qs.map(q => ({Q: q, P: c_s + dQ + b_s * q})).filter(p => p.P >= 0 && p.P <= Pmax);
// Quantity reduction & price drop
const qDrop = Q2 - Q1;
const pDrop = P_high - P_low;
// Detect potential market collapse: high-quality eq quantity ≤ 0
const collapse = Q1 <= 0;
return Plot.plot({
width: 760,
height: 500,
marginLeft: 65,
marginBottom: 55,
style: {fontSize: "12px", fontFamily: "Roboto, system-ui, sans-serif", color: "#4A5568"},
x: {label: "Količina (Q) →", domain: [0, Qmax], grid: false},
y: {label: "↑ Cijena (P)", domain: [0, Pmax], grid: true},
marks: [
Plot.ruleY([0], {stroke: "#CBD5E0"}),
// Curves
Plot.line(demand, {x: "Q", y: "P", stroke: "#1f77b4", strokeWidth: 2.5}),
Plot.line(sLow, {x: "Q", y: "P", stroke: "#2ca02c", strokeWidth: 2}),
Plot.line(sHigh, {x: "Q", y: "P", stroke: "#2ca02c", strokeWidth: 2, strokeDasharray: "6,4"}),
// Shift arrow from S_high to S_low at a representative Q (Q2 * 0.6)
Plot.link(
[{x1: Q2 * 0.55, y1: c_s + dQ + b_s * Q2 * 0.55,
x2: Q2 * 0.55, y2: c_s + b_s * Q2 * 0.55}],
{x1: "x1", y1: "y1", x2: "x2", y2: "y2",
stroke: "#C53030", strokeWidth: 2, markerEnd: "arrow"}),
// Dashed price/quantity guides
Plot.ruleY([P_high], {stroke: "#A0AEC0", strokeDasharray: "4,3"}),
Plot.ruleY([P_low], {stroke: "#A0AEC0", strokeDasharray: "4,3"}),
Plot.ruleX([Q1], {y1: 0, y2: P_high, stroke: "#A0AEC0", strokeDasharray: "4,3"}),
Plot.ruleX([Q2], {y1: 0, y2: P_low, stroke: "#A0AEC0", strokeDasharray: "4,3"}),
// Equilibrium dots
Plot.dot([{Q: Q1, P: P_high}],
{x: "Q", y: "P", r: 5, fill: "#2D3748", stroke: "white", strokeWidth: 2}),
Plot.dot([{Q: Q2, P: P_low}],
{x: "Q", y: "P", r: 5, fill: "#C53030", stroke: "white", strokeWidth: 2}),
// Curve labels
Plot.text([{x: Qmax * 0.82, y: a_d - b_d * Qmax * 0.82, label: `D (|εD|=${eps_d_asi.toFixed(2)})`}],
{x: "x", y: "y", text: "label", fill: "#1f77b4", fontSize: 12, fontWeight: 600, dy: -8}),
Plot.text([{x: Qmax * 0.82, y: c_s + b_s * Qmax * 0.82, label: `S_loša (εS=${eps_s_asi.toFixed(2)})`}],
{x: "x", y: "y", text: "label", fill: "#2ca02c", fontSize: 12, fontWeight: 600, dy: -8}),
Plot.text([{x: Qmax * 0.7, y: c_s + dQ + b_s * Qmax * 0.7, label: `S_visoka (Δ=${dQ})`}],
{x: "x", y: "y", text: "label", fill: "#2ca02c", fontSize: 12, fontWeight: 600, dy: -8}),
// Price labels
Plot.text([{x: 1, y: P_high, label: `P_visoka = ${P_high.toFixed(1)}`}],
{x: "x", y: "y", text: "label", textAnchor: "start", dy: -7, fontSize: 11, fill: "#2D3748"}),
Plot.text([{x: 1, y: P_low, label: `P_niska = ${P_low.toFixed(1)}`}],
{x: "x", y: "y", text: "label", textAnchor: "start", dy: 12, fontSize: 11, fill: "#C53030"}),
// Quantity labels
Plot.text([{x: Q1, y: 2, label: `Q₁ = ${Q1.toFixed(1)}`}],
{x: "x", y: "y", text: "label", textAnchor: "middle", fontSize: 11, fill: "#2D3748"}),
Plot.text([{x: Q2, y: 2, label: `Q₂ = ${Q2.toFixed(1)}`}],
{x: "x", y: "y", text: "label", textAnchor: "middle", fontSize: 11, fill: "#C53030"}),
// Top readouts
Plot.text([{x: 2, y: Pmax * 0.97,
label: collapse ? "⚠ Tržište se urušava (Q₁ ≤ 0)" : `Pad količine: ΔQ = ${qDrop.toFixed(1)}`}],
{x: "x", y: "y", text: "label", textAnchor: "start",
fontSize: 14, fill: "#C53030", fontWeight: 700}),
Plot.text([{x: 2, y: Pmax * 0.91,
label: `Pad cijene: ΔP = ${pDrop.toFixed(1)}`}],
{x: "x", y: "y", text: "label", textAnchor: "start",
fontSize: 13, fill: "#2D3748", fontWeight: 600})
]
});
}
```
Druga važna posljedica informacijske asimetrije je **moralni hazard** (*moral hazard*) — promjena ponašanja agenta nakon što je sklopio ugovor ili stekao zaštitu. Kada osiguranje, jamstvo ili državna pomoć preuzimaju dio troška lošeg ishoda, agent ima slabiji poticaj izbjegavati rizik. Vozač s punim kasko osiguranjem manje pažljivo parkira, banka s implicitnim državnim jamstvom preuzima veće rizike, a pojedinac s vrlo izdašnim zdravstvenim osiguranjem rjeđe ulaže u prevenciju. Klasično rješenje je dijeljenje rizika kroz franšizu, suosiguranje i nadzor [@stiglitz2015].
### Interaktivni prikaz: moralni hazard (skrivene radnje)
Agent bira razinu rizičnog ponašanja **e** uspoređujući privatnu korist (npr. brzinu, prinos, udobnost) s troškom mogućih šteta. **Bez osiguranja** agent snosi puni trošak C(e) i bira nisku razinu rizika **e\***. **Sa osiguranjem** osiguratelj pokriva dio (θ) štete, pa agent percipira samo (1−θ)·C(e) — krivulja postaje plića i agent bira višu razinu rizika **e~M~** > e\*. Razlika je posljedica moralnog hazarda.
```{ojs}
//| echo: false
viewof mh_controls = Inputs.form({
theta: Inputs.range([0, 0.9], {value: 0.5, step: 0.05, label: "Pokriće osiguranja (θ):"}),
k: Inputs.range([0.05, 0.5], {value: 0.15, step: 0.01, label: "Konveksnost troška (k):"}),
m: Inputs.range([0.5, 3.0], {value: 1.5, step: 0.05, label: "Marginalna korist od rizika (m):"})
})
```
```{ojs}
//| echo: false
mh_theta = mh_controls.theta
```
```{ojs}
//| echo: false
mh_k = mh_controls.k
```
```{ojs}
//| echo: false
mh_m = mh_controls.m
```
```{ojs}
//| echo: false
{
const theta = mh_theta;
const k = mh_k;
const m = mh_m;
const emax = 12;
const Cmax = 18;
// Cost function: C(e) = 1 + k*e^2 (convex)
// Without insurance, agent sees full C(e)
// With insurance, agent perceives (1 - theta) * variable cost: 1 + k*(1 - theta)*e^2
// Agent's chosen e: MB = m, MC_perceived = 2*k_eff*e => e = m / (2*k_eff)
const eStar = m / (2 * k);
const eM = m / (2 * k * (1 - theta));
const eMshown = Math.min(eM, emax * 0.98);
const es = d3.range(0, emax + 0.05, 0.05);
const cFull = es.map(e => ({e: e, C: 1 + k * e * e}))
.filter(p => p.C <= Cmax);
const cIns = es.map(e => ({e: e, C: 1 + k * (1 - theta) * e * e}))
.filter(p => p.C <= Cmax);
// Costs at the two chosen e levels (real, social cost — on the full curve)
const C_at_eStar = 1 + k * eStar * eStar;
const C_at_eM = 1 + k * Math.min(eM, emax) * Math.min(eM, emax);
// Excess social cost from moral hazard (vs net benefit gained):
// Cost increase: C(eM) - C(e*); Benefit increase: m*(eM - e*)
const dwl = Math.max(0, (C_at_eM - C_at_eStar) - m * (eM - eStar));
return Plot.plot({
width: 760,
height: 500,
marginLeft: 70,
marginBottom: 55,
style: {fontSize: "12px", fontFamily: "Roboto, system-ui, sans-serif", color: "#4A5568"},
x: {label: "Rizično ponašanje (e) →", domain: [0, emax], grid: false},
y: {label: "↑ Trošak / šteta", domain: [0, Cmax], grid: true},
marks: [
Plot.ruleY([0], {stroke: "#CBD5E0"}),
// Cost curves
Plot.line(cFull, {x: "e", y: "C", stroke: "#C53030", strokeWidth: 2.5, strokeDasharray: "6,4"}),
Plot.line(cIns, {x: "e", y: "C", stroke: "#2D3748", strokeWidth: 2.5}),
// Dashed verticals at e* and eM
Plot.ruleX([eStar], {y1: 0, y2: 1 + k * eStar * eStar, stroke: "#A0AEC0", strokeDasharray: "4,3"}),
Plot.ruleX([eMshown], {y1: 0, y2: 1 + k * (1 - theta) * eMshown * eMshown,
stroke: "#A0AEC0", strokeDasharray: "4,3"}),
// Equilibrium dots: each on the curve the agent actually faces
Plot.dot([{e: eStar, C: 1 + k * eStar * eStar}],
{x: "e", y: "C", r: 5, fill: "#C53030", stroke: "white", strokeWidth: 2}),
Plot.dot([{e: eMshown, C: 1 + k * (1 - theta) * eMshown * eMshown}],
{x: "e", y: "C", r: 5, fill: "#2D3748", stroke: "white", strokeWidth: 2}),
// Curve labels
Plot.text([{x: emax * 0.78, y: 1 + k * (emax * 0.78) * (emax * 0.78), label: "Bez osiguranja"}],
{x: "x", y: "y", text: "label", fill: "#C53030", fontSize: 12, fontWeight: 700,
dy: -10, textAnchor: "end"}),
Plot.text([{x: emax * 0.88, y: 1 + k * (1 - theta) * (emax * 0.88) * (emax * 0.88),
label: "S osiguranjem (moralni hazard)"}],
{x: "x", y: "y", text: "label", fill: "#2D3748", fontSize: 12, fontWeight: 700,
dy: -10, textAnchor: "end"}),
// x-axis labels for e* and eM
Plot.text([{x: eStar, y: 0.4, label: `e* = ${eStar.toFixed(2)}`}],
{x: "x", y: "y", text: "label", textAnchor: "middle", fontSize: 11, fill: "#C53030"}),
Plot.text([{x: eMshown, y: 0.4, label: `e_M = ${eM.toFixed(2)}`}],
{x: "x", y: "y", text: "label", textAnchor: "middle", fontSize: 11, fill: "#2D3748"}),
// Top readouts
Plot.text([{x: 0.2, y: Cmax * 0.97,
label: `Porast rizika: e_M − e* = ${(eM - eStar).toFixed(2)} (+${(((eM - eStar) / eStar) * 100).toFixed(0)} %)`}],
{x: "x", y: "y", text: "label", textAnchor: "start",
fontSize: 14, fill: "#2D3748", fontWeight: 700}),
Plot.text([{x: 0.2, y: Cmax * 0.91,
label: `Neefikasnost (gubitak blagostanja) = ${dwl.toFixed(2)}`}],
{x: "x", y: "y", text: "label", textAnchor: "start",
fontSize: 13, fill: "#C53030", fontWeight: 600})
]
});
}
```
## Tržišna moć i monopol
Idealno tržište podrazumijeva postojanje velikog broja proizvođača i potrošača, pri čemu nijedan pojedinačni akter nema značajan utjecaj na cijenu. Međutim, u stvarnosti često dolazi do koncentracije tržišne moći. Kada jedno poduzeće ili mali broj poduzeća dominira tržištem, govorimo o monopolu ili oligopolu.
Poduzeća s tržišnom moći mogu povećavati cijene iznad konkurentske razine, smanjivati kvalitetu proizvoda ili usporavati inovacije. Takvo ponašanje dovodi do neefikasne alokacije resursa i smanjenja društvenog blagostanja.
Zbog toga države provode antimonopolsku politiku i regulaciju tržišta s ciljem očuvanja konkurencije i sprječavanja zlouporabe tržišne moći. U nekim sektorima, poput energetike ili telekomunikacija, priroda proizvodnje dovodi do postojanja prirodnih monopola. U takvim slučajevima država često regulira cijene i uvjete poslovanja kako bi zaštitila potrošače [@musgrave1989; @gruber2019].
### Interaktivni prikaz: monopol i gubitak blagostanja
Monopolist određuje količinu na razini gdje se **marginalni prihod (MR)** izjednačava s **marginalnim troškom (MC)**, a zatim postavlja cijenu prema krivulji potražnje D. Rezultat je niža količina Q~M~ i viša cijena P~M~ u odnosu na konkurentsku ravnotežu (Q~C~, P~C~), gdje bi D sjekao MC. Osjenčani trokut između Q~M~ i Q~C~ predstavlja **gubitak blagostanja** (*deadweight loss*) zbog tržišne moći.
```{ojs}
//| echo: false
viewof mon_controls = Inputs.form({
eps_d_mon: Inputs.range([0.5, 3.0], {value: 1.2, step: 0.05, label: "Elastičnost potražnje |εD|:"}),
eps_s_mon: Inputs.range([0.4, 3.0], {value: 1.2, step: 0.05, label: "Elastičnost MC (εS):"})
})
```
```{ojs}
//| echo: false
eps_d_mon = mon_controls.eps_d_mon
```
```{ojs}
//| echo: false
eps_s_mon = mon_controls.eps_s_mon
```
```{ojs}
//| echo: false
{
// Anchor competitive equilibrium at (Qc, Pc) = (60, 50)
const Qc = 60;
const Pc = 50;
const Qmax = 110;
const Pmax = 120;
// Slopes from elasticities at competitive equilibrium
const b = Pc / (Qc * eps_d_mon); // demand slope
const d = Pc / (Qc * eps_s_mon); // MC slope
// Demand: P = a - b*Q, at (Qc, Pc): a = Pc + b*Qc
const a = Pc + b * Qc;
// MC: P = c + d*Q, at (Qc, Pc): c = Pc - d*Qc
const c = Pc - d * Qc;
// Monopoly: MR = MC => a - 2b*Qm = c + d*Qm => Qm = (a - c)/(2b + d)
const Qm = (a - c) / (2 * b + d);
const Pm = a - b * Qm; // monopoly price (on demand curve)
const MC_at_Qm = c + d * Qm; // marginal cost at Qm
const Qs = d3.range(0, Qmax + 1);
const demand = Qs.map(q => ({Q: q, P: a - b * q}))
.filter(p => p.P >= 0 && p.P <= Pmax);
const mr = Qs.map(q => ({Q: q, P: a - 2 * b * q}))
.filter(p => p.P >= -Pmax && p.P <= Pmax);
const mc = Qs.map(q => ({Q: q, P: c + d * q}))
.filter(p => p.P >= 0 && p.P <= Pmax);
// DWL triangle: vertices (Qm, Pm), (Qm, MC_at_Qm), (Qc, Pc)
const dwlTri = [
{Q: Qm, P: Pm},
{Q: Qm, P: MC_at_Qm},
{Q: Qc, P: Pc}
];
const dwl = 0.5 * Math.abs(Pm - MC_at_Qm) * Math.abs(Qc - Qm);
const markup = ((Pm - Pc) / Pc) * 100;
return Plot.plot({
width: 760,
height: 500,
marginLeft: 65,
marginBottom: 55,
style: {fontSize: "12px", fontFamily: "Roboto, system-ui, sans-serif", color: "#4A5568"},
x: {label: "Količina (Q) →", domain: [0, Qmax], grid: false},
y: {label: "↑ Cijena (P)", domain: [0, Pmax], grid: true},
marks: [
Plot.ruleY([0], {stroke: "#CBD5E0"}),
// DWL triangle (shaded)
Plot.line([...dwlTri, dwlTri[0]],
{x: "Q", y: "P", stroke: "#C53030", strokeWidth: 1,
fill: "#FEB2B2", fillOpacity: 0.65, curve: "linear"}),
// Curves
Plot.line(demand, {x: "Q", y: "P", stroke: "#1f77b4", strokeWidth: 2.5}),
Plot.line(mr, {x: "Q", y: "P", stroke: "#805AD5", strokeWidth: 2, strokeDasharray: "5,4"}),
Plot.line(mc, {x: "Q", y: "P", stroke: "#2ca02c", strokeWidth: 2}),
// Dashed guides for prices and quantities
Plot.ruleY([Pm], {stroke: "#A0AEC0", strokeDasharray: "4,3"}),
Plot.ruleY([Pc], {stroke: "#A0AEC0", strokeDasharray: "4,3"}),
Plot.ruleX([Qm], {y1: 0, y2: Pm, stroke: "#A0AEC0", strokeDasharray: "4,3"}),
Plot.ruleX([Qc], {y1: 0, y2: Pc, stroke: "#A0AEC0", strokeDasharray: "4,3"}),
// Equilibrium dots
Plot.dot([{Q: Qm, P: Pm}],
{x: "Q", y: "P", r: 5, fill: "#C53030", stroke: "white", strokeWidth: 2}),
Plot.dot([{Q: Qc, P: Pc}],
{x: "Q", y: "P", r: 5, fill: "#2ca02c", stroke: "white", strokeWidth: 2}),
Plot.dot([{Q: Qm, P: MC_at_Qm}],
{x: "Q", y: "P", r: 4, fill: "#2D3748", stroke: "white", strokeWidth: 1.5}),
// Curve labels
Plot.text([{x: Qmax * 0.82, y: a - b * Qmax * 0.82, label: `D (|εD|=${eps_d_mon.toFixed(2)})`}],
{x: "x", y: "y", text: "label", fill: "#1f77b4", fontSize: 12, fontWeight: 600, dy: -8}),
Plot.text([{x: Qmax * 0.42, y: a - 2 * b * Qmax * 0.42, label: "MR"}],
{x: "x", y: "y", text: "label", fill: "#805AD5", fontSize: 12, fontWeight: 700, dy: -8}),
Plot.text([{x: Qmax * 0.82, y: c + d * Qmax * 0.82, label: `MC (εS=${eps_s_mon.toFixed(2)})`}],
{x: "x", y: "y", text: "label", fill: "#2ca02c", fontSize: 12, fontWeight: 600, dy: -8}),
// Price & quantity labels
Plot.text([{x: 1, y: Pm, label: `P_M = ${Pm.toFixed(1)}`}],
{x: "x", y: "y", text: "label", textAnchor: "start", dy: -7, fontSize: 11, fill: "#C53030"}),
Plot.text([{x: 1, y: Pc, label: `P_C = ${Pc.toFixed(1)}`}],
{x: "x", y: "y", text: "label", textAnchor: "start", dy: 12, fontSize: 11, fill: "#2ca02c"}),
Plot.text([{x: Qm, y: 2, label: `Q_M = ${Qm.toFixed(1)}`}],
{x: "x", y: "y", text: "label", textAnchor: "middle", fontSize: 11, fill: "#C53030"}),
Plot.text([{x: Qc, y: 2, label: `Q_C = ${Qc.toFixed(1)}`}],
{x: "x", y: "y", text: "label", textAnchor: "middle", fontSize: 11, fill: "#2ca02c"}),
// Top readouts
Plot.text([{x: 2, y: Pmax * 0.97,
label: `Gubitak blagostanja (DWL) = ${dwl.toFixed(1)}`}],
{x: "x", y: "y", text: "label", textAnchor: "start",
fontSize: 14, fill: "#C53030", fontWeight: 700}),
Plot.text([{x: 2, y: Pmax * 0.91,
label: `Monopolska marža: ${markup.toFixed(0)} %`}],
{x: "x", y: "y", text: "label", textAnchor: "start",
fontSize: 13, fill: "#2D3748", fontWeight: 600})
]
});
}
```
## Meritorna dobra
Uz tržišne neuspjehe u tehničkom smislu, postoji i kategorija **meritornih dobara** — dobara za koja društvo smatra da bi se trebala konzumirati više nego što bi tržište samo po sebi osiguralo, bez obzira na individualne preferencije. Primjeri uključuju osnovno obrazovanje, zdravstvenu zaštitu i kulturu. Nasuprot tome, **demeritornim dobrima** (poput alkohola ili duhana) društvo želi ograničiti potrošnju.
Država intervenira u oba slučaja: subvencijama i obveznim pružanjem meritornih dobara, te porezima i regulacijom za demeritornih dobara [@musgrave1959].
## Odnos efikasnosti i pravednosti
Čak i kada tržište funkcionira efikasno — bez ikakvih tržišnih neuspjeha — raspodjela dohotka i bogatstva koja iz njega proizlazi ne mora biti društveno prihvatljiva. Tržište raspodjeljuje dohodak prema produktivnosti, obrazovanju i vlasništvu nad resursima. Takva raspodjela može biti ekonomski efikasna, ali rezultirati značajnim nejednakostima koje imaju negativne društvene posljedice: smanjene mogućnosti za obrazovanje, lošije zdravstvene ishode i smanjenu društvenu mobilnost.
Upravo tu nastaje temeljna napetost između **efikasnosti** i **pravednosti** u javnim politikama. Redistributivne mjere — progresivno oporezivanje, socijalni transferi i javne usluge poput obrazovanja i zdravstva — mogu smanjiti nejednakosti, ali ponekad uz određene troškove u smislu ekonomskih poticaja. Pronalaženje ravnoteže između ta dva cilja jedno je od središnjih pitanja javnih financija [@musgrave1989; @atkinson1980].