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