Andrew Cooke | Contents | Latest | RSS | Previous | Next

C[omp]ute

Welcome to my blog, which was once a mailing list of the same name and is still generated by mail. Please reply via the "comment" links.

Always interested in offers/projects/new ideas. Eclectic experience in fields like: numerical computing; Python web; Java enterprise; functional languages; GPGPU; SQL databases; etc. Based in Santiago, Chile; telecommute worldwide. CV; email.

Personal Projects

Choochoo Training Diary

Last 100 entries

Surprise Paradox; [Books] Good Author List; [Computing] Efficient queries with grouping in Postgres; [Computing] Automatic Wake (Linux); [Computing] AWS CDK Aspects in Go; [Bike] Adidas Gravel Shoes; [Computing, Horror] Biological Chips; [Books] Weird Lit Recs; [Covid] Extended SIR Models; [Art] York-based Printmaker; [Physics] Quantum Transitions are not Instantaneous; [Computing] AI and Drum Machines; [Computing] Probabilities, Stopping Times, Martingales; bpftrace Intro Article; [Computing] Starlab Systems - Linux Laptops; [Computing] Extended Berkeley Packet Filter; [Green] Mainspring Linear Generator; Better Approach; Rummikub Solver; Chilean Poetry; Felicitations - Empowerment Grant; [Bike] Fixing Spyre Brakes (That Need Constant Adjustment); [Computing, Music] Raspberry Pi Media (Audio) Streamer; [Computing] Amazing Hack To Embed DSL In Python; [Bike] Ruta Del Condor (El Alfalfal); [Bike] Estimating Power On Climbs; [Computing] Applying Azure B2C Authentication To Function Apps; [Bike] Gearing On The Back Of An Envelope; [Computing] Okular and Postscript in OpenSuse; There's a fix!; [Computing] Fail2Ban on OpenSuse Leap 15.3 (NFTables); [Cycling, Computing] Power Calculation and Brakes; [Hardware, Computing] Amazing Pockit Computer; Bullying; How I Am - 3 Years Post Accident, 8+ Years With MS; [USA Politics] In America's Uncivil War Republicans Are The Aggressors; [Programming] Selenium and Python; Better Walking Data; [Bike] How Fast Before Walking More Efficient Than Cycling?; [COVID] Coronavirus And Cycling; [Programming] Docker on OpenSuse; Cadence v Speed; [Bike] Gearing For Real Cyclists; [Programming] React plotting - visx; [Programming] React Leaflet; AliExpress Independent Sellers; Applebaum - Twilight of Democracy; [Politics] Back + US Elections; [Programming,Exercise] Simple Timer Script; [News] 2019: The year revolt went global; [Politics] The world's most-surveilled cities; [Bike] Hope Freehub; [Restaurant] Mama Chau's (Chinese, Providencia); [Politics] Brexit Podcast; [Diary] Pneumonia; [Politics] Britain's Reichstag Fire moment; install cairo; [Programming] GCC Sanitizer Flags; [GPU, Programming] Per-Thread Program Counters; My Bike Accident - Looking Back One Year; [Python] Geographic heights are incredibly easy!; [Cooking] Cookie Recipe; Efficient, Simple, Directed Maximisation of Noisy Function; And for argparse; Bash Completion in Python; [Computing] Configuring Github Jekyll Locally; [Maths, Link] The Napkin Project; You can Masquerade in Firewalld; [Bike] Servicing Budget (Spring) Forks; [Crypto] CIA Internet Comms Failure; [Python] Cute Rate Limiting API; [Causality] Judea Pearl Lecture; [Security, Computing] Chinese Hardware Hack Of Supermicro Boards; SQLAlchemy Joined Table Inheritance and Delete Cascade; [Translation] The Club; [Computing] Super Potato Bruh; [Computing] Extending Jupyter; Further HRM Details; [Computing, Bike] Activities in ch2; [Books, Link] Modern Japanese Lit; What ended up there; [Link, Book] Logic Book; Update - Garmin Express / Connect; Garmin Forerunner 35 v 230; [Link, Politics, Internet] Government Trolls; [Link, Politics] Why identity politics benefits the right more than the left; SSH Forwarding; A Specification For Repeating Events; A Fight for the Soul of Science; [Science, Book, Link] Lost In Math; OpenSuse Leap 15 Network Fixes; Update; [Book] Galileo's Middle Finger; [Bike] Chinese Carbon Rims; [Bike] Servicing Shimano XT Front Hub HB-M8010; [Bike] Aliexpress Cycling Tops; [Computing] Change to ssh handling of multiple identities?; [Bike] Endura Hummvee Lite II; [Computing] Marble Based Logic; [Link, Politics] Sanity Check For Nuclear Launch; [Link, Science] Entropy and Life

© 2006-2017 Andrew Cooke (site) / post authors (content).

[Bike] Gearing For Real Cyclists

From: andrew cooke <andrew@...>

Date: Sun, 20 Dec 2020 16:58:17 -0300

On the Internet, when discussing lower gearing for a bike, you can expect
someone to comment "just learn to climb".  Which drives me crazy, because the
problem is not the cyclist, but the gears.

Gearing on most bikes sold to new cyclists is not that different to the
gearing that professional cyclists use.  Yet professional cyclists are hugely
more powerful than new cyclists (or even experienced amateurs).  A reasonably
fit, new cyclist can expect to produce around 100W sustained power.  A pro can
maintain 4x that, or more.

The physics of cycling uphill - at least at speeds slow enough for air
resistance to be negligible - is simple.  It's so simple that it's basically
linear - you can adjust things by scaling relative numbers.  In other words,
if a newbie cyclist has 1/4 the power of a pro they should have gears that are
4x as easy.  This is not the case.

To illustrate this I've written a small program that calculates the gearing
you would need (expressed as front x back number of teeth on the gears) for
different power output, gradients, and cadences.

The power levels cover the range from newbie (100W) to pro (400W+), the
gradients from "normal" hills (6%) to the steepest the Alps can offer (14%),
and the cadences reflect climbing standing (30rpm), grinding slowly sitting
(60rpm), and spinning (90rpm) while sitting.

Note that I have assumed a rider of about my weight (65kg, 143lb).  If you
(plus bike) weigh twice what I do then you need gears twice as low.  Again,
it's simple scaling.

Full results (and the program) are below.  Here I'll pick a few interesting
numbers:

  * A 400W pro can spin (90rpm) up a 12% gradient using 39x27.  This is
    typical of the lowest gearing on a professional bike (which makes sense).

  * A 100W newbie, to do the same, would need 26x72.  That's a 26 tooth gear
    at the front and an 72 tooth rear - so extreme it's not even available on
    mountain bikes (a 200W rider would need 26x36, which is a MTB gear).

  * A 200W amateur rider, with 34x28 gears (about the lowest most new road
    bikes go) can spin (90rpm) up a gradient of around 7%, but can manage over
    14% if they learn to climb standing at a low cadence (30rpm).

I think the last point is the source of "learn to climb" - learn to ride
standing at low cadence.  But note that this is only an option if you're
a similar weight to me (and many riders seem to weigh much more).

Finally, remember that these are broad generalisations, based only on work
against gravity (ignoring rolling resistance and wind resistance).  But when
we're dealing in differences of a factor of 4, a rough categorization within
10% or so is fine.

Andrew


Cyclist generating 100W
-----------------------

  Climb of 6%
    30rpm  26x12 30x14 34x16 39x18 
    60rpm  26x24 30x28 34x31 39x36 
    90rpm  26x36 30x41 34x47 

  Climb of 8%
    30rpm  26x16 30x18 34x21 39x24 
    60rpm  26x32 30x37 34x42 39x48 
    90rpm  26x48 

  Climb of 10%
    30rpm  26x20 30x23 34x26 39x30 
    60rpm  26x40 30x46 
    90rpm  26x60 

  Climb of 12%
    30rpm  26x24 30x28 34x31 39x36 
    60rpm  26x48 
    90rpm  26x72 

  Climb of 14%
    30rpm  26x28 30x32 34x36 39x42 
    60rpm  26x56 
    90rpm  26x84 


Cyclist generating 200W
-----------------------

  Climb of 6%
    60rpm  26x12 30x14 34x16 39x18 
    90rpm  26x18 30x21 34x23 39x27 

  Climb of 8%
    30rpm  34x10 39x12 
    60rpm  26x16 30x18 34x21 39x24 
    90rpm  26x24 30x28 34x31 39x36 

  Climb of 10%
    30rpm  26x10 30x11 34x13 39x15 
    60rpm  26x20 30x23 34x26 39x30 
    90rpm  26x30 30x34 34x39 39x45 

  Climb of 12%
    30rpm  26x12 30x14 34x16 39x18 
    60rpm  26x24 30x28 34x31 39x36 
    90rpm  26x36 30x41 34x47 

  Climb of 14%
    30rpm  26x14 30x16 34x18 39x21 
    60rpm  26x28 30x32 34x36 39x42 
    90rpm  26x42 30x48 


Cyclist generating 300W
-----------------------

  Climb of 6%
    Note: speed > 20kmh, air resistance significant
    60rpm  34x10 39x12 
    90rpm  26x12 30x14 34x16 39x18 

  Climb of 8%
    60rpm  26x11 30x12 34x14 39x16 
    90rpm  26x16 30x18 34x21 39x24 

  Climb of 10%
    30rpm  39x10 
    60rpm  26x13 30x15 34x17 39x20 
    90rpm  26x20 30x23 34x26 39x30 

  Climb of 12%
    30rpm  34x10 39x12 
    60rpm  26x16 30x18 34x21 39x24 
    90rpm  26x24 30x28 34x31 39x36 

  Climb of 14%
    30rpm  30x11 34x12 39x14 
    60rpm  26x19 30x21 34x24 39x28 
    90rpm  26x28 30x32 34x36 39x42 


Cyclist generating 400W
-----------------------

  Climb of 6%
    Note: speed > 20kmh, air resistance significant
    90rpm  30x10 34x12 39x13 

  Climb of 8%
    Note: speed > 20kmh, air resistance significant
    60rpm  34x10 39x12 
    90rpm  26x12 30x14 34x16 39x18 

  Climb of 10%
    Note: speed > 20kmh, air resistance significant
    60rpm  26x10 30x11 34x13 39x15 
    90rpm  26x15 30x17 34x20 39x22 

  Climb of 12%
    60rpm  26x12 30x14 34x16 39x18 
    90rpm  26x18 30x21 34x23 39x27 

  Climb of 14%
    30rpm  39x10 
    60rpm  26x14 30x16 34x18 39x21 
    90rpm  26x21 30x24 34x27 39x31 


Python 3 code:

circumference = 2.14  # m (measured from rolling road bike)
g = 9.8  # m/s2 (gravitational acceleration)
mass = 8 + 65  # kg (bike + me)
front_gears = [26, 30, 34, 39]  # teeth
gradients = [6, 8, 10, 12, 14]  # %
powers = [100, 200, 300, 400]  # W
cadences = [30, 60, 90]  # standing, grinding, spinning


for power in powers:
    print(f'\nCyclist generating {power}W')
    print('-----------------------\n')
    vertical_speed = power / (mass * g)  # m/s
    for gradient in gradients:
        print(f'  Climb of {gradient}%')
        horizontal_speed = vertical_speed * 100 / gradient  # m/s
        if horizontal_speed * 3.6 > 20:
            print('    Note: speed > 20kmh, air resistance significant')
        wheel_rpm = 60 * horizontal_speed / circumference
        for cadence in cadences:
            subtitle = False
            for front_gear in front_gears:
                gear_ratio = cadence / wheel_rpm
                rear_gear = int(front_gear * gear_ratio + 0.5)  # round
                if rear_gear > 9 and (rear_gear <= 50 or not subtitle):
                    if not subtitle:
                        print(f'    {cadence}rpm  ', end='')
                        subtitle = True
                    print(f'{front_gear}x{rear_gear} ', end='')
            if subtitle:
                print()
        print()

Cadence v Speed

From: andrew cooke <andrew@...>

Date: Sat, 26 Dec 2020 10:24:43 -0300

The above isn't clear enough on how important cadence is for climbing.
Choosing gears for a bike has to meet three criteria:

  * High cadence on steep climbs (pressure on lowest gears)

  * Not spinning out on steep descents (pressure on highest gears)

  * Reasinable spacing (pressure on number of gears)

Current solutions are largely failing new riders for the first of these.

Andrew

Comment on this post