Forecast photovoltaic power: directly, or through irradiance?

To forecast the output of a photovoltaic (PV) plant, one can forecast its power directly, or first forecast the solar irradiance and then convert it into power. This page compares the three routes over 15 months of open measurements (the first half for training, the second for testing), with the same forecasting models. At a 1-hour horizon, with an ELM, the relative error (nRMSE) is 0.42 for PV direct, 0.43 through GTI, 0.49 starting from GHI. Each added step brings its own error; the page shows how much each one weighs.

PV directPV measuredmodelPV forecast
GTI → PVGTI measuredmodelGTI forecastCPV forecast
GHI → GTI → PVGHI measuredmodelGHI forecastTGTICPV forecast
T: transposition (from horizontal irradiance to the irradiance on the panels). C: conversion (from the irradiance on the panels to power).

What to remember

  • PV direct and GTI then PV are almost level: 0.76 kW against 0.79 kW RMSE (ELM, 1 h). The GTI → PV conversion, here a simple proportion, adds little error.
  • Starting from GHI adds one step, the transposition, and its error: 0.89 kW. In this route the transposition weighs 13% of the squared error, the GHI forecast 82%.
  • If the plant changes size, the irradiance routes only change Pc in the conversion; PV direct must work on the relative power P / Pc, otherwise its frozen model errs.
  • If the grid imposes a shutdown, the irradiance keeps no trace of it; PV direct keeps zeros in its 24 h of inputs and forecasts too low afterwards (0.98 kW against 0.57 kW). Dividing by the available power and masking the zero hours fixes it (0.62 kW).

The data, the plant and the two physical steps

SOLETE and Risø. SOLETE is the name of the dataset; Risø is the place of measurement, a campus of the Technical University of Denmark (DTU) near Roskilde. The dataset, published openly by D. V. Pombo (CC BY 4.0 licence), measures at the same place the GHI, the GTI and the power of a small PV plant, from June 2018 to September 2019. It therefore allows the three routes to be compared at the same instants.

The plant and its peak power Pc. Pc is the power the panels deliver under standard test conditions: an irradiance of 1000 W/m² and cells at 25 °C. Here Pc = 7.44 kWp (kilowatts peak): 36 modules of 165 W and 12 modules of 125 W. The inverter, which turns direct current into alternating current, is rated 10 kW.

Transposition T (GHI → GTI), the two simplest standard models. The model of Erbs et al. (1982) splits GHI into a direct part (DNI, the radiation coming straight from the sun) and a diffuse part (DHI, coming from the rest of the sky). The isotropic sky model of Liu and Jordan (1963) then projects both parts on the plane of the panels, assuming the diffuse light equal in every direction, and adds the light reflected by the ground. The tilt and orientation of the panels are not given with the data: they are fitted on the training half (53° tilt, orientation 196°, 180° being due south).

Conversion C (GTI → PV), the simplest model: the power is proportional to GTI, as in PVWatts (Dobos, 2014) without the temperature effect. The performance ratio PR = 0.92, fitted on the training half, gathers all the losses (inverter, cables, temperature, dust).

The two formulasGTI=DNIcosθ+DHI1+cosβ2+ρGHI1−cosβ2

θ is the angle between the sun and the normal to the panels, β the tilt of the panels, ρ = 0.2 the share of light sent back by the ground (albedo). DNI is counted perpendicular to the sun’s rays.

PV=PRPcGTI1000 W/m2

PV in kW, Pc in kWp, GTI in W/m². Computed with the pvlib library.

Try it: the three routes over the test period

Choose a model and a horizon: the table, the discs and the charts are recomputed. The default model is the ELM.

When the grid limits the power

The grid operator may impose a power limit, announced in advance or not. Choose the limit, the announcement, and how PV direct treats its inputs. The coloured band marks the curtailment; the solid line marks its start.

What the data show (ELM, 1 h)

  • Announced shutdown, PV direct in kW: after the curtailment, its inputs keep zeros for 24 h, and it forecasts too low: 0.98 kW RMSE after the curtailment, against 0.57 kW for GTI then PV.
  • PV direct divided by the available power: during a shutdown, this is a division by zero; 271 of 351 forecasts become impossible after the curtailment.
  • Tested proposal: divide by the announced available power and mask the zero hours (replaced by the value of the day before). No more division by zero, and PV direct returns to 0.62 kW after the curtailment. But with a 60% limit, the same division inflates the values that did not reach the limit: 1.16 kW during the curtailment, against 0.25 kW without division.
  • Irradiance routes: their inputs do not see the curtailment; they adjust through the peak power and the announced set-point.
  • Not announced: no route knows the limit; only PV direct sees the drop in its last value, once the curtailment has started. During the curtailment, the most accurate route is PV direct (2.53 kW; PV direct 2.53, GTI then PV 5.17).
Theory: how the error propagates and adds up

Notation: PV is the measured power, GHI and GTI the measured irradiances; a hat denotes a forecast (for instance GHI hat, the forecast GHI). T is the transposition (GHI → GTI), C the conversion (GTI → PV). The final error is e=PV^−PV. In the route GHI then GTI then PV:

PV^=C(T(GHI^))

Adding and removing the same quantities, the final error becomes exactly the sum of three stage errors, all in kW: e₁ comes from the GHI forecast, e₂ from the transposition (applied to the measured GHI), e₃ from the conversion (applied to the measured GTI).

e=C(T(GHI^))−C(T(GHI))⏟e1 forecast+C(T(GHI))−C(GTI)⏟e2 transposition+C(GTI)−PV⏟e3 conversion

On average over the test period (the brackets ⟨ ⟩ denote a mean), the final squared error is the sum of the squared errors of the stages, plus cross terms:

⟨e2⟩=⟨e12⟩+⟨e22⟩+⟨e32⟩+2(⟨e1e2⟩+⟨e1e3⟩+⟨e2e3⟩)

If the mean product of the errors from each pair of stages is zero over the evaluation period, the cross terms vanish and the squared RMSEs add up. Independence alone is not enough when errors are biased.

RMSE≈RMSE12+RMSE22+RMSE32

The GTI then PV route has only two stages (GTI forecast, conversion); PV direct has one. As the conversion is a simple proportion, it multiplies the forecast error by a fixed factor; the transposition amplifies it when the sun is low in front of tilted panels:

C(GTI)=PRPcGTI1000⟹e1=PRPc1000(T(GHI^)−T(GHI))

The disc shows each stage’s share si of the sum of stage squared errors, before cross terms. The text below gives ρ separately, the relative contribution of the cross terms:

si=⟨ei2⟩∑j⟨ej2⟩,ρ=⟨e2⟩−∑j⟨ej2⟩⟨e2⟩

Example (ELM, 1 h, peak power unchanged): stage RMSEs 0.931, 0.376 and 0.212 kW; final RMSE 0.894 kW; ρ = -0.32, negative: the stage errors partly cancel.

The error measures, with epers the error of persistence of PV at the same horizon:

nRMSE=⟨e2⟩⟨PV⟩,NICEk=(⟨|e|k⟩)1/k(⟨|epers|k⟩)1/k,k=1,2,3

Change of peak power: PV direct can work on the relative power x, then return to kW.

x=PVPc,PV^=Pcx^

Curtailment, with s the allowed share of Pc and A the available power: a forecast that knows the announcement is capped at A; the variant "divided by the available power" replaces Pc by A in the division, which divides by 0 when s = 0.

A={sPcduring the curtailmentPcotherwise,PV^←min(PV^,A),x=PVAPc
Protocol and limits

Data. SOLETE, version 3 (D. V. Pombo, DTU), CC BY 4.0 licence, measured at Risø (55.69° N, 12.10° E). The 5-minute file is averaged here to 30-minute steps, in UTC. The solar-elevation column of the file is one hour off; the sun position is recomputed with pvlib.

Frozen training. Every model, the transposition and the conversion are fitted once on the first half (1 June 2018 – 14 January 2019), like the 50/50 split of PV_ELM_pred, then evaluated without refitting on the second (15 January – 31 August 2019), at daytime (sun above the horizon). Forecasts are set to 0 at night and bounded below by 0.

Models. Those of the published PV_ELM_pred code, imported without change: persistence, BLEND, least-squares autoregression, ridge-regularised ELM (500 neurons, 100 draws, temporal cross-validation). Inputs: 48 past values (24 h), standardised with the training statistics, and the hour and day of the year at the target time (sines and cosines), as in PV_ELM_pred.

Live computation. The forecasts are computed in Python and rounded to 10 W; the page recomputes all the errors in your browser.

Limits. One plant, one climate; a deliberately simple transposition and conversion, fitted on the same data. The conversion ignores module temperature. Curtailments simulated on 8 sunny days of summer 2019, at least 4 days apart. This is a teaching calculation on open data, not the result of an article.

The words of the page

PV
photovoltaic; PV also denotes the electric (AC) power produced by the plant, in kilowatts (kW).
Pc
the peak power: the power of the panels under 1000 W/m² and at 25 °C, 7.44 kWp here. The capacity scenario halves or doubles it.
GHI
Global Horizontal Irradiance: the solar irradiance received by a horizontal surface, in watts per square metre (W/m²). It is the quantity most often measured and forecast.
GTI
Global Tilted Irradiance: the irradiance received in the tilted plane of the panels, in W/m². This is what the panels convert into electricity.
Transposition T
the calculation from GHI to GTI (models of Erbs and of Liu and Jordan, see above).
Conversion C
the calculation from GTI to power: PV = PR × Pc × GTI / 1000, with PR = 0.92.
Horizon
the time between the last known measurement and the forecast time, here from 30 minutes to 6 hours, in 30-minute steps.
Training, test
the models are fitted once on the first half of the data (June 2018 to mid-January 2019), then evaluated, without refitting, on the second (mid-January to August 2019).
Persistence
copy the last known value. It is the minimal reference.
BLEND
a mix of persistence and of the value of the day before at the same time, with one weight per half hour of the day.
AR
autoregression: a weighted sum of the last 48 values (24 h) and of the hour and day of the year (as sines and cosines), with weights computed by least squares.
ELM
Extreme Learning Machine: a neural network with one hidden layer of 500 neurons drawn at random, of which only the output weights are computed. 100 draws are tried; the best is chosen by cross-validation in time. Same inputs as AR.
RMSE, nRMSE
RMSE is the root mean squared error, in kW; it weighs large errors more. nRMSE divides it by the mean measured output.
NICE¹, NICE², NICE³, NICEΣ
the error divided by that of persistence of the PV power, at the same times: NICE¹ for the mean absolute error, NICE² for RMSE, NICE³ for the cubic error, NICEΣ for their mean. Below 1, the forecast beats persistence; above, the page shows "> 1".
Curtailment
a power limit imposed on the plant (by the grid operator, for example), here from 10:00 to 14:00 UTC (Coordinated Universal Time, 12:00 to 16:00 Danish summer time).
Available power
the power the plant is allowed to produce: Pc normally, the announced limit during curtailment.

Going further: compare forecasts against horizon · the NICE metrics · BLEND weights · the solar forecasting course.

Data, code and references

Data: D. V. Pombo, O. Gehrke, H. W. Bindner, SOLETE, Data in Brief 42 (2022) 108046; dataset doi:10.11583/DTU.17040767, licence CC BY 4.0. Models: PV_ELM_pred (Zenodo), MIT licence. Metrics: NICEk. Transposition: Erbs et al., Solar Energy 28 (1982) 293 and Liu and Jordan, Solar Energy 7 (1963) 53, with pvlib. Conversion: Dobos, PVWatts Version 5 Manual, NREL (2014). Computations: work/pv_modes of this site.

Cite this page

APA

Voyant, C. (2026). Forecast PV power: direct, through GTI or through GHI. https://www.cyrilvoyant.com/tools/pv-forecasting-modes/

BibTeX — For a LaTeX report or thesis: the page, the dataset and the model code. In the text: \cite{voyant2026pvroutes}.

@misc{voyant2026pvroutes,
  author = {Voyant, Cyril},
  title = {Forecast PV power: direct, through GTI or through GHI},
  year = {2026},
  howpublished = {\url{https://www.cyrilvoyant.com/tools/pv-forecasting-modes/}},
  note = {Accessed [date]}
}

@misc{Pombo2023SOLETE,
  author = {Pombo, Daniel Vazquez},
  title = {The {SOLETE} dataset v3},
  year = {2023},
  publisher = {Technical University of Denmark},
  doi = {10.11583/DTU.17040767}
}

@article{Pombo2022SOLETE,
  author = {Pombo, Daniel Vazquez and Gehrke, Oliver and Bindner, Henrik W.},
  title = {{SOLETE}, a 15-month long holistic dataset including: Meteorology, co-located wind and solar {PV} power from Denmark with various resolutions},
  journal = {Data in Brief},
  year = {2022},
  volume = {42},
  pages = {108046},
  doi = {10.1016/j.dib.2022.108046}
}

@software{PV_ELM_pred,
  author = {Leiva, Martin and Silvani, Xavier and Notton, Gilles and Voyant, Cyril and Julien, Alan},
  title = {{PV\_ELM\_pred}},
  doi = {10.5281/zenodo.21487267},
  url = {https://github.com/cyrilvoyant/PV_ELM_pred}
}

Course archive (all versions) · Solar forecasting course (10.5281/zenodo.23620101).