← All posts

Optimising Turbine Layout with Gradient-Free Methods

python
optimization
wake-modelling
Maximising AEP by optimising turbine positions using scipy’s differential evolution.
Author

Sebastian Sanchez

Published

March 1, 2026

Introduction

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.

Code
import numpy as np
from scipy.optimize import differential_evolution
import matplotlib.pyplot as plt

Objective function

A simplified AEP proxy — we penalise turbine pairs that are too close and aligned with the wind.

Code
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 penalty
Code
bounds = [(0, 3000)] * n_turbines + [(0, 2000)] * n_turbines
result = differential_evolution(wake_penalty, bounds, seed=42, maxiter=200)
print(f'Optimised penalty: {result.fun:.4f}')

Conclusion

Differential evolution finds layouts that spread turbines perpendicular to the prevailing wind, reducing wake overlap and increasing total AEP.