I'm creating an app that turns fitness data into "scores". An example will better describe the problem I'm having…
Let's say you do 5 sets of Squats as an example. Below are your sets (weight and reps)
1. 20 kg x 20 reps
2. 30 kg x 15 reps
3. 35 kg x 12 reps
4. 40 kg x 10 reps
5. 45 kg x 8 reps
I create a "score" for each set by multiplying the weight x reps
. In this case
1. 20 kg x 20 reps = 400
2. 30 kg x 15 reps = 450
3. 35 kg x 12 reps = 420
4. 40 kg x 10 reps = 400
5. 45 kg x 8 reps = 360
I want the weight to have more of a "value" the larger it gets. Preferably, in this example, I'd want the score of the 5th set to be greater than the score of the 4th set.
The best solution I've found so far is to square the weight value like so
$weight^2*reps$
1. 20 kg x 20 reps = 8000
2. 30 kg x 15 reps = 13500
3. 35 kg x 12 reps = 14700
4. 40 kg x 10 reps = 16000
5. 45 kg x 8 reps = 16200
The actual numeric values are arbitrary because I use them to create a percentage score so it doesn't matter that it's in the thousands. It's mostly the difference in between the values that I'm interested in.
However this causes too great an increase as the weight value gets higher. The difference between set 1 and set 5 is too drastic.
Is there another way I can cause an exponential increase with a flatter curve?
Should I instead be using the initial weight value as a base value or something along those lines?
Apologies for the long question, my math knowledge is limited and I've been mulling this over for a while but still can't seem to word the problem correctly.
Best Answer
So the idea of using a base weight sounds good, but I don't think you should use the smallest value. Instead, pick a value in the middle, (lets call it $W_0$), with the idea that you get penalized on lower lifts and rewarded on higher lifts. Also pick an exponent, $p$, say between 0.8 and 2.0. Higher values of $p$ make the penalty/reward more extreme, and there are no mathematical reasons why $p$ needs to stay in that range; it just seems to give reasonable values. Then compute
$$Score = Wt * Reps *(Wt/W_0)^p$$
I whipped up a spreadsheet to play around with the values of $W_0$ and $p$, and here are a few runs:
(I wish there was a way I could pass the spreadsheet to you so you could play around with it.)
This does have the problem of picking the Base Weight. If the app is just for you then you could just pick them by hand for each exercise, but that's unworkable if there will be many different users. So you probably want your app to be able to compute a reasonable $W_0$ value from the data. As a first stab I'd try using the midpoint:
$$W_0 = \frac{\min W_i + \max W_i}{2}$$
My guess is that this would be too sensitive to stray outliers, so a more "robust" value would be the weighted average (the pun is totally co-incidencidental):
$$W_0 = \frac{\sum W_i * Reps_i}{\sum Reps_i}$$