← Back to blog

Predicting Weight Loss Plateaus: Why Your Diet Equation is Wrong

Everyone has a simple mental model for weight loss: Calories In < Calories Out = Weight Loss.

It's simple, intuitive, and... often frustratingly inaccurate over the long term. You might start a diet and see great results in the first few weeks, but then, inevitably, the progress slows down. You're eating the same amount, exercising just as hard, but the scale stops moving.

In this post, I'm going to show you why that happens using a tool from the engineering toolbox. It's a tool that sounds intimidating, but is actually remarkably useful for understanding how things change over time. It's called a differential equation.

The Leaky Bucket Problem

Before we dive into the math, let's look at why the "3500 calorie rule" (the idea that a 3500 calorie deficit always equals 1lb of weight loss) fails.

Imagine your body is a car. A heavy car needs more gas to move than a light car. As you lose weight, your "car" gets lighter. It requires less fuel (calories) to keep running. If you keep putting in the same amount of fuel, but the car needs less, your deficit shrinks. Eventually, your intake matches your needs, and you stop losing weight.

You hit a plateau.

To model this accurately, we can't just use simple subtraction. We need a model that updates itself as your weight changes.

The Engine (Your BMR)

First, we need to calculate how much energy your body uses just to exist. This is your Basal Metabolic Rate (BMR).

The Mifflin St Jeor equation is one of the most accurate ways to estimate this:

P=(10.0m1kg+6.25h1cm5.0a1year+s)kcaldayP = \left({10.0m \over 1kg} + {6.25h\over 1cm} - {5.0a\over 1year} + s \right) \frac{kcal}{day}

Where:

  • mm is mass (kg)
  • hh is height (cm)
  • aa is age (years)
  • ss is a constant (+5 for men, -161 for women)

But you don't just lay in bed all day! We scale this BMR by an Activity Factor (ff) to get your Total Daily Energy Expenditure (TT):

T=f(10m+6.25h5a+s)T = f (10m + 6.25h - 5a + s)

If you eat more than TT, you gain weight. Less, and you lose it.

The Math (Don't Panic!)

Here is where the magic happens. We want to predict your weight w(t)w(t) at any future time tt.

We know that:

Rate of Weight Change=Calories InCalories Out7700\text{Rate of Weight Change} = \frac{\text{Calories In} - \text{Calories Out}}{7700}

(Dividing by 7700 converts calories to kg)

This gives us a differential equation:

dw(t)dt=nf(10w(t)+6.25h5a+s)7700\frac{dw(t)}{dt} = \frac{n - f (10w(t) + 6.25h - 5a + s)}{7700}

This equation says: "The speed at which you lose weight depends on your current weight."

When we solve this (using a technique called separation of variables), we don't get a straight line. We get an exponential curve.

w(t)=wfinal+(wstartwfinal)ektw(t) = w_{final} + (w_{start} - w_{final}) e^{-kt}

Translating this back to English: Your weight will decay (or grow) exponentially towards a new steady state. You won't keep losing weight forever; you will asymptotically approach a new "target weight" determined by your diet.

Building the Weight Loss Simulator

Math concepts are great, but interactives are better. Let's build a weight loss calculator simulator using HTML, CSS, and JavaScript.

We can solve the equation step-by-step in code. Instead of using the complex integrated formula, we can simulate it day-by-day.

The Setup

We need a few inputs from the user: Age, Weight, Height, Diet calories, and Activity Level.

<form id="form">
<!-- Inputs for age, weight, height... -->
<input placeholder="e.g 25" type="number" id="age" required />
<input type="number" id="weight" required />
<select name="activity" id="activity" required>
<option value="sedentary">Sedentary</option>
<!-- ... other options ... -->
</select>
<input type="submit" value="Predict" id="predict-btn" />
</form>

The Logic

Here is the JavaScript engine that powers the prediction. We loop through 100 months (about 8 years), calculating the new weight for each month based on the previous month's weight.

// Calculate the constants based on user input
let k = (n - f * (6.25 * h - 5 * a + s)) / (10 * f);
let c = w_0 - k;
for (let j = 1; j < 101; j++) {
// t is time in days (assuming 30 days/month)
let t = j * 30;
// The Solution Formula
w_t = c * Math.exp((f * t) / -770) + k;
// Round and store data
let obj = {
time: j,
weight: Math.round(w_t * 100) / 100,
};
weightTime.push(obj);
}

Visualizing the Result

To really see the "plateau" effect, a table of numbers isn't enough. We need a chart.

Using D3.js, we can plot these points.

// Drawing the line using D3
const line = d3
.line()
.x((d) => xScale(d.time))
.y((d) => yScale(d.weight))
.curve(d3.curveMonotoneX);
svg
.append("path")
.datum(weightTime)
.attr("d", line)
.style("stroke", "blueviolet");
/* ... styling ... */

The Results

When you run this simulator, you'll see something interesting.

If you start at 80kg and cut your calories, you might drop quickly to 75kg. But then the curve flattens. To get to 70kg, you might need to wait twice as long, or cut your calories further.

This isn't your metabolism "breaking." It's just the differential equation doing its job. Your body is finding its new equilibrium.

Try it out

I built a full web application around this model. You can play with it here: Weight Change Prediction App

And if you want to dig into the full source code, check it out on GitHub: Source Code

Conclusion

Differential equations might seem like dry, academic abstractions, but they govern so much of our biological reality. By moving from a linear model ("3500 calories = 1lb") to a dynamic one, we gain a much more forgiving and realistic understanding of how our bodies work.

Next time you hit a plateau, don't be discouraged. It just means you've solved the equation for your current input. If you want a different output, you just need to change the variables.