Gradient estimation for wind turbine control, and five things nobody has settled
Robot Control Lab · Systems Engineering · UT Dallas
Region 3: above rated
There is more wind than the machine can use. Throw the excess away and hold rated power. A setpoint, an error signal and a PI controller.
Region 2: below rated
Take everything the wind offers. There is no setpoint, only an efficiency to maximize. This is the only regime containing an extremum to seek.
The rotor’s efficiency depends on one number, the tip-speed ratio \(\lambda = R\Omega/V\), which is blade tip speed divided by wind speed. Hold \(\lambda\) at \(\lambda^\star\) and you capture the most power available.
Both coordinates of the hill are written in terms of \(V\), the wind speed actually reaching the rotor, which is exactly what a turbine cannot measure.
How the controller finds the peak without measuring where it is.
The generator is commanded to resist the rotor with a torque quadratic in speed,
\[\tau_{\text{gen}} = k\,\Omega^2 .\]
Balance it against the aerodynamic torque \(T_{\text{aero}} = \tfrac12\rho\pi R^3V^2\,C_Q(\lambda)\), with \(C_Q = C_P/\lambda\), and the equilibrium condition is
\[\boxed{\ \frac{C_P(\lambda)}{\lambda^3} \;=\; \frac{2k}{\rho\pi R^5}\ }\]
The wind speed cancels. Try \(\tau_{\text{gen}} = k\Omega^n\) and you get \(C_Q(\lambda)/\lambda^{n} \propto V^{\,n-2}\). Only \(n = 2\) removes \(V\), so it is the unique exponent for which the equilibrium tip-speed ratio does not depend on the wind.
The equilibrium of the rotor equation is a ray, not a point. Every wind speed gets its own \(\Omega\); all of them share the same \(\lambda\). The controller never rejects the wind. It makes the desired behaviour an attracting manifold and lets the wind slide the machine along it.
What we have
A single scalar knob \(k\), and a monotone map from \(k\) to the tip-speed ratio the machine settles at.
What we want
The \(k\) that lands us on the peak. The factory value is wrong at commissioning and gets worse as the blades age.
Find the maximum of a function you cannot evaluate, by turning a knob and watching a noisy meter. That is extremum seeking control, and it is what the last decade of work at UTD has been about.
Estimate a derivative you cannot measure by wiggling the input.
Add a slow sinusoid \(a\sin\omega t\) to the knob. If the output wiggles in phase, you are on the uphill side; out of phase, the downhill side. Multiply and average, and what survives is proportional to the slope.
Power is proportional to the cube of the wind speed, so the gradient of power is too, and the wind varies by 3:1 across Region 2. A loop tuned at 8 m/s is 27 times too slow at 4 m/s and 27 times too aggressive at 12 m/s.
Rotea’s 2017 observation is one line. Since \(\ln P = \ln(\tfrac12\rho A) + 3\ln V + \ln C_P(u)\), and the wind term does not depend on \(u\):
\[\frac{\partial \ln P}{\partial u} \;=\; \frac{1}{C_P}\frac{\partial C_P}{\partial u}\]
Feed the algorithm \(\ln P\) instead of \(P\) and the loop bandwidth becomes \(\nu_c = (\kappa/C_P^{\max})\,|\partial^2 C_P/\partial u^2|\), free of both the wind speed and the air density. Tune it once; it works everywhere.
Ciri, Leonardi & Rotea 2019
Large-eddy simulation of the full flow around an NREL 5 MW rotor, with shear and 10% turbulence. No analytic gradient anywhere.
The result
Log-power holds 8 minutes across a 3:1 wind range. Plain ESC is four times slower at the bottom and goes unstable at the top.
Replace demodulation with recursive least squares on \(\dot y = \theta_0 + \theta_1(u-\hat u)\) and add a proportional term. The gradient \(\theta_1\) now comes with a covariance matrix \(\Sigma\) that the algorithm already propagates, and that none of these papers reports.
Solved
Consistency across wind speed. The logarithm removes the \(V^3\) dependence exactly, in theory, in LES, and in the tunnel.
Solved
Speed. LP-PIESC converges fast enough that the search costs 0.3% of energy rather than 14%.
Not solved
Everything to do with noise. “The enemy is process noise”, and none of these papers reports a variance.
Extremum seeking works well when the process noise is negligible. Otherwise you must average, and averaging costs convergence time. That trade-off has not been quantified for this problem.
Each one is a well-posed question with an answer somebody could get.
In the 2019 LES, both algorithms converge to \(\bar\lambda \approx 7.85\) against a design value of \(7.5\), at every wind speed, in every condition. The paper calls this “close to the ideal optimum” and moves on.
\(3\ln V\) is independent of the knob, so it vanishes from the gradient exactly. It does not vanish from any finite-time estimate of that gradient, and it is fifteen times larger than the signal.
A central difference estimates \(J'(q) + \tfrac{a^2}{6}J'''(q)\), so its zero sits off the true optimum by \(-\tfrac{a^2}{6}\,J'''/J''\). Bigger dither, less noise, more bias. There is an optimal \(a\), and both published values were chosen by trial and error.
The 2017 model is first order: \(\dot{\tilde u} = -\omega_c\tilde u\). It cannot go unstable for any positive gain. The LES did, twice: in uniform flow and in turbulence.
The rotor equation is \(I\dot\Omega = T_{\text{aero}} - \tau_{\text{gen}}\). Every term on the right is known: \(\tau_{\text{gen}}\) is commanded, \(\Omega\) is measured, and \(I\) is a design constant. So
\[T_{\text{aero}}(t) \;=\; I\dot\Omega(t) + \tau_{\text{gen}}(t)\]
is exactly reconstructible without any anemometer. And turbulence already swings \(\lambda\) between 6 and 8.5 all day long, for free.
The dither exists because the excitation is unknown, not because excitation is lacking. So: are \(V(t)\) and the curve \(C_Q(\cdot)\) jointly identifiable from the record of \((\Omega,\,T_{\text{aero}})\) alone?
Substituting \(\tilde V = cV\) into \(T_{\text{aero}} = \tfrac12\rho\pi R^3V^2C_Q(R\Omega/V)\):
\[\tilde C_Q(x) = \frac{C_Q(cx)}{c^2} \quad\Longrightarrow\quad \tilde C_P(x) = \frac{C_P(cx)}{c^3} \quad\Longrightarrow\quad \tilde\lambda^\star = \frac{\lambda^\star}{c}\]
There is one unidentifiable direction, an overall scaling of the wind, and it maps straight onto a scaling of \(\lambda^\star\). Everything else about the curve is determined. Air density errors, by contrast, scale \(C_P\) uniformly and do not move the peak.
Look again at the 2017 result:
\[\nu_c \;=\; \frac{\kappa}{C_P^{\max}}\left|\frac{\partial^2 C_P}{\partial u^2}(u_o)\right|\]
Choosing the gain \(\kappa\) to hit a target settling time requires the curvature at the peak, currently taken from a design curve that the LES says is wrong by 10% in \(C_P\). The gain calibration is not self-consistent, and “it takes too long to tune” is partly a symptom of that.
The curvature also sets the terminal scatter, \(\sigma_\lambda \approx \sigma_{\hat g}/|H|\), and the energy lost to mistuning is quadratic in \(\sigma_\lambda\). The same number sets the gain, the achievable accuracy and the cost of missing.
Meyn does not estimate the Hessian in the ESC papers. It appears in the analysis, as the matrix \(A = \nabla^2\Gamma(\theta^\star)\) governing the asymptotic covariance. Where he does estimate it, in Zap SA, it is a two-timescale recursive Jacobian estimate used as a matrix gain: stochastic Newton-Raphson.
Given a turbulence spectrum, an observation time and a fatigue budget, how well can anyone locate \(\lambda^\star\)? Nobody has written the bound down.
In classical stochastic approximation
Noise is pure nuisance. It corrupts the measurement and you average it away.
Here
Turbulence is simultaneously the noise and the excitation. It is what corrupts the gradient estimate and what sweeps the rotor across the curve for free.
That duality is what the stochastic-approximation literature does not cover, and it is what makes Q3, estimating the curve without probing it, plausible.
Take the existing simulation setup. Run it at two or three dither amplitudes, with several independent, non-repeating turbulence seeds. Look at where the torque gain lands.
If the offset scales as \(a^2\)
It is estimator bias. The algorithm is systematically missing the peak, and the fix is a known one.
If it is flat in \(a\)
The turbulent optimum has moved, and the published results have been scored against a reference that is off.
Either way the seed spread yields \(\sigma(\hat g)\) and \(\sigma_\lambda\), which none of these papers reports. Two outcomes, both publishable, a few days of compute.
The algorithms work. What is missing is the statistics of the quantity they compute.
What exists
A model-free loop, consistent across wind speed and fast enough to deploy, with results from large-eddy simulation, a wind tunnel and a field test.
What does not
A definition of the estimand, a variance for it, an account of the stability limit, a performance bound, and an answer on whether the dither is needed.
Rotea, IFAC 2017 · Ciri, Leonardi & Rotea, Wind Energy 2019 · Kumar & Rotea, Energies 2022 · Rotea et al., TORQUE 2024 · Lauand & Meyn, IEEE CSM 2023
Prepared for a collaboration with M. A. Rotea, UTD Wind Energy Center.
← Research Home · Wind Turbine Control