Code
import numpy as np
from scipy.optimize import differential_evolution
import matplotlib.pyplot as pltSebastian Sanchez
March 1, 2026
Turbine layout optimisation is a non-convex problem — gradient-free methods like differential evolution handle it well. We minimise wake losses by repositioning turbines within a rectangular boundary.
A simplified AEP proxy — we penalise turbine pairs that are too close and aligned with the wind.
D = 126 # rotor diameter (m)
n_turbines = 6
def wake_penalty(positions):
x = positions[:n_turbines]
y = positions[n_turbines:]
penalty = 0.0
for i in range(n_turbines):
for j in range(n_turbines):
if i == j:
continue
dx = x[j] - x[i]
dy = y[j] - y[i]
if dx > 0 and abs(dy) < D:
penalty += max(0, 1 - dx / (5 * D))
return penaltyDifferential evolution finds layouts that spread turbines perpendicular to the prevailing wind, reducing wake overlap and increasing total AEP.