-
Notifications
You must be signed in to change notification settings - Fork 8
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Move to the Berger formula #84
Comments
Removing the +/-37 makes no sense. The 37 is a factor found experimentally by Brzycki, basicly testing a lot of peoples 1 rep max, at various loads and reps, and doing a regression on the data. The regression which best fit the data was 37, therefore 37. Lets set r_2, r_1 (RIR targets last time and now) = 0 If we remove the 37 the formula reduced becomes. Which makes no sense (if you double the weight, you double the reps you must do). The Brzycki is a good simple formula... But not without its flaws. Things becomes weird >25 reps (incorrect) and breaks at 37 (dividing by 0). If I remember correctly Brzycki mainly did test in the range around and below 10. So at way higher reps (like 25) the formula was never meant to calculate 1 rep max (however my experience says its good up to 20-25 reps) A better formula which doesnt break at 37 and handles higher reps better is the Berger formula (adjusted by me to be reversible). Rearranged for R_2 Where: There's no a (adjustment) setting this time. Again you can solve for R_2 to find reps instead. Here I've set M_1 = 100, R_1 = 1, r_1 = 0, r_2=0, F=1. We then have R_2 on the x-axis and M_2 on the y-axis. As you see, the Brzycki formula and Berger formula is similar <15 reps. But diverges thereafter. In regards to how (on your screenshot) it seems like it suggests 0 reps at 110 load. Here it should probably have suggested 105 at 2 reps. However, if the input parameters align correctly, I still believe this approach could lead to negative or 0 reps. This can be mitigated by making sure the new reps is above some set value (like 0.95, which rounded would be 1. If we set a low threshold like 0.1 or 0, we round that up to 1 rep, but that would be really difficult to lift and way more than 1.05 progression. Remember if we're rounding up, then F is the minimum progression, therefore F should be rather low like 1.005 (I've even set it to 1.001 for my own calculations) as most often the actual increase will be higher. So: If you want the user to add a minimum allowed reps, you could do that... So if the user dont want reps below 5. We use 5 instead of 0.95. However this must mean that we're honoring the minimum target reps as a hard limit, but the max target reps as a soft limit (we're allow to go above max target reps, IF the alternative is to go below our minimum target reps) Another alternative approach used by powerlifters, is simply to not increase anything at all but accumulate our expected rep max E(RM) (which you get by setting R_2 to 1 and solving for M_2) at each workout, until we're strong enough to bridge the increment gap without negative numbers. Workout 1: Workout 2: Workout 3: Finally at workout 4, the formula gives us 120kg x 1.8reps rounded up to 100x2 reps, so now we bridge the increment. Hopefully this makes sense, its a bit difficult to conway in a short comment. Lastly regarding the 2.8% increase. And yes. Being able to lift 100kg x 2 reps or 102.9kg x 1 reps is (around) equally difficult. If youre able to lift 100kg for 2 reps, youre not twice (+100%) as strong as someone who can lift 100kg for 1 rep. Youre +2.8% stronger. |
Damn, really really appreciate the great explanation. Thanks a lot for taking the time out to write this all down for me :) I'm currently not near my workstation, so typing this from a mobile. I do have a bit of trouble wrapping my head around 100 * 2 is very similar to 102.9 * 1 cause I've been using the traditional work volume since so long and I don't really have any proper experience with exercise science (just YouTube) I do indeed follow some of the things u mentioned for the progressive overload formula but it's difficult to write it all down right now, I'll add a detailed comment about that once I reach home. Again, thanks a lot! |
Okay so here's how I've currently implemented the overload function based on my understanding and personal experience: Drop-off calculationsAs we perform sets close enough to failure for each exercise, we expect rep performance to drop slightly for every next set. If that isn't happening, likely, we aren't going close to failure. So based on these assumptions, I do the following:
For example, consider the following rep numbers for an exercise's 3 sets:
In this case, the algorithm will attempt to increase the 3rd set's numbers first and the others next. Since we are calculating drop-offs we don't get how much we want to increase the first set directly. So, if the first difference between the average drop-off and the last drop-off is negative (i.e. generally the first set does more reps than the second set), we increase the first set. Overload percentage adjustmentWhile creating a mesocycle, there's a variable you can set that instructs the algorithm how much you want set performances to increase. The algorithm then measures your actual performance changes and performs a weighted average of the set performance change and the actual performance change. Load adjustmentAfter the reps have been increased and we have reached close to the desired overload percentage, we then check if the reps are within the rep range, if not we use the Brzycki formula to adjust the reps according to the new load. The typical load adjustment is 5 but can be overridden for each exercise. Set increasesDuring meso creation, we also set volume landmarks and desired weekly increases. If performance increases are near ideal, we then increase sets for that exercise. I still need to adjust this to get the average performance improvement of the muscle group instead of individual exercises and add sets to exercises with the least number of sets (#90). RIR adjustmentIn this last step, if the planned RIR is different than the RIR performed last time, the reps and RIR are adjusted according to the current microcycle number and some progression settings:
These progression settings are taken as preferences during mesocycle creation and can be customized (overridden) for each exercise. That's about it for the current implementation, this is just based on my limited YouTube knowledge and personal experience, would appreciate your feedback on this @patrick-b-c |
I'll implement the new formula, it is indeed more elaborate than the Brzycki formula, but I can abstract that complexity away into a function as the variables required for both formulae are the same, so no worries about that. |
Hi again This problem is difficult (and subjective?) and I had a difficult time implementing this myself. But again I kind of just gave up on that, and went with the set with lowest reps. As the user will try to hit a RIR target any way, they should over time correct itself, but at the cost of the target reps not always being correct. I like your implementation of overload percentage adjustment Regarding: Load adjustment Set increases: Very awesome!.... Yeah using performance instead of proxies makes a ton of sense to me... However I'd probably have the option for the user to use performance or proxies or a combination to determine volume changes... But thats just me... |
I didn't quite explain the drop-off thing well enough, let me try again. It starts taking effect only after 2 microcycles have been logged as we need averages. Logged reps
We have averages for the 3rd workout and the last workout's drop-offs. Now we can start to create priorities for each set, a higher priority set should be increased first in reps as that change would represent the best fit to the general rep drop-off for this exercise. Drop-off differences for the new workout
First set adjustmentWe only got the priorities for 2nd and 3rd sets, to calculate the priority value of the first set, we use the following formula:
Now we finally get the full scores of all set priorities Regarding the other stuffLoad adjustment
Set increasesYeah, the performance proxies just seemed easier to implement and more objective. Giving the option to the user to use other proxies is a good idea, but not something I want to add to |
Thats a really nice algoritm for the drop off calculation. Very nice, and definetly the best I've seen in any app. Regarding: Load adjustment Set increases Keep working, v3 seems miles better than v2 already, the progress is insane, keep it up :-) |
Thank you for the kind words ❤️ |
Describe the bug
The current formula sometimes (rarely) causes really weird progressions. It increases the load for the first two sets which is great and expected, but does something weird with the last set.
Idea to fix
Remove the +/-37 from the Brzycki formula, it doesn't really make a lot of sense and feels arbitrary. Going from 1 rep to 2 reps is a 100% increase in work volume, but according to Brzycki's formula its a 2.8% increase, which feels really wrong. And to avoid any division by 0 errors, just add 1 to both old and new performances to prevent errors.
Would like some suggestions as well @patrick-b-c
The text was updated successfully, but these errors were encountered: