Alternate to W/kg for race ranking

Here’s some Perl code to test it. It may need to be tuned. I increased 15 second power 100%, 60 second power 60%, 3 minute power 20%, but kept the same 20 minute power. In Zwift, nothing would change, since only 20 minute power matters. But here my “effective power” increased 43%, which is close to the average of the increases in those four key powers (45%).

To reduce the influence of short-term power, and increase the influence of long term power, the weighting could be changed from 1 / (t + 10) to, for example, 1 / (t + 60). If I do that then the effective power increases from 241.4 to 317.1, a 31.3% increase.

#! /usr/bin/env perl                                                                                                                                                        
use strict;

# process the maximal power curve                                                                                                                                           
sub processMaximalPowerCurve {
  my $Pmax = shift;
  my $tmin = shift;
  my $tmax = shift;

  # first, go thru the curve and set a lower, over-riding the data if needed                                                                                                
  my $f = 2 / 3;
  for my $t ( $tmin .. $tmax ) {
    my $i = $t - 1;
    if ( $i >= 0 ) {
      my $lowerBound = $Pmax->[$i - 1] * ($i + $f) / ($i + 1);
      $Pmax->[$i] = $lowerBound if ($Pmax->[$i] < $lowerBound);
    }
  }

  # now go from end to beginning to check for local maxima                                                                                                                  
  for my $i ( 1 .. $#$Pmax ) {
    my $j = $#$Pmax - $i;
    $Pmax->[$j] = $Pmax->[$j + 1] if ( $Pmax->[$j] < $Pmax->[$j + 1] );
  }

  # return the revised list                                                                                                                                                 
  return $Pmax;
}

sub calcEffectivePower {
  my $P = shift;
  my $sum = 0;
  my $tmin = shift;
  my $tmax = shift;

  my $sum0 = 0;
  my $sum1 = 0;
  my $toffset = 10;
  for my $t ( $tmin .. $tmax ) {
    $sum0 += 1 / ($t + $toffset);
    $sum1 += log($P->[$t - 1]) / ($t + $toffset);
  }
  return exp($sum1 / $sum0);
}


# test with my data                                                                                                                                                         
my @P;
$P[15] = 428;
$P[60] = 289;
$P[300] = 254;
$P[1200] = 228;
my $P = processMaximalPowerCurve(\@P, 1, 3600);
my $Peff = calcEffectivePower($P, 5, 3600);

print "effective power = $Peff\n";
# result: 262.1                                                                                                                                                             

# now boost my short term power and see what happens (same FTP)                                                                                                             
$P[15]  *= 2;
$P[60]  *= 1.6;
$P[300] *= 1.2;
my $P = processMaximalPowerCurve(\@P, 1, 3600);
my $Peff = calcEffectivePower($P, 5, 3600);
print "effective power (boosted) = $Peff\n";
# result: 375.5      
4 Likes