The idea
A heat pump costs more to install and usually less to run, and both
halves of that trade are uncertain: energy prices move, winters differ,
quotes differ. Rather than pick one value for each and report a single
answer, the model draws a whole distribution and shows you where your
case is likely to land.
It runs your home through one simulated year of daily weather at a
time, over your chosen horizon, and repeats that for hundreds of
possible futures. What you see are percentiles: the middle line is the
median outcome, the band around it the 25th–75th (and 10th–90th)
percentile of those futures.
Step 1 — How much heat your home needs
Annual space-heat demand is spread across the 365 days in proportion to
each day's heating degree-days, so January carries far
more of it than April:
HDD(day) = max(0, Tbase − Toutdoor(day))
demand(day) = annual demand × HDD(day) / Σ HDD
Tbase is the outdoor temperature below which the house starts
needing heat, and it depends on how well insulated it is: 18 °C for a poorly insulated home down to 13.5 °C
for a very well insulated one. A colder-than-average year raises the
annual total too, not just its shape, by the ratio of that year's
realised HDD to the long-run mean.
If you enter floor area instead of a measured demand, the estimate is
area × a national kWh/m² figure (85
kWh/m² for Netherlands) × dwelling shape × insulation × wind
exposure, then rescaled by your province's
degree-days relative to the reference one. Hot water is
800 kWh per person per year, spread evenly.
Step 2 — How efficiently the heat pump makes it
A heat pump's efficiency (its COP) falls as it gets colder outside and as the water it has to produce
gets hotter. The model uses the Carnot-fraction method:
take the rated COP, work out what fraction of the thermodynamic limit
it represents at its rating conditions (7 °C outside, 35 °C flow — the
EN 14511 A7/W35 point), then hold that fraction fixed and apply it at
the actual temperatures.
COPcarnot(Tout, Tsupply) = Tsupply(K) / (Tsupply(K) − Tout(K))
ηsys = COPrated / COPcarnot(7, 35)
COP(day) = clamp(ηsys × COPcarnot(Tout(day),
Tsupply), COPmin, 8)
Below the backup threshold (−15 °C by default) the model switches to
resistive backup at COP 1.0. This is why your radiator choice matters so
much: at 55 °C flow the same machine delivers materially less heat per
kWh than at 35 °C, all winter long.
electricity(day) = heat(day) / COP(day) · gas(day) = heat(day) / ηboiler
Step 3 — What that costs
Solar is settled once per day: what the array makes that day offsets
what the heat pump draws that day. The monthly shape of PV output comes
from PVGIS for your region — output is strongly anti-correlated with
heat demand, so spreading it evenly across the year would hand the heat
pump December sun it cannot have.
The array is yours either way, so what changes when you switch is not
the export income but the part of it you give up: sunshine the heat
pump eats is sunshine you no longer sell. Self-consumed solar is
therefore charged at your effective export price — its opportunity
cost — rather than credited, which is the same arithmetic seen from
the side that actually changes.
cost(day) = grid import × pelec + self-consumed solar × pexport
Gas is entered in Netherlands's billing unit (m³) and
converted to a per-kWh price at the boundary (9.769 kWh per m³, gross calorific value). The gas standing charge is a real cost of keeping the
connection, so it is charged in the gas scenario and avoided in the heat
pump scenario unless you tick "keep gas connection". The electricity
standing charge is paid either way and cancels, so only a heat-pump
specific extra is modelled.
Both fuels can carry a carbon price, and operating costs are discounted
back to today in real terms:
PV(year) = cost(year) / (1 + r)year
Capital costs land at year 0: heat-pump installation minus the grant
you qualify for, against whatever the gas option costs you at the same
moment. That second figure is yours to set. If your boiler is at the
end of its life, it is the price of the replacement you would have
bought anyway, and only the difference is really being spent on the
heat pump. If your boiler is fine and you simply want a heat pump, it
is zero, and the heat pump carries its whole price.
Step 4 — Where the uncertainty comes from
Five things are drawn rather than assumed:
- Weather — each simulated day is a draw around that
calendar day's climatological mean, combining a month-wide anomaly
(this winter is mild) with day-to-day noise (this Tuesday is cold).
The two spreads are estimated separately so the warm-winter signal is
not counted twice.
- Starting prices — gas and electricity each start from
a spread set by your volatility inputs.
- Price paths — each year's escalation is the rate you
entered plus noise, compounded, floored at zero. The noise is derived
from the same volatility input, scaled so the default 10% gives about
one percentage point a year: a calibration, not an estimate from
market data. Gas and electricity are drawn independently, which real
tariffs are not — gas often sets the marginal price of power — so the
band on the gap between the two is wider than history would
suggest.
- Installation cost — normal around your figure with
your stated spread. Where the grant is a capped percentage it absorbs
part of any overrun, which narrows your net exposure; the model
integrates over that kink rather than linearising at the mean.
- Demand — a behavioural spread on top of the
weather-driven one, because two households in the same house heat it
differently.
Two engines, one model. As you type, an analytic
error-propagation engine updates the picture instantly by tracking means
and variances in closed form. Pressing "Run probabilistic full
sensitivity" runs the real Monte Carlo — every day of every year of
every run — in a background worker. The two are held to within about 7%
of each other by a test suite; the preview is for exploring, the full
run is the number to quote.
The Monte Carlo is deliberately unseeded: re-running the same scenario
should not show you one fixed pseudo-random future.
What the percentiles are, and are not. They are the
spread of futures this model generates from the assumptions on the
left — a scenario range, not a calibrated forecast. The weather
distribution is measured from decades of daily observations and is
worth reading as a probability. The price distributions are not:
nobody has fitted them to historical household tariffs, and over a
twenty-year horizon they carry most of the width. Read "10% of futures"
as "10% of the futures this model draws", and change the escalation
rates yourself to see how little of the answer survives them.
Where the numbers come from — Netherlands
Defaults change with the country you select, and a few change with the
region: devolved grants, and — in Northern Ireland, the Azores and
Madeira, which are separate energy systems — the tariffs and emission
factors themselves. Weather for your current selection: KNMI daggegevens TG (1991-2025).
Every gas figure is on the gross calorific value
(HHV / bovenwaarde / Brennwert / PCS), which is what every country here
bills households on. Most published emission factors outside the UK are
net-basis and about 11% higher; each one here records the published
value and the conversion applied. Grid emission factors are on a delivered basis — the published generation figure
divided by (1 − transmission and distribution losses), since your meter
reads what arrives, not what was generated.
Two defaults are deliberately not in that table. The
annual increases for gas and electricity carry no source, in any
country, because none exists: no publisher forecasts household gas
against household electricity over a twenty-year horizon, and a
citation invented for them would be worth less than saying so. They
are set on the direction of stated energy-tax policy — every country
here is shifting the burden from electricity onto gas — and they are a
scenario you are meant to change, not a prediction.
This matters more than its size suggests. The result depends on the gap between the two rates rather than on either one, and where
the running-cost saving is thin that gap can decide the answer by
itself: on the Belgian defaults, closing it from two points to nothing
— leaving general energy inflation exactly where it was — turns a
€2,134 twenty-year saving into a €4,614 loss and removes payback
altogether. The "What moves the answer" chart puts a bar on
exactly this, measured on your own numbers.
What this model does not do
- Grid carbon intensity is held flat over the horizon. Every grid here
is decarbonising, so the heat pump's emissions advantage is
understated — the largest known bias in the CO₂ figures.
- Weather is a historical climatology with no warming trend, so both
systems are given slightly colder decades than they will get. That
overstates heating demand on both sides, which scales the running-cost
difference without changing its sign: where the heat pump delivers
heat more cheaply the extra cold overstates your saving, and where it
does not — a poor COP against cheap gas — it overstates the loss.
Standing charges and installation costs do not move either way. It
also uses one reference point per region — which understates the
spread where
elevation varies a lot (Bayern, Scotland, the Portuguese interior)
and where the reanalysis grid is coarser than the land (Madeira and
the Azores, sampled at Funchal and Ponta Delgada).
- Solar is settled daily, not hourly, so midday output still offsets
evening draw. Self-consumption is therefore somewhat optimistic.
- Equipment is installed once and never wears out. The
gas side books a single boiler replacement, on the date you give it;
the heat pump is bought once and then runs for the whole horizon
without replacement, degradation or major repair, and there is no
second boiler either. Both machines are generally quoted at 15–20
years, so past about 20 — and the horizon input
goes to 50 — both sides are running on
equipment that would have been bought again. The missing heat pump
favours the heat pump and the missing second boiler favours gas;
which dominates depends on the replacement dates, the two costs and
the discount rate, so a long horizon is not wrong in a direction you
can correct for by eye. No financing costs either.
- Insulation labels are calibrated on Dutch housing stock; "Average"
means something different in a British, German or Portuguese home.
- Grants are modelled at their base rate. Conditional bonuses (Germany's
climate-speed bonus, France's income banding) are yours to raise.
- It is not advice. Check the prices, the grant and the installation
quote against your own bills and your own installer before deciding.