<meta charset="utf-8" emacsmode="-*-markdown-*-"><link rel="shortcut icon" type="image/png" href="../compass-rose.png">
**Sailboat Racing Handicaps**
Published 2023-06-29; Updated 2024-05-20
The two autocalibrating handicap systems for mixed class racing are the Portsmouth Yardstick for dinghies, and Performance Handicap Racing Fleet (PHRF) for larger keelboats. Both of these are based on observed previous performance of boats and updated frequently. This article gives the equations needed for scoring races with them.
In each system, the Elapsed Time (ET) of a boat is the measured time at which they finish relative to their start, and the Corrected Time (CT) is the computed value based on their handicap that is used for determining ranking.
The Offshore Racing Congress Rule (ORCR) is a measurement based rule for fairly large sailboats and longer offshore races. I do not discuss it here.
Previous handicap systems such as IOR, IMS, and US DPN are now obsolete.
<script> // Boats at Conestoga, Cadboro Bay, and RVYC const common_boatarray = [ 'RS Zest', 'Topaz Uno Plus', 'Hartley H12 Racer', 'Enterprise', 'International 420', 'ILCA 6', 'Byte CII', 'Wayfarer', 'ILCA 7', 'Tasar', 'Laser Vago', 'RS Aero 7', 'RS Aero 9', 'Buccaneer 18', 'Fireball', '29er', 'VX One', 'Swift Solo', 'RS 800' ]; common_boatarray.sort(function (A, B) { return Portsmouth.handicap[B] - Portsmouth.handicap[A]; }); </script>The approximate conversions between PHRF, RYA Portsmouth Numbers, and US Dixie Portsmouth Numbers are below. The DPN to PN conversion is based on fitting a line to the handicaps for the same boats under the different systems, and could vary slightly depending on the year in which it is computed.
\begin{eqnarray} PHRF &=& 6 \times DPN - 330 \ DPN &=& \tfrac{1}{6} \times PHRF + 55 \ PN &=& \tfrac{100}{6} \times DPN - 462 \ PN &=& \tfrac{100}{36} \times PHRF - 1378 \ PHRF &=& \tfrac{36}{100} \times PN + 496 \end{eqnarray}
The PHRF handicap has units of seconds per nautical mile [s / NM]. A fast boat has a low or negative rating. A slow boat has a high, positive rating.
The difference between two boats' PHRF ratings is the expected difference in their sailing times per mile.
PHRFs happen to be calibrated such that almost all boats have a lower corrected time CT than elapsed time ET. That is, PHRF makes most boats virtually faster and is an advantage-based system.
For reference, here are some PHRFs for common boats. Note that these values are adjusted for different styles of racing, rigs, crew weight, etc. on specific boats.
Boat | PHRF ----------------|-------------: Farr 36 | 0 J/111 | 39 Dehler 30 | 45 Henderson 30 | 45 C+C 34 | 87 Jeanneau 36 Sun Fast | 93 Hunter 40 | 96 X-99 | 114 Jeanneau SO 349 | 120 Morgan 38 | 138 | Boat | PHRF ----------------|-------------: Beneteau 343 | 147 Swan 36 | 150 Catalina 34 | 150 Nonsuch 33 | 168 Island Packet 38 | 168 O'Day 31 | 171 J/22 | 177 Alberg 30 | 228 Rhodes 19 | 234 Catalina 22 | 276 |
There are two ways of applying PHRF. The race committee will choose one. These are Time-on-Distance, typically used for courses with a known length and average wind conditions, and Time-on-Time for other cases.
\begin{equation} CT = ET - \dfrac{PHRF}{L} \end{equation}
Where
\begin{equation} CT = ET \times \dfrac{k}{k - M + PHRF} \end{equation}
Where
The Portsmouth Number
PNs happen to be calibrated such that almost all boats have a higher corrected time CT than elapsed time ET. That is, PN makes most boats virtually slower and is a disadvantage-based system.
Popular midrange performance dinghies including 420, ILCA 7 (Laser),
Wayfarer, GP14, Hadron H2, RS200, RS Aero 7, and the Europe are all
relatively close to each other around
The corrected time CT for a boat with elapsed time ET and Portsmouth number PN is given by:
\begin{equation} CT = ET \times \dfrac{1000}{PN} \end{equation}
How much time do you need to beat another boat by to rank higher than it?
A faster boat f ranks higher in the race than a slower boat s if s finishes more than
\begin{equation} \Delta T > ET_f \left(\dfrac{PN_s}{PN_f} - 1\right) \end{equation}
seconds later. Conversely, boat s ranks higher if it finishes
less than
For example, in a race that a Laser 7 finishes in
In a pursuit race, the start times for each class are offset so that all boats should finish at the same time. This means that the rankings are based finish order and no correction is needed after the race.
Let
\begin{equation} \Delta T = ET_Z \times \left(1 - \dfrac{PN}{PN_Z}\right) \end{equation}
For example, in a pursuit race that an RS Zest will start at 14:30 (2:30 PM) and is expected to complete in 1.5 hours, the start times for the other boats should be:
<script> { let s = ` Class | PN | Start Adjustment | ±mm:ss | Start Time ---------|-----:|-----------:|--------:|----------: `; const ET_Z = 1.5 * secondsPerHour; const PN_Z = Portsmouth.handicap['RS Zest']; for (const boat of common_boatarray) { const PN = Portsmouth.handicap[boat]; const deltaT = ET_Z * (1 - PN / PN_Z); const startT = deltaT + 14.5 * secondsPerHour; s += `${boat} | ${PN} | ${formatTime(deltaT, 'delta s')} | ${formatTime(deltaT, 'delta m:ss')} | ${formatTime(startT, 'h:mm:ss')} \n`; } document.write(s); } </script>This should match your intuition. The RS 800
For the derivation, I shorten the standard notation to
The corrected times for the scratch boat
\begin{eqnarray} \label{eqn:CZ} C_Z &=& E_Z \dfrac{1000}{P_Z} \ C &=& E \dfrac{1000}{P} \ \end{eqnarray}
Our goal is for all boats to finish at the same wall clock time of day with staggered starts. That means for each boat
\begin{equation} E + \Delta T = E_Z \end{equation}
The elapsed time
\begin{eqnarray} \Delta T &=& E_Z - E \ E &=& C \dfrac{P}{1000} \ E_Z &=& C_Z \dfrac{P_Z}{1000} \ C &=& C_Z \end{eqnarray}
Substituting and simplifying provides the solution:
\begin{eqnarray} \Delta T &=& C_Z \dfrac{P_Z}{1000} - C_Z \dfrac{P}{1000}\ \Delta T &=& C_Z \dfrac{P_Z - P}{1000} \end{eqnarray}
We need this in terms of the actual elapsed time of the scratch boat,
\begin{eqnarray} \Delta T &=& E_Z \dfrac{1000}{P_Z} \dfrac{P_Z - P}{1000}\ \Delta T &=& E_Z \dfrac{P_Z - P}{P_Z}\ \Delta T &=& E_Z \left(1 - \dfrac{P}{P_Z}\right) \end{eqnarray}
<script> { const boatarray = Object.keys(Portsmouth.handicap); boatarray.sort(function (A, B) { return Portsmouth.handicap[B] - Portsmouth.handicap[A]; }); let s = '\nClass | PY (2024)\n---------|-------------:\n'; for (let boat of boatarray) { s += boat + ' | ' + Portsmouth.handicap[boat] + '\n'; } document.write(s); } </script> <style> .md table.table th { font-size: 75% } .md table.table td { font-size: 65%; white-space: nowrap; font-family: Arial; } .md table.table tr { vertical-align: top } </style> <script src="../sailing.js"> </script>