<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>Weightlifting on brege.org</title>
    <link>https://brege.org/tags/weightlifting/</link>
    <description>Recent content in Weightlifting on brege.org</description>
    <generator>Hugo</generator>
    <language>en</language>
    <copyright>Copyright (c) 2016-2026 Wyatt Brege</copyright>
    <lastBuildDate>Sun, 29 Mar 2026 17:53:44 -0400</lastBuildDate>
    <atom:link href="https://brege.org/tags/weightlifting/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Non-linear Weightlifting Progression Calculator</title>
      <link>https://brege.org/post/nonlinear-weightlifting-progression-scheme/</link>
      <pubDate>Tue, 25 Mar 2025 00:00:00 +0000</pubDate>
      <guid>https://brege.org/post/nonlinear-weightlifting-progression-scheme/</guid>
      <description>Using the Epley formula, and others, for estimating an effective pathway through weightlifting plateaus</description>
      <content:encoded><![CDATA[<p>Consider the Epley formula for estimating one-rep max weight:</p>
<p>$$
W_\text{1RM} = W \cdot \left(1 + \frac{R}{30}\right)
$$</p>
<p>To compute your one-rep max weight for a given lift, $W_{1\text{RM}}$, you simply input the weight lifted, $W$, and the number of reps performed before failure, $R$.</p>
<p>This formula has been empirically validated <sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup> and is a useful tool not just for estimating your max weight for a given weight-rep pair $\left(W, R\right)$, but also to compute the number of predictable reps you can do at any other given weight, relative to your one-rep max.</p>
<p>This is quite useful for plateaus. For example, if you get stuck progressing the Overhead Press to 115 lbs for 5 reps after successfully performing the OHP for 110 lbs for 5 reps, you may need to strategize. Using the Epley formula, to go from
$$
\left( 110\text{lb}, 5 \text{reps} \right) \rightarrow \left(115 \text{lb}, 5 \text{reps}\right),
$$
you are effectively increasing your one-rep max: $W_\text{1RM}: 128 \text{lbs} \rightarrow 134 \text{lbs}$. Our goal here is to effectively increment your $W_\text{1RM}$ in smaller steps:
$$
\small
\left( 110\text{lb}, 5 \text{reps} \right)
\rightarrow \left(115 \text{lb}, 4 \text{reps}\right)
\rightarrow \left(110 \text{lb}, 6 \text{reps}\right)
\rightarrow \left(105 \text{lb}, 8 \text{reps}\right)
\rightarrow \left(115 \text{lb}, 5 \text{reps}\right)
$$
because this is the same as
$$
W_{1\text{RM}}: 128.33 \text{lb}
\rightarrow 130.33 \text{lb}
\rightarrow 132.00 \text{lb}
\rightarrow 133.00 \text{lb}
\rightarrow 134.17 \text{lb} \\
W_{5\text{RM}}: 110.00 \text{lb}
\rightarrow 111.71 \text{lb}
\rightarrow 113.14 \text{lb}
\rightarrow 114.00 \text{lb}
\rightarrow 115.00 \text{lb}
$$
I refer to this as the <strong>Epley pathway</strong>.</p>
<p>Because the Epley formula is nonlinear, this requires an iterative approach. I&rsquo;ve made a calculator that will help you find this path over different $\left(W, R\right)$ pairs. It defaults to using a range of reps roughly half that of your initial number, $R_0$, and a few &ldquo;sweet spot&rdquo; rep values.</p>
<link rel="stylesheet" href="/css/calculator.css">

<div id="calculator">
  <label for="weight" class="form-label"><b>Initial Weight</b> (lbs):</label>
  <input type="number" id="weight" class="form-control" value="135" min="10" max="1000">

  <label for="reps" class="form-label"><b>Initial Reps</b>:</label>
  <input type="number" id="reps" class="form-control" value="5" min="1" max="30">

  <label for="repRange" class="form-label"><b>Rep Range Variation:</b></label>
  <select id="repRange" class="post-tags">
    <option value="0">hybrid: ±R₀/2 and (8, 10, 12, 15, 20, 30)</option>
    <option value="1">R₀±5 reps</option>
    <option value="2">±R₀</option>
    <option value="3">R₀±8 reps</option>
    <option value="4">R₀±10 reps</option>
    <option value="5">R₀±12 reps</option>
    <option value="6">R₀±15 reps</option>
    <option value="7">All reps: [0,..,30]</option>
  </select>

  <label for="formulaSelect" class="form-label"><b>1RM Formula:</b></label>
  <select id="formulaSelect" class="post-tags">
    <option value="epley">Epley</option>
    <option value="brzycki">Brzycki</option>
    <option value="lombardi">Lombardi</option>
    <option value="oconner">O’Conner</option>
  </select>

  
  <div class="calculator-explanation">
    <details open=true> 
<summary> Show/Hide extra notes </summary>
<p>You&rsquo;ll note that I&rsquo;ve generalized this calculator to also include different formulas that different apps use:</p>
<p>$$
W_{\text{1RM}} = f(W, R)
$$</p>
<p>Try changing the dropdown to see how different curves generate slightly different effective rep ranges.  To read more on the survey of different calculations, check out the <a href="https://en.wikipedia.org/wiki/One-repetition_maximum">One-repetition maximum article on Wikipedia</a>.</p>
</details>

  </div>
  

  <h3 id="formulaHeading">Epley Pathway </h3>
  <div id="formulaLatex" class="katex-block" style="margin-bottom: 1rem;"></div>

  <table id="resultsTable" class="table table-dark">
    <thead>
      <tr>
        <th>Weight (lbs)</th>
        <th>Reps</th>
        <th>1RM (lbs)</th>
        <th id="effectiveRMHeader">Effective <br> 5RM (lbs)</th>
      </tr>
    </thead>
    <tbody></tbody>
  </table>

  <div id="chart-container"></div>

  <script>
    function calculate1RM(weight, reps) {
      const formula = document.getElementById('formulaSelect').value;
      switch (formula) {
        case 'epley': return weight * (1 + reps / 30);
        case 'brzycki': return weight / (1.0278 - 0.0278 * reps);
        case 'lombardi': return weight * Math.pow(reps, 0.10);
        case 'oconner': return weight * (1 + 0.025 * reps);
        default: return weight * (1 + reps / 30);
      }
    }

    function calculateEffectiveRM(estimated1RM, reps) {
      const formula = document.getElementById('formulaSelect').value;
      switch (formula) {
        case 'epley': return estimated1RM / (1 + reps / 30);
        case 'brzycki': return estimated1RM * (1.0278 - 0.0278 * reps);
        case 'lombardi': return estimated1RM / Math.pow(reps, 0.10);
        case 'oconner': return estimated1RM / (1 + 0.025 * reps);
        default: return estimated1RM / (1 + reps / 30);
      }
    }

    function updateFormulaHeading() {
      const formula = document.getElementById('formulaSelect').value;

      const headingMap = {
        epley: "Epley Pathway",
        brzycki: "Brzycki Pathway",
        lombardi: "Lombardi Pathway",
        oconner: "O’Conner Pathway"
      };

      const latexMap = {
        epley: "W_{\\text{1RM}} = W \\cdot \\left(1 + \\frac{R}{30}\\right)",
        brzycki: "W_{\\text{1RM}} = \\frac{W}{1.0278 - 0.0278R}",
        lombardi: "W_{\\text{1RM}} = W \\cdot R^{0.10}",
        oconner: "W_{\\text{1RM}} = W \\cdot (1 + 0.025R)"
      };

      document.getElementById('formulaHeading').textContent = headingMap[formula] || "Epley Pathway";

      const formulaLatex = latexMap[formula] || latexMap["epley"];
      const formulaLatexDiv = document.getElementById('formulaLatex');

      if (window.katex) {
        katex.render(formulaLatex, formulaLatexDiv, { throwOnError: false });
      } else {
        formulaLatexDiv.textContent = `\\(${formulaLatex}\\)`;
      }
    }

    function getRepRange(repVariation, R_0) {
      const reps = new Set();

      if (repVariation === 0) {
        
        const rStart = Math.floor(R_0 / 2);
        const rEnd = Math.floor(3 * R_0 / 2);
        for (let r = rStart; r <= rEnd; r++) reps.add(r);

        
        [8, 10, 12, 15, 20, 30].forEach(r => reps.add(r));
      } else if (repVariation === 1) {
        for (let r = Math.max(1, R_0 - 5); r <= Math.min(30, R_0 + 5); r++) reps.add(r);
      } else if (repVariation === 2) {
        for (let r = 0; r <= 2 * R_0; r++) reps.add(r);
      } else if (repVariation === 3) {
        for (let r = Math.max(1, R_0 - 8); r <= Math.min(30, R_0 + 8); r++) reps.add(r);
      } else if (repVariation === 4) {
        for (let r = Math.max(1, R_0 - 10); r <= Math.min(30, R_0 + 10); r++) reps.add(r);
      } else if (repVariation === 5) {
        for (let r = Math.max(1, R_0 - 12); r <= Math.min(30, R_0 + 12); r++) reps.add(r);
      } else if (repVariation === 6) {
        for (let r = Math.max(1, R_0 - 15); r <= Math.min(30, R_0 + 15); r++) reps.add(r);
      } else if (repVariation === 7) {
        for (let r = 0; r <= 30; r++) reps.add(r);
      }

      return Array.from(reps).filter(r => r >= 1 && r <= 30).sort((a, b) => a - b);
    }

    function calculateResults() {
      const W_0 = parseInt(document.getElementById('weight').value);
      const R_0 = parseInt(document.getElementById('reps').value);
      const repVariation = parseInt(document.getElementById('repRange').value);

      const repsToTry = getRepRange(repVariation, R_0);
      const lowerLimit = W_0;
      const upperLimit = W_0 + 5;

      document.getElementById('effectiveRMHeader').textContent = `Effective ${R_0}RM (lbs)`;

      const pairs = [];
      for (let W = 10; W <= 1000; W += 5) {
        for (const R of repsToTry) {
          const oneRM = calculate1RM(W, R);
          const effectiveRM = calculateEffectiveRM(oneRM, R_0);
          if (effectiveRM >= lowerLimit && effectiveRM <= upperLimit) {
            pairs.push({ W, R, oneRM, effectiveRM });
          }
        }
      }

      pairs.sort((a, b) => a.effectiveRM - b.effectiveRM);

      const tbody = document.querySelector("#resultsTable tbody");
      tbody.innerHTML = '';

      let finalRowAdded = false;
      for (const row of pairs) {
        const tr = tbody.insertRow();
        tr.insertCell(0).textContent = row.W;
        tr.insertCell(1).textContent = row.R;
        tr.insertCell(2).textContent = row.oneRM.toFixed(2);
        tr.insertCell(3).textContent = row.effectiveRM.toFixed(2);
        if (Math.abs(row.W - W_0) <= 5) tr.classList.add('bold-weight');
        if (row.W === W_0 + 5 && row.R === R_0) finalRowAdded = true;
      }

      if (!finalRowAdded) {
        const finalOneRM = calculate1RM(W_0 + 5, R_0);
        const finalEffective = calculateEffectiveRM(finalOneRM, R_0);
        const finalRow = tbody.insertRow();
        finalRow.insertCell(0).textContent = W_0 + 5;
        finalRow.insertCell(1).textContent = R_0;
        finalRow.insertCell(2).textContent = finalOneRM.toFixed(2);
        finalRow.insertCell(3).textContent = finalEffective.toFixed(2);
        finalRow.classList.add('bold-weight');
      }

      tbody.querySelectorAll("tr").forEach(tr => {
        tr.addEventListener("click", () => {
          tbody.querySelectorAll("tr").forEach(r => r.classList.remove("highlighted-row"));
          tr.classList.add("highlighted-row");
        });
      });

      updateChart(pairs);
    }


    document.getElementById('formulaSelect').addEventListener('change', () => {
      updateFormulaHeading();
      calculateResults();
    });

    document.getElementById('weight').addEventListener('input', calculateResults);
    document.getElementById('reps').addEventListener('input', calculateResults);
    document.getElementById('repRange').addEventListener('change', calculateResults);

    window.addEventListener('DOMContentLoaded', () => {
      updateFormulaHeading();
      calculateResults();
    });
  </script>

  <hr/>
</div>

<style>
  #resultsTable td {
    padding: 0.5rem !important;
    margin: 0 !important;
  }
  #resultsTable th {
    padding: 0.75rem !important;
  }
</style>


<p><em>More details of different, specific formulae for Epley <sup id="fnref:2"><a href="#fn:2" class="footnote-ref" role="doc-noteref">2</a></sup> Brzycki <sup id="fnref:3"><a href="#fn:3" class="footnote-ref" role="doc-noteref">3</a></sup>, Lombardi <sup id="fnref:4"><a href="#fn:4" class="footnote-ref" role="doc-noteref">4</a></sup> and O&rsquo;Connor <sup id="fnref:5"><a href="#fn:5" class="footnote-ref" role="doc-noteref">5</a></sup>, and several complimentary research articles <sup id="fnref1:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup> and <sup id="fnref:6"><a href="#fn:6" class="footnote-ref" role="doc-noteref">6</a></sup>, are available.</em></p>
<hr />
<h3 id="my-progression-scheme">My Progression Scheme</h3>
<p>This makes it straightforward for me to also compute the warmup sets needed for my leading barbell exercise. Recently, I&rsquo;ve found good success in pyramiding warmups using my calculated $\left(30, 20, 10\right)\text{RM}$&rsquo;s for $\left(12, 8, 4\right) \text{reps}$, respectively.</p>
<p>In addition, another scheme I&rsquo;ve been using for strength-focused exercises has been, after 3–6 reps of heavy weight for three sets, to drop set into $\left(10, 20\right)\text{RM}$ for $\left(8, 12\ldots\text{amrap}\right)$, respectively, to increase my work volume without chewing up my joints, leaving $\sim \text{2}$ $\text{rir}$. Here, $\text{amrap} = $ &ldquo;as many reps as possible&rdquo; and $\text{rir} =$ &ldquo;reps in reserve&rdquo;. My thoughts here reflect the goal to cover warmup (3), strength (3–4), and hypertrophy (2), in a single leading compound exercise.</p>
<div class="progression-chart">
  <svg id="progressionChart" width="100%" height="auto" viewBox="0 0 800 400" preserveAspectRatio="xMidYMid meet"></svg>

  
    <div class="progression-caption"><b>Progression Chart Example: Set Breakdown for Leading Barbell Lift.</b> The width of the bins represents the number of reps, $R$, denoted inside the bins. The weights, $W_{N\text{RM}}$, are in lbs, represented as the height of the bins. From left to right, the weights in my scheme are: 30RM, 20RM, 10RM, 5RM (3x's), 10RM, 20RM. This provides a visual sense of volume in each zone of the exercise. <i>If you change the weights in the calculator, this plot will update. Because this is a hybrid model for strength training and hypertrophy, it will bind the rep ranges between 3–6 reps. The $y$-axis is truncated at ⅔ $W_{\text{30RM}}$.</i></div>
  
</div>

<script src="https://d3js.org/d3.v7.min.js"></script>

<script>
  let inputWeight =  135 ;
  let inputReps =  5 ;
  let chartData = [];

  function progression_calculate1RM(weight, reps) {
    return weight * (1 + reps / 30);
  }

  function progression_roundToNearest5(num) {
    return Math.round(num / 5) * 5;
  }

  function progression_calculateWeights(weight, reps) {
    const W_1RM = progression_roundToNearest5(progression_calculate1RM(weight, reps));
    const W_30RM = progression_roundToNearest5(W_1RM / (1 + 30 / 30));
    const W_20RM = progression_roundToNearest5(W_1RM / (1 + 20 / 30));
    const W_10RM = progression_roundToNearest5(W_1RM / (1 + 10 / 30));
    const W_5RM = progression_roundToNearest5(weight);
    return { W_30RM, W_20RM, W_10RM, W_5RM, W_1RM };
  }

  function progression_updateChart() {
    const constrainedReps = Math.max(3, Math.min(inputReps, 6));
    const { W_30RM, W_20RM, W_10RM, W_5RM, W_1RM } = progression_calculateWeights(inputWeight, constrainedReps);

    chartData = [
      { label: '12 reps (Warmup)', weight: W_30RM, reps: 12, zone: 'warmup' },
      { label: '8 reps (Warmup)', weight: W_20RM, reps: 8, zone: 'warmup' },
      { label: '4 reps (Warmup)', weight: W_10RM, reps: 4, zone: 'warmup' },
      { label: `${constrainedReps} reps (Workset 1)`, weight: inputWeight, reps: constrainedReps, zone: 'worksets' },
      { label: `${constrainedReps} reps (Workset 2)`, weight: inputWeight, reps: constrainedReps, zone: 'worksets' },
      { label: `${constrainedReps} reps (Workset 3)`, weight: inputWeight, reps: constrainedReps, zone: 'worksets' },
      { label: '8 reps (Dropset)', weight: W_10RM, reps: 8, zone: 'dropsets' },
      { label: '12 reps (Dropset)', weight: W_20RM, reps: 12, zone: 'dropsets' }
    ];

    const svg = d3.select("#progressionChart");
    svg.selectAll("*").remove();

    const margin = { top: 20, right: 20, bottom: 60, left: 40 };
    const width = 800 - margin.left - margin.right;
    const height = 400 - margin.top - margin.bottom;
    const svgGroup = svg
      .attr("width", width + margin.left + margin.right)
      .attr("height", height + margin.top + margin.bottom)
      .append("g")
      .attr("transform", `translate(${margin.left},${margin.top})`);

    const xScale = d3.scaleBand()
      .domain(chartData.map(d => d.label))
      .range([0, width])
      .padding(0.1);

    const yMin = chartData[0].weight / 1.5;
    const yMax = d3.max(chartData, d => d.weight) * 1.1;

    const yScale = d3.scaleLinear()
      .domain([yMin, yMax])
      .range([height, 0]);

    const barWidth = (reps) => reps * 10;
    const spacing = 5;
    let midPoints = [];
    let currentXPosition = 0;

    svgGroup.selectAll(".bar")
      .data(chartData)
      .enter()
      .append("rect")
      .attr("class", "bar")
      .attr("x", function(d, i) {
        const xPosition = currentXPosition;
        midPoints.push(xPosition + barWidth(d.reps) / 2);
        currentXPosition += barWidth(d.reps) + spacing;
        return xPosition;
      })
      .attr("y", d => yScale(d.weight))
      .attr("width", d => barWidth(d.reps))
      .attr("height", d => height - yScale(d.weight))
      .attr("fill", (d) => {
        if (d.zone === "warmup") return "seagreen";
        if (d.zone === "worksets") return "steelblue";
        return "lightcoral";
      });

    svgGroup.selectAll(".bar-weight")
      .data(chartData)
      .enter()
      .append("text")
      .attr("class", "bar-weight")
      .attr("x", (d, i) => midPoints[i])
      .attr("y", d => yScale(d.weight) - 10)
      .attr("text-anchor", "middle")
      .attr("font-size", "12px")
      .attr("fill", "white")
      .text(d => `${d.weight.toFixed(1)} lbs`)
      .style("fill", "var(--primary)");

    svgGroup.selectAll(".bar-reps")
      .data(chartData)
      .enter()
      .append("g")
      .attr("class", "bar-rep-group")
      .append("text")
      .attr("class", "bar-reps")
      .attr("x", (d, i) => midPoints[i])
      .attr("y", (d) => yScale(d.weight) + (height - yScale(d.weight)) / 2)
      .attr("text-anchor", "middle")
      .attr("font-size", "14px")
      .attr("fill", "var(--theme)")
      .attr("font-weight", "bold")
      .text(d => `${d.reps} reps`)
      .style("z-index", "10");

    const zoneMidpoints = {
      warmup: (midPoints[0] + midPoints[2]) / 2,
      worksets: (midPoints[3] + midPoints[5]) / 2,
      dropsets: (midPoints[6] + midPoints[7]) / 2
    };

    svgGroup.selectAll(".zone-label")
      .data(Object.keys(zoneMidpoints))
      .enter()
      .append("text")
      .attr("class", "zone-label")
      .attr("x", d => zoneMidpoints[d])
      .attr("y", height + 25)
      .attr("text-anchor", "middle")
      .attr("font-size", "14px")
      .text(d => d.charAt(0).toUpperCase() + d.slice(1))
      .style("fill", "var(--primary)");

    const totalWidth = chartData.reduce((acc, d) => acc + barWidth(d.reps) + spacing, 0);
    svgGroup.append("g")
      .attr("class", "x-axis")
      .attr("transform", `translate(0, ${height})`)
      .append("line")
      .attr("x1", 0)
      .attr("x2", totalWidth)
      .attr("y1", 0)
      .attr("y2", 0)
      .style("stroke", "var(--primary)")
      .style("stroke-width", "1px");

    svgGroup.append("g")
      .call(d3.axisLeft(yScale));

    svgGroup.selectAll(".axis text")
      .style("font-size", "14px")
      .style("fill", "var(--primary)");

    d3.select(".progression-chart")
      .style("background", "var(--code-bg)")
      .style("border", "1px solid var(--border)")
      .style("border-radius", "var(--radius)")
      .style("padding", "1rem");
  }

  document.getElementById('weight').addEventListener('input', (event) => {
    inputWeight = parseInt(event.target.value);
    progression_updateChart();
  });

  document.getElementById('reps').addEventListener('input', (event) => {
    inputReps = parseInt(event.target.value);
    progression_updateChart();
  });

  progression_updateChart();
</script>


<h3 id="possible-improvements">Possible Improvements</h3>
<ul>
<li>
<p>Create a similar pathway table for the goal of adding a rep, instead of adding $5 \text{lbs}$ to the bar.  Will take a good amount of effort.</p>
</li>
<li>
<p>Implement a pyramid scheme with broader rep ranges in the progression chart histogram. I haven&rsquo;t thought much about this yet, but when I can hit 7 reps on heavy compound lifts, I feel like I&rsquo;m entering a moderately safe 7–12 rep range. At that point, the effort level shifts to something different.</p>
</li>
<li>
<p><del>The Epley model is just one of many. I haven&rsquo;t explored the others yet because I could solve this with fractional arithmetic in my head while &ldquo;ape-brained&rdquo; in the gym. However, adding a dropdown toggle to choose different models, and referring to recent literature on advancements in curve fitting, would make this tool more robust.</del> Similar to how the Opus audio codec performs at different fidelities with various bitrates, I&rsquo;m sure that the pathway from 1RM to 30RM follows a more complex, multi-fitted approach.</p>
</li>
</ul>
<h3 id="references">References</h3>
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p><a href="https://opensiuc.lib.siu.edu/cgi/viewcontent.cgi?article=1744&amp;context=gs_rp">https://opensiuc.lib.siu.edu/cgi/viewcontent.cgi?article=1744&amp;context=gs_rp</a>&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a>&#160;<a href="#fnref1:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:2">
<p><a href="https://scholar.google.com/scholar?hl=en&amp;as_sdt=0%2C23&amp;q=+Epley%2C+Boyd+%281985%29.+%22Poundage+Chart%22.+Boyd+Epley+Workout.+Lincoln%2C+NE%3A+Body+Enterprises.+p.+86.+&amp;btnG=">https://scholar.google.com/scholar?hl=en&amp;as_sdt=0%2C23&amp;q=+Epley%2C+Boyd+%281985%29.+%22Poundage+Chart%22.+Boyd+Epley+Workout.+Lincoln%2C+NE%3A+Body+Enterprises.+p.+86.+&amp;btnG=</a>&#160;<a href="#fnref:2" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:3">
<p><a href="https://scholar.google.com/scholar?hl=en&amp;as_sdt=0%2C23&amp;q=+Brzycki%2C+Matt+%281998%29.+A+Practical+Approach+To+Strength+Training.+McGraw-Hill.+ISBN+978-1-57028-018-4.+&amp;btnG=">https://scholar.google.com/scholar?hl=en&amp;as_sdt=0%2C23&amp;q=+Brzycki%2C+Matt+%281998%29.+A+Practical+Approach+To+Strength+Training.+McGraw-Hill.+ISBN+978-1-57028-018-4.+&amp;btnG=</a>&#160;<a href="#fnref:3" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:4">
<p><a href="https://www.unm.edu/~rrobergs/478RMStrengthPrediction.pdf">https://www.unm.edu/~rrobergs/478RMStrengthPrediction.pdf</a>&#160;<a href="#fnref:4" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:5">
<p><a href="https://www.medicalalgorithms.com/equation-of-oconnor-et-al-for-predicting-the-one-repetition-maximum-1-rm">https://www.medicalalgorithms.com/equation-of-oconnor-et-al-for-predicting-the-one-repetition-maximum-1-rm</a>&#160;<a href="#fnref:5" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:6">
<p><a href="https://www.researchgate.net/profile/Marcelo-Silva-12/post/Prediction_of_1RM_in_muscular_strength_what_is_the_better_7-10_rep_or_5-7_rep/attachment/59d6235b79197b8077981b20/AS%3A306915098202113%401450185669112/download/478RMStrengthPrediction.pdf">https://www.researchgate.net/profile/Marcelo-Silva-12/post/Prediction_of_1RM_in_muscular_strength_what_is_the_better_7-10_rep_or_5-7_rep/attachment/59d6235b79197b8077981b20/AS%3A306915098202113%401450185669112/download/478RMStrengthPrediction.pdf</a>&#160;<a href="#fnref:6" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div>
]]></content:encoded>
    </item>
  </channel>
</rss>
