Skip to content

Latest commit

 

History

History
351 lines (273 loc) · 10.1 KB

handicap.md.html

File metadata and controls

351 lines (273 loc) · 10.1 KB
 <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
<script src="handicap.js"></script>

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>

Conversion

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}

PHRF

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.

Time-on-Distance (TOD)

\begin{equation} CT = ET - \dfrac{PHRF}{L} \end{equation}

Where $L$ is the length of the course in nautical miles.

Time-on-Time (TOT)

\begin{equation} CT = ET \times \dfrac{k}{k - M + PHRF} \end{equation}

Where $M$ is the mean (average) $PHRF$ over all boats in the fleet and $k$ is a regionally varying constant that is usually between 550 and 650.

Portsmouth

The Portsmouth Number $PN$ is a unitless quantity in the RYA Portsmouth Yardstick system. It is adjusted regionally each year based on collected performance across clubs, and then per club in some cases. See single-handed and double-handed dinghy handicap tables in the respective articles.

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 $PN = 1100$. Lower $PN$ numbers are faster boats, higher numbers are slower boats.

Corrected Time

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}

Lead Times

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 $\Delta T$ seconds later.

For example, in a race that a Laser 7 finishes in $ET$ = 20 minutes, these boats need to finish by the following elapsed times to tie it:

<script> { let s = ` Class | PN | Adjustment | ±mm:ss | ET To Tie ILCA 7 | ---------|-----:|-----------:|---------:|----------:| `; const ET_f = 20 * secondsPerMinute; const PN_f = Portsmouth.handicap['ILCA 7']; for (const boat of common_boatarray) { const PN_s = Portsmouth.handicap[boat]; const deltaT = ET_f * (PN_s / PN_f - 1); const ET_s = ET_f + deltaT; s += `${boat} | ${PN_s} | ${formatTime(deltaT, 'delta s')} | ${formatTime(deltaT, 'delta m:ss')} | ${formatTime(ET_s, 'm:ss')} \n`; } document.write(s); } </script>

Pursuit Offsets

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 $PN_Z$ be the Portsmouth number of the slowest, "scratch" boat class and $ET_Z$ be the anticipated elapsed time for a boat in that class on the course. The offset start time for another class is:

\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 $PN=799$ is about 2/3 of the RS Zest $PN=1260$, so the RS 800's expected elapsed time is about 2/3 as much as the Zest and it starts about 30 minutes later for a 90 minute race.

Derivation

For the derivation, I shorten the standard notation to $C = CT, E = ET, P = PN$ and leave out the multiplication signs.

The corrected times for the scratch boat $Z$ and another, faster boat are given by:

\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 $E_Z$ of the scratch boat is fixed. We need to find the $\Delta T$ such that on corrected time, $C_Z = C$ and all boats would tie. Rearranging to expose the key variables gives:

\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, $E_Z$, so substitute that from equation \ref{eqn:CZ}:

\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}

Portsmouth Yardstick Table

<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>