{"id":24835,"date":"2026-09-08T00:31:27","date_gmt":"2026-09-08T00:31:27","guid":{"rendered":"https:\/\/www.mechstream.com\/?p=24835"},"modified":"2026-09-08T00:49:21","modified_gmt":"2026-09-08T00:49:21","slug":"strain-hardening-exponent-n-calculator","status":"publish","type":"post","link":"https:\/\/www.mechstream.com\/fr\/strain-hardening-exponent-n-calculator\/","title":{"rendered":"Strain Hardening Exponent n Calculator"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">The <strong>Strain Hardening Exponent n Calculator<\/strong> is a practical engineering tool designed to calculate the strain hardening exponent (n-value) from tensile test data using the Hollomon equation. It helps engineers analyze true stress, true plastic strain, strength coefficient, and material work-hardening behavior. The Strain Hardening Exponent n Calculator is useful for sheet metal forming, material characterization, tensile testing, stamping analysis, and comparing the formability of different engineering materials.<\/p>\n\n\n\n<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n  <meta charset=\"UTF-8\">\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n  <title>Strain Hardening Exponent n Calculator<\/title>\n  <style>\n    #ncalc-root {\n      --ncalc-bg: #f4f6f8;\n      --ncalc-panel: #ffffff;\n      --ncalc-border: #d7dde5;\n      --ncalc-text: #17212b;\n      --ncalc-muted: #5b6775;\n      --ncalc-accent: #116466;\n      --ncalc-good: #0f7a3a;\n      --ncalc-warn: #a15c00;\n      color: var(--ncalc-text);\n      background: var(--ncalc-bg);\n      font-family: Inter, system-ui, -apple-system, Segoe UI, Roboto, Arial, sans-serif;\n      line-height: 1.45;\n      padding: 18px;\n    }\n\n    #ncalc-root,\n    #ncalc-root * {\n      box-sizing: border-box;\n    }\n\n    #ncalc-root .ncalc-wrap {\n      max-width: 1440px;\n      margin: 0 auto;\n    }\n\n    #ncalc-root .ncalc-section {\n      background: var(--ncalc-panel);\n      border: 1px solid var(--ncalc-border);\n      border-radius: 10px;\n      box-shadow: 0 1px 0 rgba(17, 24, 39, 0.03);\n      padding: 14px;\n      margin-bottom: 14px;\n    }\n\n    #ncalc-root h2 {\n      margin: 0 0 12px;\n      font-size: 1.05rem;\n      color: var(--ncalc-text);\n    }\n\n    #ncalc-root .ncalc-form-grid {\n      display: grid;\n      gap: 12px;\n      grid-template-columns: repeat(3, minmax(0, 1fr));\n    }\n\n    #ncalc-root .ncalc-field {\n      display: grid;\n      gap: 6px;\n      align-content: start;\n    }\n\n    #ncalc-root .ncalc-field label {\n      font-size: 0.82rem;\n      color: var(--ncalc-muted);\n      margin: 0;\n    }\n\n    #ncalc-root input,\n    #ncalc-root select,\n    #ncalc-root button {\n      width: 100%;\n      max-width: none;\n      border-radius: 8px;\n      border: 1px solid var(--ncalc-border);\n      background: #ffffff;\n      color: var(--ncalc-text);\n      padding: 10px 11px;\n      font: inherit;\n      line-height: 1.3;\n      min-height: 42px;\n    }\n\n    #ncalc-root input:disabled {\n      background: #f2f4f7;\n      color: #64748b;\n    }\n\n    #ncalc-root button {\n      cursor: pointer;\n      font-weight: 600;\n      background: linear-gradient(135deg, var(--ncalc-accent), #145d8c);\n      border-color: transparent;\n      color: #ffffff;\n    }\n\n    #ncalc-root .ncalc-actions {\n      display: flex;\n      justify-content: center;\n      margin-top: 12px;\n    }\n\n    #ncalc-root .ncalc-actions button {\n      width: min(320px, 100%);\n      min-width: 240px;\n    }\n\n    #ncalc-root .ncalc-table-wrap {\n      overflow-x: auto;\n      border: 1px solid var(--ncalc-border);\n      border-radius: 10px;\n      background: #ffffff;\n      margin-top: 12px;\n    }\n\n    #ncalc-root table {\n      width: 100%;\n      min-width: 1160px;\n      border-collapse: collapse;\n      margin: 0;\n    }\n\n    #ncalc-root th,\n    #ncalc-root td {\n      border: 0;\n      border-bottom: 1px solid #e7ecf2;\n      padding: 8px;\n      text-align: left;\n      vertical-align: top;\n    }\n\n    #ncalc-root th {\n      font-size: 0.82rem;\n      color: var(--ncalc-muted);\n      background: #f8fafc;\n      font-weight: 600;\n    }\n\n    #ncalc-root td input {\n      padding: 8px 9px;\n      border-radius: 7px;\n      min-height: 38px;\n    }\n\n    #ncalc-results {\n      display: none;\n    }\n\n    #ncalc-results.ncalc-visible {\n      display: block;\n    }\n\n    #ncalc-root .ncalc-result-grid {\n      display: grid;\n      gap: 12px;\n      grid-template-columns: repeat(4, minmax(0, 1fr));\n    }\n\n    #ncalc-root .ncalc-result-card {\n      border: 1px solid var(--ncalc-border);\n      border-radius: 10px;\n      background: #ffffff;\n      padding: 12px;\n      min-height: 88px;\n    }\n\n    #ncalc-root .ncalc-label {\n      color: var(--ncalc-muted);\n      font-size: 0.82rem;\n      margin-bottom: 6px;\n    }\n\n    #ncalc-root .ncalc-value {\n      font-size: 1.25rem;\n      font-weight: 700;\n      color: var(--ncalc-text);\n    }\n\n    #ncalc-root .ncalc-sub {\n      color: var(--ncalc-muted);\n      font-size: 0.84rem;\n      margin-top: 4px;\n    }\n\n    #ncalc-root .ncalc-message-box {\n      display: grid;\n      gap: 8px;\n      margin-top: 12px;\n    }\n\n    #ncalc-root .ncalc-message {\n      border-left: 4px solid var(--ncalc-accent);\n      background: #f7fbfc;\n      border-radius: 8px;\n      padding: 10px 12px;\n      font-size: 0.92rem;\n    }\n\n    #ncalc-root .ncalc-message.good {\n      border-left-color: var(--ncalc-good);\n    }\n\n    #ncalc-root .ncalc-message.warn {\n      border-left-color: var(--ncalc-warn);\n    }\n\n    @media (max-width: 1180px) {\n      #ncalc-root .ncalc-form-grid,\n      #ncalc-root .ncalc-result-grid {\n        grid-template-columns: 1fr;\n      }\n\n      #ncalc-root table {\n        min-width: 1040px;\n      }\n    }\n  <\/style>\n<\/head>\n<body>\n  <div id=\"ncalc-root\">\n    <div class=\"ncalc-wrap\">\n      <section class=\"ncalc-section\">\n        <h2>Inputs<\/h2>\n        <div class=\"ncalc-form-grid\">\n          <div class=\"ncalc-field\">\n            <label for=\"ncalc-mode\">Calculation mode<\/label>\n            <select id=\"ncalc-mode\">\n              <option value=\"regression\">Multi-Point Regression<\/option>\n              <option value=\"twoPoint\">Two-Point n-Value Calculation<\/option>\n              <option value=\"engineering\">Engineering-to-True Data Conversion<\/option>\n              <option value=\"comparison\">Material Comparison<\/option>\n            <\/select>\n          <\/div>\n          <div class=\"ncalc-field\">\n            <label for=\"ncalc-unit-system\">Unit system<\/label>\n            <select id=\"ncalc-unit-system\">\n              <option value=\"metric\">Metric<\/option>\n              <option value=\"imperial\">Imperial<\/option>\n            <\/select>\n          <\/div>\n          <div class=\"ncalc-field\">\n            <label for=\"ncalc-stress-unit\">Stress \/ E unit<\/label>\n            <select id=\"ncalc-stress-unit\"><\/select>\n          <\/div>\n          <div class=\"ncalc-field\">\n            <label for=\"ncalc-strain-format\">Strain format<\/label>\n            <select id=\"ncalc-strain-format\">\n              <option value=\"decimal\">Decimal<\/option>\n              <option value=\"percent\">Percent<\/option>\n            <\/select>\n          <\/div>\n          <div class=\"ncalc-field\">\n            <label for=\"ncalc-material-preset\">Material preset<\/label>\n            <select id=\"ncalc-material-preset\"><\/select>\n          <\/div>\n          <div class=\"ncalc-field\">\n            <label for=\"ncalc-material-name\">Material name<\/label>\n            <input id=\"ncalc-material-name\" type=\"text\" value=\"Low Carbon Steel\">\n          <\/div>\n          <div class=\"ncalc-field\">\n            <label for=\"ncalc-youngs-modulus\">Young&#8217;s modulus<\/label>\n            <input id=\"ncalc-youngs-modulus\" type=\"number\" step=\"any\" value=\"200000\">\n          <\/div>\n          <div class=\"ncalc-field\">\n            <label for=\"ncalc-stress-type\">Stress data type<\/label>\n            <select id=\"ncalc-stress-type\">\n              <option value=\"trueStress\">True Stress<\/option>\n              <option value=\"engineeringStress\">Engineering Stress<\/option>\n            <\/select>\n          <\/div>\n          <div class=\"ncalc-field\">\n            <label for=\"ncalc-strain-type\">Strain data type<\/label>\n            <select id=\"ncalc-strain-type\">\n              <option value=\"truePlastic\">True Plastic Strain<\/option>\n              <option value=\"trueTotal\">True Total Strain<\/option>\n              <option value=\"engineeringStrain\">Engineering Strain<\/option>\n            <\/select>\n          <\/div>\n          <div class=\"ncalc-field\">\n            <label for=\"ncalc-necking-onset\">Necking onset<\/label>\n            <input id=\"ncalc-necking-onset\" type=\"number\" step=\"any\" value=\"0.18\">\n          <\/div>\n          <div class=\"ncalc-field\">\n            <label for=\"ncalc-range-min\">Min plastic strain<\/label>\n            <input id=\"ncalc-range-min\" type=\"number\" step=\"any\" value=\"0.01\">\n          <\/div>\n          <div class=\"ncalc-field\">\n            <label for=\"ncalc-range-max\">Max plastic strain<\/label>\n            <input id=\"ncalc-range-max\" type=\"number\" step=\"any\" value=\"0.20\">\n          <\/div>\n          <div class=\"ncalc-field\">\n            <label for=\"ncalc-prediction-strain\">Prediction strain<\/label>\n            <input id=\"ncalc-prediction-strain\" type=\"number\" step=\"any\" value=\"0.10\">\n          <\/div>\n          <div class=\"ncalc-field\">\n            <label for=\"ncalc-comparison-strain\">Common comparison strain<\/label>\n            <input id=\"ncalc-comparison-strain\" type=\"number\" step=\"any\" value=\"0.10\">\n          <\/div>\n          <div class=\"ncalc-field\">\n            <label for=\"ncalc-inverse-stress\">Known true stress for inverse strain<\/label>\n            <input id=\"ncalc-inverse-stress\" type=\"number\" step=\"any\" value=\"350\">\n          <\/div>\n          <div class=\"ncalc-field\">\n            <label for=\"ncalc-good-threshold\">Good fit R^2<\/label>\n            <input id=\"ncalc-good-threshold\" type=\"number\" step=\"any\" value=\"0.98\">\n          <\/div>\n          <div class=\"ncalc-field\">\n            <label for=\"ncalc-moderate-threshold\">Moderate fit R^2<\/label>\n            <input id=\"ncalc-moderate-threshold\" type=\"number\" step=\"any\" value=\"0.95\">\n          <\/div>\n        <\/div>\n\n        <div class=\"ncalc-table-wrap\">\n          <table id=\"ncalc-data-table\">\n            <thead>\n              <tr>\n                <th>Point<\/th>\n                <th>Engineering Strain<\/th>\n                <th>Engineering Stress<\/th>\n                <th>True Strain<\/th>\n                <th>True Stress<\/th>\n                <th>True Plastic Strain<\/th>\n                <th>ln(True Plastic Strain)<\/th>\n                <th>ln(True Stress)<\/th>\n              <\/tr>\n            <\/thead>\n            <tbody><\/tbody>\n          <\/table>\n        <\/div>\n\n        <div class=\"ncalc-actions\">\n          <button id=\"ncalc-calculate\" type=\"button\">Calculate<\/button>\n        <\/div>\n      <\/section>\n\n      <section class=\"ncalc-section\" id=\"ncalc-results\">\n        <h2>Results<\/h2>\n        <div class=\"ncalc-result-grid\">\n          <div class=\"ncalc-result-card\">\n            <div class=\"ncalc-label\">Strain hardening exponent n<\/div>\n            <div class=\"ncalc-value\" id=\"ncalc-out-n\">&#8212;<\/div>\n            <div class=\"ncalc-sub\">Dimensionless<\/div>\n          <\/div>\n          <div class=\"ncalc-result-card\">\n            <div class=\"ncalc-label\">Strength coefficient K<\/div>\n            <div class=\"ncalc-value\" id=\"ncalc-out-k\">&#8212;<\/div>\n            <div class=\"ncalc-sub\" id=\"ncalc-out-k-unit\">&#8212;<\/div>\n          <\/div>\n          <div class=\"ncalc-result-card\">\n            <div class=\"ncalc-label\">Regression R^2<\/div>\n            <div class=\"ncalc-value\" id=\"ncalc-out-r2\">&#8212;<\/div>\n            <div class=\"ncalc-sub\" id=\"ncalc-out-fit\">Fit quality pending<\/div>\n          <\/div>\n          <div class=\"ncalc-result-card\">\n            <div class=\"ncalc-label\">Intercept ln(K)<\/div>\n            <div class=\"ncalc-value\" id=\"ncalc-out-intercept\">&#8212;<\/div>\n            <div class=\"ncalc-sub\">Regression intercept<\/div>\n          <\/div>\n          <div class=\"ncalc-result-card\">\n            <div class=\"ncalc-label\">Valid points<\/div>\n            <div class=\"ncalc-value\" id=\"ncalc-out-count\">&#8212;<\/div>\n            <div class=\"ncalc-sub\" id=\"ncalc-out-range\">Selected strain range pending<\/div>\n          <\/div>\n          <div class=\"ncalc-result-card\">\n            <div class=\"ncalc-label\">Predicted stress<\/div>\n            <div class=\"ncalc-value\" id=\"ncalc-out-pred-stress\">&#8212;<\/div>\n            <div class=\"ncalc-sub\">At chosen plastic strain<\/div>\n          <\/div>\n          <div class=\"ncalc-result-card\">\n            <div class=\"ncalc-label\">Inverse strain<\/div>\n            <div class=\"ncalc-value\" id=\"ncalc-out-inv-strain\">&#8212;<\/div>\n            <div class=\"ncalc-sub\">From chosen stress<\/div>\n          <\/div>\n          <div class=\"ncalc-result-card\">\n            <div class=\"ncalc-label\">Uniform true strain reference<\/div>\n            <div class=\"ncalc-value\" id=\"ncalc-out-uniform\">&#8212;<\/div>\n            <div class=\"ncalc-sub\">Idealized Considere reference<\/div>\n          <\/div>\n        <\/div>\n        <div class=\"ncalc-message-box\" id=\"ncalc-message-box\"><\/div>\n      <\/section>\n    <\/div>\n  <\/div>\n\n  <script>\n    (function () {\n      \"use strict\";\n\n      function both(a, b) {\n        return a ? b : a;\n      }\n\n      var presets = {\n        metric: [\n          { name: \"Low Carbon Steel\", e: 200000 },\n          { name: \"High Strength Steel\", e: 210000 },\n          { name: \"Stainless Steel\", e: 193000 },\n          { name: \"Aluminum Alloy\", e: 70000 },\n          { name: \"Copper Alloy\", e: 117000 },\n          { name: \"Brass\", e: 100000 },\n          { name: \"Titanium Alloy\", e: 116000 },\n          { name: \"Custom Material\", e: 0 }\n        ],\n        imperial: [\n          { name: \"Low Carbon Steel\", e: 29000 },\n          { name: \"High Strength Steel\", e: 30500 },\n          { name: \"Stainless Steel\", e: 28000 },\n          { name: \"Aluminum Alloy\", e: 10000 },\n          { name: \"Copper Alloy\", e: 17000 },\n          { name: \"Brass\", e: 14500 },\n          { name: \"Titanium Alloy\", e: 16800 },\n          { name: \"Custom Material\", e: 0 }\n        ]\n      };\n\n      var stressUnitOptions = {\n        metric: [\"MPa\", \"GPa\"],\n        imperial: [\"psi\", \"ksi\"]\n      };\n      var unitFactors = {\n        MPa: 1,\n        GPa: 1000,\n        psi: 0.006894757,\n        ksi: 6.894757\n      };\n      var defaultRows = [\n        { truePlastic: 0.02, trueStress: 350 },\n        { truePlastic: 0.05, trueStress: 420 },\n        { truePlastic: 0.10, trueStress: 485 },\n        { truePlastic: 0.15, trueStress: 525 },\n        { truePlastic: 0.20, trueStress: 555 }\n      ];\n\n      var root = document.getElementById(\"ncalc-root\");\n      if (!root) return;\n\n      function byId(id) {\n        return root.querySelector(\"#\" + id);\n      }\n\n      var els = {\n        mode: byId(\"ncalc-mode\"),\n        unitSystem: byId(\"ncalc-unit-system\"),\n        stressUnit: byId(\"ncalc-stress-unit\"),\n        strainFormat: byId(\"ncalc-strain-format\"),\n        materialPreset: byId(\"ncalc-material-preset\"),\n        materialName: byId(\"ncalc-material-name\"),\n        youngsModulus: byId(\"ncalc-youngs-modulus\"),\n        stressType: byId(\"ncalc-stress-type\"),\n        strainType: byId(\"ncalc-strain-type\"),\n        neckingOnset: byId(\"ncalc-necking-onset\"),\n        rangeMin: byId(\"ncalc-range-min\"),\n        rangeMax: byId(\"ncalc-range-max\"),\n        predictionStrain: byId(\"ncalc-prediction-strain\"),\n        comparisonStrain: byId(\"ncalc-comparison-strain\"),\n        inverseStress: byId(\"ncalc-inverse-stress\"),\n        goodThreshold: byId(\"ncalc-good-threshold\"),\n        moderateThreshold: byId(\"ncalc-moderate-threshold\"),\n        calcBtn: byId(\"ncalc-calculate\"),\n        dataBody: root.querySelector(\"#ncalc-data-table tbody\"),\n        outN: byId(\"ncalc-out-n\"),\n        outK: byId(\"ncalc-out-k\"),\n        outR2: byId(\"ncalc-out-r2\"),\n        outIntercept: byId(\"ncalc-out-intercept\"),\n        outCount: byId(\"ncalc-out-count\"),\n        outRange: byId(\"ncalc-out-range\"),\n        outFit: byId(\"ncalc-out-fit\"),\n        outPredStress: byId(\"ncalc-out-pred-stress\"),\n        outInvStrain: byId(\"ncalc-out-inv-strain\"),\n        outUniform: byId(\"ncalc-out-uniform\"),\n        outKUnit: byId(\"ncalc-out-k-unit\"),\n        messageBox: byId(\"ncalc-message-box\"),\n        resultsSection: byId(\"ncalc-results\")\n      };\n\n      var state = {\n        lastStressUnit: \"MPa\",\n        lastStrainPercent: false\n      };\n\n      function formatNumber(value, digits) {\n        var abs;\n        digits = typeof digits === \"number\" ? digits : 4;\n        if (!isFinite(value)) return \"--\";\n        abs = Math.abs(value);\n        if (abs === 0) return \"0\";\n        if (abs >= 1000) return value.toFixed(1);\n        if (abs >= 100) return value.toFixed(2);\n        if (abs >= 10) return value.toFixed(3);\n        return value.toFixed(digits);\n      }\n\n      function parseValue(raw) {\n        var cleaned;\n        var n;\n        if (raw === \"\" || raw === null || typeof raw === \"undefined\") return null;\n        cleaned = String(raw).trim().replace(\/%$\/, \"\");\n        if (cleaned === \"\") return null;\n        n = Number(cleaned);\n        return isFinite(n) ? n : null;\n      }\n\n      function isPercent() {\n        return els.strainFormat.value === \"percent\";\n      }\n\n      function fromDecimalStrain(value) {\n        if (!isFinite(value)) return \"\";\n        return isPercent() ? value * 100 : value;\n      }\n\n      function currentStressUnit() {\n        return els.stressUnit.value || (els.unitSystem.value === \"metric\" ? \"MPa\" : \"ksi\");\n      }\n\n      function stressToMPa(value) {\n        return parseFloat(value) * unitFactors[currentStressUnit()];\n      }\n\n      function mpaToStress(value) {\n        return value \/ unitFactors[currentStressUnit()];\n      }\n\n      function currentE() {\n        return stressToMPa(els.youngsModulus.value);\n      }\n\n      function showResults() {\n        els.resultsSection.className = \"ncalc-section ncalc-visible\";\n      }\n\n      function hideResults() {\n        els.resultsSection.className = \"ncalc-section\";\n      }\n\n      function addMessage(type, text) {\n        var div = document.createElement(\"div\");\n        div.className = \"ncalc-message \" + type;\n        div.appendChild(document.createTextNode(text));\n        els.messageBox.appendChild(div);\n      }\n\n      function clearMessages() {\n        els.messageBox.innerHTML = \"\";\n      }\n\n      function getFieldValue(tr, field) {\n        var input = tr.querySelector('[data-field=\"' + field + '\"]');\n        return input ? input.value : \"\";\n      }\n\n      function createRow(data) {\n        var tr = document.createElement(\"tr\");\n        var fields = [\n          [\"engStrain\", data.engStrain || \"\"],\n          [\"engStress\", data.engStress || \"\"],\n          [\"trueStrain\", data.trueStrain || \"\"],\n          [\"trueStress\", data.trueStress || \"\"],\n          [\"truePlastic\", data.truePlastic || \"\"],\n          [\"lnPlastic\", \"\"],\n          [\"lnStress\", \"\"]\n        ];\n        var tdIndex = document.createElement(\"td\");\n        tdIndex.className = \"ncalc-row-index\";\n        tr.appendChild(tdIndex);\n        fields.forEach(function (field) {\n          var td = document.createElement(\"td\");\n          var input = document.createElement(\"input\");\n          input.setAttribute(\"data-field\", field[0]);\n          input.type = field[0] === \"lnPlastic\" || field[0] === \"lnStress\" ? \"text\" : \"number\";\n          input.step = \"any\";\n          input.value = field[1];\n          if (field[0] === \"lnPlastic\" || field[0] === \"lnStress\") input.readOnly = true;\n          input.addEventListener(\"input\", hideResults);\n          input.addEventListener(\"paste\", handleTablePaste);\n          td.appendChild(input);\n          tr.appendChild(td);\n        });\n        return tr;\n      }\n\n      function setRows(rows) {\n        els.dataBody.innerHTML = \"\";\n        rows.forEach(function (row) {\n          els.dataBody.appendChild(createRow(row));\n        });\n        Array.prototype.forEach.call(els.dataBody.querySelectorAll(\"tr\"), function (tr, idx) {\n          tr.querySelector(\".ncalc-row-index\").appendChild(document.createTextNode(String(idx + 1)));\n        });\n      }\n\n      function populatePresetSelect() {\n        var list = presets[els.unitSystem.value];\n        els.materialPreset.innerHTML = \"\";\n        list.forEach(function (item) {\n          var opt = document.createElement(\"option\");\n          opt.value = item.name;\n          opt.appendChild(document.createTextNode(item.name));\n          els.materialPreset.appendChild(opt);\n        });\n      }\n\n      function updateUnitOptions() {\n        els.stressUnit.innerHTML = \"\";\n        stressUnitOptions[els.unitSystem.value].forEach(function (unit) {\n          var opt = document.createElement(\"option\");\n          opt.value = unit;\n          opt.appendChild(document.createTextNode(unit));\n          els.stressUnit.appendChild(opt);\n        });\n        els.stressUnit.value = els.unitSystem.value === \"metric\" ? \"MPa\" : \"ksi\";\n      }\n\n      function applyPreset() {\n        var list = presets[els.unitSystem.value];\n        var preset = null;\n        list.forEach(function (item) {\n          if (item.name === els.materialPreset.value) preset = item;\n        });\n        if (!preset) return;\n        els.materialName.value = preset.name;\n        els.youngsModulus.value = preset.e ? formatNumber(preset.e, 3).replace(\/\\.?0+$\/, \"\") : \"\";\n      }\n\n      function convertDisplayedStressFields(fromUnit, toUnit) {\n        var factor;\n        if (!fromUnit || !toUnit || fromUnit === toUnit) return;\n        factor = unitFactors[fromUnit] \/ unitFactors[toUnit];\n        [els.youngsModulus, els.inverseStress].forEach(function (field) {\n          var val = parseFloat(field.value);\n          if (isFinite(val)) field.value = formatNumber(val * factor, 4);\n        });\n        Array.prototype.forEach.call(els.dataBody.querySelectorAll(\"tr\"), function (tr) {\n          [\"engStress\", \"trueStress\"].forEach(function (fieldName) {\n            var input = tr.querySelector('[data-field=\"' + fieldName + '\"]');\n            var val = input ? parseFloat(input.value) : NaN;\n            if (both(input, isFinite(val))) input.value = formatNumber(val * factor, 4);\n          });\n        });\n      }\n\n      function convertDisplayedStrainFields(fromPercent, toPercent) {\n        var factor;\n        if (fromPercent === toPercent) return;\n        factor = fromPercent ? 0.01 : 100;\n        [els.neckingOnset, els.rangeMin, els.rangeMax, els.predictionStrain, els.comparisonStrain].forEach(function (field) {\n          var val = parseFloat(field.value);\n          if (isFinite(val)) field.value = formatNumber(val * factor, 5);\n        });\n        Array.prototype.forEach.call(els.dataBody.querySelectorAll(\"tr\"), function (tr) {\n          [\"engStrain\", \"trueStrain\", \"truePlastic\"].forEach(function (fieldName) {\n            var input = tr.querySelector('[data-field=\"' + fieldName + '\"]');\n            var val = input ? parseFloat(input.value) : NaN;\n            if (both(input, isFinite(val))) input.value = formatNumber(val * factor, 6);\n          });\n        });\n      }\n\n      function handleTablePaste(event) {\n        var text = event.clipboardData ? event.clipboardData.getData(\"text\") : \"\";\n        var startCell;\n        var startRow;\n        var rows;\n        var tableRows;\n        var rowIndex;\n        var fieldOrder = [\"engStrain\", \"engStress\", \"trueStrain\", \"trueStress\", \"truePlastic\"];\n        var startInput;\n        var startIndex;\n        if (!text || both(text.indexOf(\"\\n\") === -1, text.indexOf(\"\\t\") === -1)) return;\n        event.preventDefault();\n        startCell = event.target.closest(\"td\");\n        startRow = event.target.closest(\"tr\");\n        rows = text.trim().split(\/\\r?\\n\/).map(function (line) {\n          return line.split(\/[\\t,;]+\/);\n        });\n        tableRows = Array.prototype.slice.call(els.dataBody.querySelectorAll(\"tr\"));\n        rowIndex = tableRows.indexOf(startRow);\n        startInput = startCell ? startCell.querySelector(\"input[data-field]\") : null;\n        startIndex = fieldOrder.indexOf(startInput ? startInput.getAttribute(\"data-field\") : \"\");\n        rows.forEach(function (values, r) {\n          var targetRow = tableRows[rowIndex + r];\n          if (!targetRow) return;\n          values.forEach(function (value, c) {\n            var field = fieldOrder[(startIndex >= 0 ? startIndex : 0) + c];\n            var input = targetRow.querySelector('[data-field=\"' + field + '\"]');\n            if (input) input.value = value.trim();\n          });\n        });\n        hideResults();\n      }\n\n      function classifyFit(r2) {\n        var good = parseFloat(els.goodThreshold.value) || 0.98;\n        var moderate = parseFloat(els.moderateThreshold.value) || 0.95;\n        if (!isFinite(r2)) return { label: \"Pending\", cls: \"\" };\n        if (r2 >= good) return { label: \"Good\", cls: \"good\" };\n        if (r2 >= moderate) return { label: \"Moderate\", cls: \"warn\" };\n        return { label: \"Poor\", cls: \"warn\" };\n      }\n\n      function convertRow(row) {\n        var strainType = els.strainType.value;\n        var stressType = els.stressType.value;\n        var eModulus = currentE();\n        var engStrain = parseValue(row.engStrain);\n        var engStress = parseValue(row.engStress);\n        var trueStrain = parseValue(row.trueStrain);\n        var trueStress = parseValue(row.trueStress);\n        var truePlastic = parseValue(row.truePlastic);\n\n        if (!isFinite(eModulus) || eModulus <= 0) return { valid: false, warnings: [\"Young's modulus must be greater than zero.\"] };\n\n        if (strainType === \"engineeringStrain\") {\n          if (engStrain === null) return { valid: false, warnings: [] };\n          trueStrain = Math.log(1 + engStrain);\n        } else if (strainType === \"trueTotal\") {\n          if (both(trueStrain === null, engStrain !== null)) trueStrain = Math.log(1 + engStrain);\n        } else if (strainType === \"truePlastic\") {\n          if (truePlastic === null) return { valid: false, warnings: [] };\n        }\n\n        if (stressType === \"engineeringStress\") {\n          if (engStress === null) return { valid: false, warnings: [] };\n          if (strainType === \"engineeringStrain\") {\n            trueStress = engStress * (1 + engStrain);\n          } else if (both(strainType === \"trueTotal\", trueStrain !== null)) {\n            engStrain = Math.exp(trueStrain) - 1;\n            trueStress = engStress * (1 + engStrain);\n          } else if (both(strainType === \"truePlastic\", engStrain !== null)) {\n            trueStress = engStress * (1 + engStrain);\n          } else {\n            return { valid: false, warnings: [] };\n          }\n        } else if (trueStress === null) {\n          return { valid: false, warnings: [] };\n        }\n\n        if (trueStress === null || !isFinite(trueStress) || trueStress <= 0) {\n          return { valid: false, warnings: [\"True stress must be greater than zero.\"] };\n        }\n\n        if (strainType === \"truePlastic\") {\n          if (!isFinite(truePlastic) || truePlastic <= 0) {\n            return { valid: false, warnings: [\"True plastic strain must be greater than zero.\"] };\n          }\n        } else {\n          if (!isFinite(trueStrain)) return { valid: false, warnings: [] };\n          truePlastic = trueStrain - trueStress \/ eModulus;\n        }\n\n        if (!isFinite(truePlastic) || truePlastic <= 0) {\n          return { valid: false, warnings: [\"Negative or zero plastic strain after conversion.\"] };\n        }\n\n        return {\n          valid: true,\n          engStrain: engStrain,\n          engStress: engStress,\n          trueStrain: trueStrain,\n          trueStress: trueStress,\n          truePlastic: truePlastic,\n          lnPlastic: Math.log(truePlastic),\n          lnStress: Math.log(trueStress),\n          warnings: []\n        };\n      }\n\n      function regress(points) {\n        var n = points.length;\n        var meanX = points.reduce(function (s, p) { return s + p.x; }, 0) \/ n;\n        var meanY = points.reduce(function (s, p) { return s + p.y; }, 0) \/ n;\n        var sxx = points.reduce(function (s, p) { return s + Math.pow(p.x - meanX, 2); }, 0);\n        var sxy = points.reduce(function (s, p) { return s + (p.x - meanX) * (p.y - meanY); }, 0);\n        var slope = sxy \/ sxx;\n        var intercept = meanY - slope * meanX;\n        var predictions = points.map(function (p) { return intercept + slope * p.x; });\n        var ssRes = points.reduce(function (s, p, i) { return s + Math.pow(p.y - predictions[i], 2); }, 0);\n        var ssTot = points.reduce(function (s, p) { return s + Math.pow(p.y - meanY, 2); }, 0);\n        var r2 = ssTot === 0 ? 1 : 1 - ssRes \/ ssTot;\n        return { slope: slope, intercept: intercept, r2: r2 };\n      }\n\n      function renderTablePreview(rows) {\n        Array.prototype.forEach.call(els.dataBody.querySelectorAll(\"tr\"), function (tr, idx) {\n          var row = rows[idx];\n          var lnPlastic = tr.querySelector('[data-field=\"lnPlastic\"]');\n          var lnStress = tr.querySelector('[data-field=\"lnStress\"]');\n          if (both(row, row.valid)) {\n            if (lnPlastic) lnPlastic.value = formatNumber(row.lnPlastic, 6);\n            if (lnStress) lnStress.value = formatNumber(row.lnStress, 6);\n          } else {\n            if (lnPlastic) lnPlastic.value = \"\";\n            if (lnStress) lnStress.value = \"\";\n          }\n        });\n      }\n\n      function calculate() {\n        var rawRows;\n        var conversionRows;\n        var warnings = [];\n        var validRows;\n        var min;\n        var max;\n        var filtered;\n        var points;\n        var twoPointMode;\n        var requiredPoints;\n        var result = null;\n        var n;\n        var intercept;\n        var kValue;\n        var fit;\n        var predStrain;\n        var invStress;\n        var predictedStress;\n        var inverseStrain;\n\n        showResults();\n        clearMessages();\n\n        rawRows = Array.prototype.map.call(els.dataBody.querySelectorAll(\"tr\"), function (tr) {\n          return {\n            engStrain: getFieldValue(tr, \"engStrain\"),\n            engStress: getFieldValue(tr, \"engStress\"),\n            trueStrain: getFieldValue(tr, \"trueStrain\"),\n            trueStress: getFieldValue(tr, \"trueStress\"),\n            truePlastic: getFieldValue(tr, \"truePlastic\")\n          };\n        });\n\n        conversionRows = rawRows.map(convertRow);\n        conversionRows.forEach(function (row) {\n          row.warnings.forEach(function (warning) {\n            warnings.push(warning);\n          });\n        });\n        renderTablePreview(conversionRows);\n\n        validRows = conversionRows.filter(function (row) {\n          return row.valid;\n        });\n        min = parseValue(els.rangeMin.value);\n        max = parseValue(els.rangeMax.value);\n        if (both(both(min !== null, max !== null), min > max)) {\n          var temp = min;\n          min = max;\n          max = temp;\n        }\n\n        filtered = validRows.filter(function (row) {\n          if (both(min !== null, row.truePlastic < min)) return false;\n          if (both(max !== null, row.truePlastic > max)) return false;\n          return true;\n        });\n\n        points = filtered.map(function (row) {\n          return { x: Math.log(row.truePlastic), y: Math.log(row.trueStress), row: row };\n        });\n        twoPointMode = els.mode.value === \"twoPoint\";\n        requiredPoints = twoPointMode ? 2 : 3;\n        if (points.length < requiredPoints) {\n          warnings.push(twoPointMode ? \"Two-point calculation requires at least two valid points.\" : \"Regression requires at least three valid points.\");\n        }\n\n        if (both(twoPointMode, points.length >= 2)) {\n          result = regress(points);\n          n = Math.log(filtered[1].trueStress \/ filtered[0].trueStress) \/ Math.log(filtered[1].truePlastic \/ filtered[0].truePlastic);\n          intercept = Math.log(filtered[0].trueStress) - n * Math.log(filtered[0].truePlastic);\n          result = { slope: n, intercept: intercept, r2: result.r2 };\n        } else if (both(!twoPointMode, points.length >= 3)) {\n          result = regress(points);\n        }\n\n        if (result) {\n          n = result.slope;\n          kValue = Math.exp(result.intercept);\n          fit = classifyFit(result.r2);\n          predStrain = parseValue(els.predictionStrain.value);\n          invStress = parseValue(els.inverseStress.value);\n          predictedStress = both(predStrain, predStrain > 0) ? kValue * Math.pow(predStrain, n) : null;\n          inverseStrain = both(both(invStress, invStress > 0), n !== 0) ? Math.pow(invStress \/ kValue, 1 \/ n) : null;\n\n          els.outN.textContent = formatNumber(n, 5);\n          els.outK.textContent = formatNumber(mpaToStress(kValue), 4);\n          els.outR2.textContent = formatNumber(result.r2, 4);\n          els.outIntercept.textContent = formatNumber(result.intercept, 5);\n          els.outCount.textContent = String(filtered.length);\n          els.outRange.textContent = \"Used \" + (min !== null ? fromDecimalStrain(min) : \"auto\") + \" to \" + (max !== null ? fromDecimalStrain(max) : \"auto\") + \" (\" + els.strainFormat.value + \")\";\n          els.outFit.textContent = \"Fit quality: \" + fit.label;\n          els.outKUnit.textContent = currentStressUnit();\n          els.outPredStress.textContent = predictedStress !== null ? formatNumber(mpaToStress(predictedStress), 4) + \" \" + currentStressUnit() : \"--\";\n          els.outInvStrain.textContent = inverseStrain !== null ? formatNumber(inverseStrain, 5) : \"--\";\n          els.outUniform.textContent = formatNumber(n, 5) + \" \/ \" + formatNumber(Math.exp(n) - 1, 5);\n        } else {\n          els.outN.textContent = \"--\";\n          els.outK.textContent = \"--\";\n          els.outR2.textContent = \"--\";\n          els.outIntercept.textContent = \"--\";\n          els.outCount.textContent = \"--\";\n          els.outRange.textContent = \"Selected strain range pending\";\n          els.outFit.textContent = \"Fit quality pending\";\n          els.outKUnit.textContent = currentStressUnit();\n          els.outPredStress.textContent = \"--\";\n          els.outInvStrain.textContent = \"--\";\n          els.outUniform.textContent = \"--\";\n        }\n\n        warnings.filter(function (value, index, array) {\n          return array.indexOf(value) === index;\n        }).forEach(function (warning) {\n          addMessage(\"warn\", warning);\n        });\n        if (both(!warnings.length, result)) addMessage(\"good\", \"Computed n = \" + formatNumber(n, 5) + \" with \" + filtered.length + \" valid points.\");\n      }\n\n      function wireEvents() {\n        var controls = [\n          els.mode, els.unitSystem, els.stressUnit, els.strainFormat, els.materialPreset, els.materialName,\n          els.youngsModulus, els.stressType, els.strainType, els.neckingOnset, els.rangeMin, els.rangeMax,\n          els.predictionStrain, els.comparisonStrain, els.inverseStress, els.goodThreshold, els.moderateThreshold\n        ];\n        controls.forEach(function (el) {\n          el.addEventListener(\"input\", function () {\n            var oldUnit;\n            var newUnit;\n            var fromPercent;\n            var toPercent;\n            hideResults();\n            if (el === els.unitSystem) {\n              oldUnit = state.lastStressUnit || currentStressUnit();\n              updateUnitOptions();\n              populatePresetSelect();\n              applyPreset();\n              newUnit = currentStressUnit();\n              if (oldUnit !== newUnit) convertDisplayedStressFields(oldUnit, newUnit);\n              state.lastStressUnit = newUnit;\n            }\n            if (el === els.stressUnit) {\n              oldUnit = state.lastStressUnit || currentStressUnit();\n              newUnit = currentStressUnit();\n              if (oldUnit !== newUnit) convertDisplayedStressFields(oldUnit, newUnit);\n              state.lastStressUnit = newUnit;\n            }\n            if (el === els.strainFormat) {\n              fromPercent = state.lastStrainPercent || false;\n              toPercent = isPercent();\n              if (fromPercent !== toPercent) convertDisplayedStrainFields(fromPercent, toPercent);\n              state.lastStrainPercent = toPercent;\n            }\n            if (el === els.materialPreset) applyPreset();\n          });\n        });\n        els.calcBtn.addEventListener(\"click\", calculate);\n      }\n\n      function init() {\n        updateUnitOptions();\n        populatePresetSelect();\n        setRows(defaultRows);\n        els.materialPreset.value = \"Low Carbon Steel\";\n        applyPreset();\n        els.materialName.value = \"Low Carbon Steel\";\n        els.stressType.value = \"trueStress\";\n        els.strainType.value = \"truePlastic\";\n        els.youngsModulus.value = 200000;\n        state.lastStressUnit = currentStressUnit();\n        state.lastStrainPercent = isPercent();\n        wireEvents();\n        hideResults();\n      }\n\n      init();\n    }());\n  <\/script>\n<\/body>\n<\/html>\n","protected":false},"excerpt":{"rendered":"<p>The Strain Hardening Exponent n Calculator is a practical engineering tool designed to calculate the strain hardening exponent (n-value) from tensile test data using the&#8230;<\/p>","protected":false},"author":2,"featured_media":24836,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"pmpro_default_level":"","_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_feature_clip_id":0,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_post_was_ever_published":false},"categories":[8647],"tags":[8696,8697,8698,8682],"class_list":["post-24835","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-materials-science-and-properties","tag-hollomon-equation","tag-material-formability","tag-strain-hardening","tag-tensile-testing","pmpro-has-access"],"acf":[],"jetpack_sharing_enabled":true,"jetpack_featured_media_url":"https:\/\/www.mechstream.com\/wp-content\/uploads\/2026\/09\/Strain-Hardening-Exponent-n-Calculator.png","_links":{"self":[{"href":"https:\/\/www.mechstream.com\/fr\/wp-json\/wp\/v2\/posts\/24835","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.mechstream.com\/fr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.mechstream.com\/fr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.mechstream.com\/fr\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.mechstream.com\/fr\/wp-json\/wp\/v2\/comments?post=24835"}],"version-history":[{"count":0,"href":"https:\/\/www.mechstream.com\/fr\/wp-json\/wp\/v2\/posts\/24835\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.mechstream.com\/fr\/wp-json\/wp\/v2\/media\/24836"}],"wp:attachment":[{"href":"https:\/\/www.mechstream.com\/fr\/wp-json\/wp\/v2\/media?parent=24835"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.mechstream.com\/fr\/wp-json\/wp\/v2\/categories?post=24835"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.mechstream.com\/fr\/wp-json\/wp\/v2\/tags?post=24835"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}