{"id":100010,"date":"2026-02-15T20:05:54","date_gmt":"2026-02-15T20:05:54","guid":{"rendered":"https:\/\/vibromera.eu\/?post_type=calculator&#038;p=100010"},"modified":"2026-02-15T20:05:54","modified_gmt":"2026-02-15T20:05:54","slug":"balancing-platform","status":"publish","type":"calculator","link":"https:\/\/vibromera.eu\/vi\/calculators\/balancing-platform\/","title":{"rendered":"C\u00f4ng c\u1ee5 t\u00ednh to\u00e1n thi\u1ebft k\u1ebf b\u1ec7 c\u00e2n b\u1eb1ng \u2014 L\u1ef1a ch\u1ecdn l\u00f2 xo cho vi\u1ec7c c\u00e2n b\u1eb1ng tr\u01b0\u1eddng | C\u00f4ng c\u1ee5 tr\u1ef1c tuy\u1ebfn mi\u1ec5n ph\u00ed"},"content":{"rendered":"\n<script type=\"application\/ld+json\">\n{\"@context\":\"https:\/\/schema.org\",\"@type\":\"WebApplication\",\"name\":\"Balancing Platform Design Calculator\",\"alternateName\":[\"Soft Support Calculator\",\"Platform Spring Selection\"],\"description\":\"Design a balancing platform for field rotor balancing. Calculate required spring stiffness, natural frequency, static deflection, and transmissibility.\",\"url\":\"https:\/\/vibromera.eu\/calculators\/balancing-platform-design\/\",\"applicationCategory\":\"Engineering Calculator\",\"operatingSystem\":\"Any (Web Browser)\",\"offers\":{\"@type\":\"Offer\",\"price\":\"0\",\"priceCurrency\":\"EUR\"},\"creator\":{\"@type\":\"Organization\",\"name\":\"Vibromera\",\"url\":\"https:\/\/vibromera.eu\/\"},\"datePublished\":\"2025-01-01\",\"dateModified\":\"2025-06-14\",\"inLanguage\":\"en\",\"isAccessibleForFree\":true,\"featureList\":[\"Spring stiffness calculation\",\"Natural frequency design\",\"Transmissibility analysis\",\"Metric and Imperial units\",\"Auto-calculation on input change\",\"URL parameter sharing\",\"Calculation history\"],\"keywords\":\"balancing platform, spring selection, soft support, field balancing, transmissibility\"}\n<\/script>\n\n<script type=\"application\/ld+json\">\n{\"@context\":\"https:\/\/schema.org\",\"@type\":\"FAQPage\",\"mainEntity\":[\n{\"@type\":\"Question\",\"name\":\"What is a balancing platform?\",\"acceptedAnswer\":{\"@type\":\"Answer\",\"text\":\"A balancing platform is a simple structure mounted on springs that supports a rotor for field balancing by allowing free vibration response at operating speed. Its natural frequency is tuned well below the rotor's operating speed.\"}},\n{\"@type\":\"Question\",\"name\":\"Why must the platform natural frequency be below operating speed?\",\"acceptedAnswer\":{\"@type\":\"Answer\",\"text\":\"The platform natural frequency must be well below operating speed to ensure the system operates in the isolation region, above resonance. At a frequency ratio of 3, transmissibility drops to about 12.5%.\"}},\n{\"@type\":\"Question\",\"name\":\"How to choose the number of springs for a balancing platform?\",\"acceptedAnswer\":{\"@type\":\"Answer\",\"text\":\"Common configurations: 4 springs for rectangular platforms, 2 for small rotors, 3 for triangular platforms, 6-8 for large heavy rotors. All springs must have equal stiffness.\"}},\n{\"@type\":\"Question\",\"name\":\"What materials are best for building a balancing platform?\",\"acceptedAnswer\":{\"@type\":\"Answer\",\"text\":\"Welded steel frame or plate (10-20 mm thick) is most common. Aluminum for smaller rotors. Platform mass is typically 10-25% of rotor mass.\"}},\n{\"@type\":\"Question\",\"name\":\"Can I use rubber mounts instead of springs?\",\"acceptedAnswer\":{\"@type\":\"Answer\",\"text\":\"Yes, but rubber mounts have higher damping and variable stiffness. Coil springs are preferred for their consistent, well-defined stiffness and low damping.\"}}\n]}\n<\/script>\n\n<script type=\"application\/ld+json\">\n{\"@context\":\"https:\/\/schema.org\",\"@type\":\"BreadcrumbList\",\"itemListElement\":[\n{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/vibromera.eu\/\"},\n{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Calculators\",\"item\":\"https:\/\/vibromera.eu\/calculators\/\"},\n{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Balancing Platform Design\",\"item\":\"https:\/\/vibromera.eu\/calculators\/balancing-platform-design\/\"}\n]}\n<\/script>\n\n<link rel=\"preconnect\" href=\"https:\/\/fonts.googleapis.com\">\n\n<link rel=\"preconnect\" href=\"https:\/\/fonts.gstatic.com\" crossorigin>\n\n<link href=\"https:\/\/fonts.googleapis.com\/css2?family=DM+Sans:ital,opsz,wght@0,9..40,300;0,9..40,400;0,9..40,500;0,9..40,600;0,9..40,700;1,9..40,400&#038;family=JetBrains+Mono:wght@400;500;600&#038;family=Fraunces:opsz,wght@9..144,700;9..144,800&#038;display=swap\" rel=\"stylesheet\">\n\n<link rel=\"stylesheet\" href=\"https:\/\/cdn.jsdelivr.net\/npm\/katex@0.16.11\/dist\/katex.min.css\">\n\n<style>\n:root {\n    --vc-bg: #f4f1ec;\n    --vc-surface: #ffffff;\n    --vc-surface-alt: #f8f6f2;\n    --vc-ink: #1a1a1a;\n    --vc-ink-secondary: #5a5650;\n    --vc-ink-muted: #8a857e;\n    --vc-accent: #c85a2a;\n    --vc-accent-hover: #b04d22;\n    --vc-accent-light: #fdf0ea;\n    --vc-blue: #2a5c8c;\n    --vc-blue-light: #eaf1f8;\n    --vc-green: #2a7a4b;\n    --vc-green-light: #eaf8ef;\n    --vc-yellow: #a67c00;\n    --vc-yellow-light: #fef9e8;\n    --vc-red: #b91c1c;\n    --vc-red-light: #fef2f2;\n    --vc-border: #d9d4cc;\n    --vc-border-light: #e8e4dd;\n    --vc-shadow: 0 1px 3px rgba(26,26,26,0.06), 0 4px 12px rgba(26,26,26,0.04);\n    --vc-shadow-lg: 0 4px 12px rgba(26,26,26,0.08), 0 16px 40px rgba(26,26,26,0.06);\n    --vc-radius: 8px;\n    --vc-radius-lg: 12px;\n    --vc-font: 'DM Sans', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;\n    --vc-mono: 'JetBrains Mono', 'Consolas', 'Monaco', monospace;\n    --vc-display: 'Fraunces', Georgia, serif;\n}\n\n.vc-calculator {\n    font-family: var(--vc-font);\n    font-size: 15px;\n    line-height: 1.65;\n    color: var(--vc-ink);\n    max-width: 960px;\n    margin: 0 auto;\n    padding: 20px 16px 40px;\n    -webkit-font-smoothing: antialiased;\n}\n.vc-calculator *, .vc-calculator *::before, .vc-calculator *::after { box-sizing: border-box; }\n\n.vc-header { text-align: center; padding: 48px 24px 40px; position: relative; }\n.vc-header::after { content:''; position:absolute; bottom:0; left:50%; transform:translateX(-50%); width:80px; height:3px; background:var(--vc-accent); border-radius:2px; }\n.vc-header-eyebrow { font-family:var(--vc-mono); font-size:11px; font-weight:500; letter-spacing:0.15em; text-transform:uppercase; color:var(--vc-accent); margin:0 0 12px; }\n.vc-header-title { font-family:var(--vc-display); font-size:clamp(24px,4vw,36px); font-weight:800; line-height:1.15; color:var(--vc-ink); margin:0 0 16px; letter-spacing:-0.02em; }\n.vc-header-subtitle { font-size:15px; color:var(--vc-ink-secondary); margin:0 auto 20px; max-width:600px; }\n.vc-badges { display:inline-flex; gap:8px; flex-wrap:wrap; justify-content:center; }\n.vc-badge { font-family:var(--vc-mono); font-size:11px; font-weight:500; padding:4px 10px; border-radius:4px; background:var(--vc-surface); border:1px solid var(--vc-border); color:var(--vc-ink-secondary); }\n\n.vc-card { background:var(--vc-surface); border:1px solid var(--vc-border); border-radius:var(--vc-radius-lg); box-shadow:var(--vc-shadow); overflow:hidden; margin-top:32px; }\n.vc-unit-bar { display:flex; border-bottom:1px solid var(--vc-border-light); background:var(--vc-surface-alt); }\n.vc-unit-btn { flex:1; padding:12px; border:none; background:transparent; font-family:var(--vc-font); font-size:13px; font-weight:600; color:var(--vc-ink-muted); cursor:pointer; transition:all 0.2s; position:relative; }\n.vc-unit-btn:hover { color:var(--vc-ink-secondary); background:rgba(200,90,42,0.04); }\n.vc-unit-btn.vc-active { color:var(--vc-accent); background:var(--vc-surface); }\n.vc-unit-btn.vc-active::after { content:''; position:absolute; bottom:-1px; left:16px; right:16px; height:2px; background:var(--vc-accent); border-radius:1px 1px 0 0; }\n\n.vc-form { padding:24px; }\n.vc-form-grid { display:grid; grid-template-columns:1fr 1fr; gap:18px; }\n@media(max-width:600px) { .vc-form-grid { grid-template-columns:1fr; } }\n.vc-field { display:flex; flex-direction:column; }\n.vc-field-full { grid-column: 1 \/ -1; }\n.vc-label { font-size:12px; font-weight:600; letter-spacing:0.04em; text-transform:uppercase; color:var(--vc-ink-secondary); margin-bottom:6px; }\n.vc-label-hint { font-weight:400; text-transform:none; letter-spacing:0; color:var(--vc-ink-muted); font-size:11px; }\n.vc-select, .vc-input { width:100%; padding:10px 12px; border:1.5px solid var(--vc-border); border-radius:6px; font-family:var(--vc-font); font-size:14px; color:var(--vc-ink); background:var(--vc-surface); transition:border-color 0.15s, box-shadow 0.15s; }\n.vc-select { padding-right:36px; appearance:none; -webkit-appearance:none; cursor:pointer; background-image:url(\"data:image\/svg+xml,%3Csvg xmlns='http:\/\/www.w3.org\/2000\/svg' width='16' height='16' fill='none' stroke='%235a5650' stroke-width='2'%3E%3Cpath d='M4 6l4 4 4-4'\/%3E%3C\/svg%3E\"); background-repeat:no-repeat; background-position:right 10px center; }\n.vc-select:focus, .vc-input:focus { outline:none; border-color:var(--vc-accent); box-shadow:0 0 0 3px rgba(200,90,42,0.12); }\n.vc-select:hover, .vc-input:hover { border-color:var(--vc-ink-muted); }\n\n.vc-presets { display:flex; flex-wrap:wrap; gap:8px; margin-top:18px; padding-top:18px; border-top:1px solid var(--vc-border-light); }\n.vc-presets-label { font-family:var(--vc-mono); font-size:11px; font-weight:500; letter-spacing:0.1em; text-transform:uppercase; color:var(--vc-ink-muted); width:100%; margin-bottom:2px; }\n.vc-preset-btn { padding:5px 12px; font-family:var(--vc-font); font-size:12px; font-weight:500; border:1px solid var(--vc-border); border-radius:6px; background:var(--vc-surface-alt); color:var(--vc-ink-secondary); cursor:pointer; transition:all 0.15s; }\n.vc-preset-btn:hover { border-color:var(--vc-accent); color:var(--vc-accent); background:var(--vc-accent-light); }\n\n.vc-results { border-top:1px solid var(--vc-border-light); background:var(--vc-surface-alt); padding:0; max-height:0; overflow:hidden; transition:max-height 0.5s cubic-bezier(0.4,0,0.2,1), padding 0.3s; }\n.vc-results.vc-visible { max-height:2000px; padding:24px; }\n.vc-results-head { display:flex; align-items:center; justify-content:space-between; margin-bottom:18px; }\n.vc-results-title { font-family:var(--vc-display); font-size:20px; font-weight:700; color:var(--vc-ink); margin:0; }\n.vc-copy-btn { display:inline-flex; align-items:center; gap:5px; padding:6px 12px; border:1px solid var(--vc-border); border-radius:6px; background:var(--vc-surface); font-family:var(--vc-font); font-size:12px; font-weight:500; color:var(--vc-ink-secondary); cursor:pointer; transition:all 0.15s; }\n.vc-copy-btn:hover { border-color:var(--vc-accent); color:var(--vc-accent); }\n.vc-copy-btn.vc-copied { background:var(--vc-green-light); border-color:var(--vc-green); color:var(--vc-green); }\n\n.vc-result-grid { display:grid; grid-template-columns:1fr 1fr; gap:12px; margin-bottom:20px; }\n@media(max-width:500px) { .vc-result-grid { grid-template-columns:1fr; } }\n.vc-rcard { background:var(--vc-surface); border:1px solid var(--vc-border-light); border-radius:var(--vc-radius); padding:16px; transition:transform 0.2s; }\n.vc-rcard:hover { transform:translateY(-1px); }\n.vc-rcard-primary { border-color:var(--vc-accent); border-width:2px; background:linear-gradient(135deg, #fdf6f2 0%, var(--vc-surface) 100%); grid-column:1 \/ -1; }\n.vc-rcard-label { font-family:var(--vc-mono); font-size:10px; font-weight:500; letter-spacing:0.1em; text-transform:uppercase; color:var(--vc-ink-muted); margin-bottom:4px; }\n.vc-rcard-value { font-family:var(--vc-mono); font-size:22px; font-weight:600; color:var(--vc-ink); line-height:1.2; }\n.vc-rcard-primary .vc-rcard-value { font-size:30px; color:var(--vc-accent); }\n.vc-rcard-unit { font-size:14px; font-weight:400; color:var(--vc-ink-secondary); }\n\n.vc-section { margin-top:24px; border:1px solid var(--vc-border); border-radius:var(--vc-radius-lg); background:var(--vc-surface); box-shadow:var(--vc-shadow); overflow:hidden; }\n.vc-section-toggle { width:100%; display:flex; align-items:center; justify-content:space-between; padding:18px 24px; border:none; background:transparent; cursor:pointer; font-family:var(--vc-font); text-align:left; transition:background 0.15s; }\n.vc-section-toggle:hover { background:var(--vc-surface-alt); }\n.vc-section-toggle-text { display:flex; align-items:center; gap:10px; }\n.vc-section-icon { font-size:20px; line-height:1; }\n.vc-section-title { font-family:var(--vc-display); font-size:18px; font-weight:700; color:var(--vc-ink); margin:0; }\n.vc-section-chevron { width:20px; height:20px; color:var(--vc-ink-muted); transition:transform 0.3s; flex-shrink:0; }\n.vc-section.vc-open .vc-section-chevron { transform:rotate(180deg); }\n.vc-section-body { max-height:0; overflow:hidden; transition:max-height 0.4s cubic-bezier(0.4,0,0.2,1); }\n.vc-section.vc-open .vc-section-body { max-height:20000px; }\n.vc-section-inner { padding:0 24px 24px; border-top:1px solid var(--vc-border-light); }\n\n.vc-theory h3 { font-family:var(--vc-display); font-size:17px; font-weight:700; color:var(--vc-ink); margin:28px 0 10px; }\n.vc-theory h3:first-child { margin-top:20px; }\n.vc-theory p { font-size:14px; color:var(--vc-ink-secondary); margin:0 0 10px; }\n.vc-theory ul, .vc-theory ol { font-size:14px; color:var(--vc-ink-secondary); margin:0 0 12px 18px; padding:0; }\n.vc-theory li { margin-bottom:5px; }\n.vc-formula-box { background:var(--vc-surface-alt); border:2px solid var(--vc-border); border-radius:6px; padding:14px 20px; font-family:var(--vc-mono); font-size:16px; font-weight:500; text-align:center; margin:14px 0; color:var(--vc-ink); overflow-x:auto; }\n.vc-info-box { background:var(--vc-blue-light); border-left:3px solid var(--vc-blue); padding:14px 16px; border-radius:0 6px 6px 0; margin:14px 0; }\n.vc-info-box p { margin:0; font-size:14px; color:var(--vc-ink-secondary); }\n.vc-warning-box { background:var(--vc-yellow-light); border-left:3px solid var(--vc-yellow); padding:14px 16px; border-radius:0 6px 6px 0; margin:14px 0; }\n.vc-example-box { background:var(--vc-surface-alt); border:1px solid var(--vc-border-light); border-radius:6px; padding:16px; margin:14px 0; }\n.vc-example-title { font-family:var(--vc-mono); font-size:13px; font-weight:600; color:var(--vc-accent); margin-bottom:8px; }\n\n.vc-faq-list { display:flex; flex-direction:column; gap:8px; margin-top:20px; }\n.vc-faq-item { border:1px solid var(--vc-border-light); border-radius:6px; overflow:hidden; }\n.vc-faq-q { width:100%; display:flex; align-items:center; justify-content:space-between; gap:12px; padding:14px 16px; border:none; background:var(--vc-surface-alt); cursor:pointer; font-family:var(--vc-font); font-size:15px; font-weight:600; color:var(--vc-ink); text-align:left; transition:background 0.15s; }\n.vc-faq-q:hover { background:#ede9e3; }\n.vc-faq-chevron { width:16px; height:16px; color:var(--vc-ink-muted); flex-shrink:0; transition:transform 0.25s; }\n.vc-faq-item.vc-open .vc-faq-chevron { transform:rotate(180deg); }\n.vc-faq-a { max-height:0; overflow:hidden; transition:max-height 0.35s; }\n.vc-faq-item.vc-open .vc-faq-a { max-height:1200px; }\n.vc-faq-a-inner { padding:14px 16px; border-top:1px solid var(--vc-border-light); font-size:14px; color:var(--vc-ink-secondary); }\n.vc-faq-a-inner p { margin:0 0 8px; } .vc-faq-a-inner p:last-child { margin-bottom:0; }\n.vc-faq-a-inner ul { margin:4px 0 8px 16px; padding:0; } .vc-faq-a-inner li { margin-bottom:3px; }\n\n.vc-related { display:flex; flex-wrap:wrap; gap:10px; margin-top:16px; }\n.vc-related-link { display:inline-block; padding:8px 16px; font-family:var(--vc-font); font-size:13px; font-weight:600; background:var(--vc-surface-alt); color:var(--vc-ink-secondary); border:1px solid var(--vc-border); border-radius:var(--vc-radius); text-decoration:none; transition:all 0.15s; }\n.vc-related-link:hover { border-color:var(--vc-accent); color:var(--vc-accent); background:var(--vc-accent-light); }\n\n.vc-promo { margin-top:24px; padding:20px; background:linear-gradient(135deg, var(--vc-accent-light), var(--vc-surface)); border:1px solid var(--vc-border); border-radius:var(--vc-radius-lg); display:flex; align-items:center; gap:16px; }\n.vc-promo-text { flex:1; font-size:14px; color:var(--vc-ink-secondary); } .vc-promo-text strong { color:var(--vc-ink); }\n.vc-promo-link { padding:8px 20px; font-size:13px; font-weight:700; color:#fff; background:var(--vc-accent); border-radius:var(--vc-radius); text-decoration:none; white-space:nowrap; transition:background 0.15s; }\n.vc-promo-link:hover { background:var(--vc-accent-hover); }\n\n.vc-footer { text-align:center; padding:32px 16px; font-size:13px; color:var(--vc-ink-muted); }\n.vc-footer a { color:var(--vc-accent); text-decoration:none; } .vc-footer a:hover { text-decoration:underline; }\n.vc-footer-links { margin-top:8px; font-size:12px; } .vc-footer-links a { margin:0 8px; }\n\n@media print {\n    .vc-section-body { max-height:none!important; }\n    .vc-faq-a { max-height:none!important; }\n    .vc-results { max-height:none!important; padding:24px!important; }\n    .vc-copy-btn, .vc-section-chevron, .vc-faq-chevron, .vc-presets, .vc-promo { display:none!important; }\n}\n<\/style>\n\n<div class=\"vc-calculator\" id=\"vc-platform-design\">\n\n<header class=\"vc-header\">\n    <p class=\"vc-header-eyebrow\">Free Engineering Tool<\/p>\n    <h1 class=\"vc-header-title\">Balancing Platform Design Calculator<\/h1>\n    <p class=\"vc-header-subtitle\">Design a balancing platform (soft support) for field rotor balancing. Calculate the required spring stiffness, natural frequency, static deflection, and transmissibility.<\/p>\n    <div class=\"vc-badges\">\n        <span class=\"vc-badge\">Soft Support Design<\/span>\n        <span class=\"vc-badge\">Transmissibility<\/span>\n        <span class=\"vc-badge\">2\u20138 Springs<\/span>\n    <\/div>\n<\/header>\n\n<div class=\"vc-card\">\n    <div class=\"vc-unit-bar\">\n        <button type=\"button\" class=\"vc-unit-btn vc-active\" data-system=\"metric\">Metric (kg, N\/mm)<\/button>\n        <button type=\"button\" class=\"vc-unit-btn\" data-system=\"imperial\">Imperial (lb, lbf\/in)<\/button>\n    <\/div>\n\n    <form class=\"vc-form\" id=\"vc-form\" autocomplete=\"off\">\n        <div class=\"vc-form-grid\">\n            <div class=\"vc-field\">\n                <label class=\"vc-label\" for=\"vc-mrotor\">Rotor Mass <span class=\"vc-label-hint vc-mass-hint\">(kg)<\/span><\/label>\n                <input class=\"vc-input\" type=\"number\" id=\"vc-mrotor\" inputmode=\"decimal\" step=\"any\" min=\"0.01\" placeholder=\"e.g. 80\">\n            <\/div>\n            <div class=\"vc-field\">\n                <label class=\"vc-label\" for=\"vc-mplatform\">Platform Mass <span class=\"vc-label-hint vc-mass-hint\">(kg)<\/span> <span class=\"vc-label-hint\">\u2014 ~20% of rotor<\/span><\/label>\n                <input class=\"vc-input\" type=\"number\" id=\"vc-mplatform\" inputmode=\"decimal\" step=\"any\" min=\"0\" placeholder=\"e.g. 15\">\n            <\/div>\n            <div class=\"vc-field\">\n                <label class=\"vc-label\" for=\"vc-rpm\">Operating Speed <span class=\"vc-label-hint\">(RPM)<\/span><\/label>\n                <input class=\"vc-input\" type=\"number\" id=\"vc-rpm\" inputmode=\"decimal\" step=\"any\" min=\"1\" placeholder=\"e.g. 1800\">\n            <\/div>\n            <div class=\"vc-field\">\n                <label class=\"vc-label\" for=\"vc-nsprings\">Number of Springs<\/label>\n                <select class=\"vc-select\" id=\"vc-nsprings\">\n                    <option value=\"2\">2<\/option>\n                    <option value=\"3\">3<\/option>\n                    <option value=\"4\" selected>4<\/option>\n                    <option value=\"6\">6<\/option>\n                    <option value=\"8\">8<\/option>\n                <\/select>\n            <\/div>\n            <div class=\"vc-field vc-field-full\">\n                <label class=\"vc-label\" for=\"vc-ratio\">Frequency Ratio Target<\/label>\n                <select class=\"vc-select\" id=\"vc-ratio\">\n                    <option value=\"1\/3\" selected>1\/3 (recommended)<\/option>\n                    <option value=\"1\/4\">1\/4 (better isolation)<\/option>\n                    <option value=\"1\/5\">1\/5 (best isolation)<\/option>\n                <\/select>\n            <\/div>\n        <\/div>\n\n        <div class=\"vc-presets\">\n            <div class=\"vc-presets-label\">Quick presets<\/div>\n            <button type=\"button\" class=\"vc-preset-btn\" data-mr=\"30\" data-mp=\"6\" data-rpm=\"3000\" data-ns=\"4\" data-r=\"1\/3\">Small fan 30 kg \/ 3000 RPM<\/button>\n            <button type=\"button\" class=\"vc-preset-btn\" data-mr=\"150\" data-mp=\"30\" data-rpm=\"1500\" data-ns=\"4\" data-r=\"1\/3\">Pump 150 kg \/ 1500 RPM<\/button>\n            <button type=\"button\" class=\"vc-preset-btn\" data-mr=\"500\" data-mp=\"100\" data-rpm=\"750\" data-ns=\"6\" data-r=\"1\/3\">Large rotor 500 kg \/ 750 RPM<\/button>\n        <\/div>\n    <\/form>\n\n    <div class=\"vc-results\" id=\"vc-results\">\n        <div class=\"vc-results-head\">\n            <h2 class=\"vc-results-title\">Results<\/h2>\n            <button type=\"button\" class=\"vc-copy-btn\" id=\"vc-copy-btn\">\n                <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><rect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\"\/><path d=\"M5 15H4a2 2 0 01-2-2V4a2 2 0 012-2h9a2 2 0 012 2v1\"\/><\/svg>\n                Copy\n            <\/button>\n        <\/div>\n        <div class=\"vc-result-grid\">\n            <div class=\"vc-rcard vc-rcard-primary\">\n                <div class=\"vc-rcard-label\">Required Stiffness per Spring<\/div>\n                <div class=\"vc-rcard-value\" id=\"vc-r-kper\">\u2014<\/div>\n            <\/div>\n            <div class=\"vc-rcard\">\n                <div class=\"vc-rcard-label\">Total Stiffness (k_total)<\/div>\n                <div class=\"vc-rcard-value\" id=\"vc-r-ktotal\">\u2014<\/div>\n            <\/div>\n            <div class=\"vc-rcard\">\n                <div class=\"vc-rcard-label\">Platform Natural Frequency (f_n)<\/div>\n                <div class=\"vc-rcard-value\" id=\"vc-r-fn\">\u2014<\/div>\n            <\/div>\n            <div class=\"vc-rcard\">\n                <div class=\"vc-rcard-label\">Static Deflection (\u03b4_static)<\/div>\n                <div class=\"vc-rcard-value\" id=\"vc-r-defl\">\u2014<\/div>\n            <\/div>\n            <div class=\"vc-rcard\">\n                <div class=\"vc-rcard-label\">Transmissibility<\/div>\n                <div class=\"vc-rcard-value\" id=\"vc-r-trans\">\u2014<\/div>\n            <\/div>\n            <div class=\"vc-rcard\">\n                <div class=\"vc-rcard-label\">Frequency Ratio (f_op \/ f_n)<\/div>\n                <div class=\"vc-rcard-value\" id=\"vc-r-fratio\">\u2014<\/div>\n            <\/div>\n            <div class=\"vc-rcard\">\n                <div class=\"vc-rcard-label\">Total Mass<\/div>\n                <div class=\"vc-rcard-value\" id=\"vc-r-mtotal\">\u2014<\/div>\n            <\/div>\n        <\/div>\n        <div class=\"vc-viz\" id=\"vc-viz\" style=\"text-align:center;margin:16px 0 8px\"><\/div>\n    <\/div>\n<\/div>\n\n<!-- Theory -->\n<div class=\"vc-section vc-open\" id=\"vc-sec-theory\">\n    <button type=\"button\" class=\"vc-section-toggle\" aria-expanded=\"true\">\n        <span class=\"vc-section-toggle-text\">\n            <span class=\"vc-section-icon\">\ud83d\udcd8<\/span>\n            <span class=\"vc-section-title\">Theory &amp; Formulas<\/span>\n        <\/span>\n        <svg class=\"vc-section-chevron\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><path d=\"M6 9l6 6 6-6\"\/><\/svg>\n    <\/button>\n    <div class=\"vc-section-body\">\n        <div class=\"vc-section-inner vc-theory\">\n            <h3>Platform Natural Frequency<\/h3>\n            <p>The natural frequency of the platform mass-spring system:<\/p>\n            <div class=\"vc-formula-box\" id=\"vc-katex-1\"><\/div>\n            <p>Where <strong>m<sub>total<\/sub><\/strong> = m<sub>rotor<\/sub> + m<sub>platform<\/sub> and <strong>k<sub>total<\/sub><\/strong> is the combined stiffness of all springs (N\/m).<\/p>\n\n            <h3>Required Stiffness per Spring<\/h3>\n            <div class=\"vc-formula-box\" id=\"vc-katex-2\"><\/div>\n            <p>Where <strong>n<\/strong> is the number of springs and <strong>f<sub>target<\/sub><\/strong> = RPM\/60 \u00d7 ratio (e.g. \u00d71\/3).<\/p>\n\n            <h3>Transmissibility<\/h3>\n            <p>Undamped transmissibility at operating speed:<\/p>\n            <div class=\"vc-formula-box\" id=\"vc-katex-3\"><\/div>\n            <p>For good balancing conditions, T should be less than 15%. A frequency ratio of 3 gives T \u2248 12.5%.<\/p>\n\n            <h3>Static Deflection<\/h3>\n            <div class=\"vc-formula-box\" id=\"vc-katex-4\"><\/div>\n\n            <h3>Practical Example<\/h3>\n            <div class=\"vc-example-box\">\n                <div class=\"vc-example-title\">Example \u2014 80 kg Rotor at 1800 RPM<\/div>\n                <p><strong>Given:<\/strong> m<sub>rotor<\/sub> = 80 kg, m<sub>platform<\/sub> = 15 kg, 1800 RPM, 4 springs, ratio 1\/3<\/p>\n                <p>m<sub>total<\/sub> = 95 kg, f<sub>op<\/sub> = 30 Hz, f<sub>target<\/sub> = 10 Hz<\/p>\n                <p>k<sub>total<\/sub> = 95 \u00d7 (2\u03c0\u00d710)\u00b2 = 375,055 N\/m = <strong>375.1 N\/mm<\/strong><\/p>\n                <p>k<sub>per spring<\/sub> = 375.1 \/ 4 = <strong>93.8 N\/mm<\/strong><\/p>\n                <p>\u03b4<sub>static<\/sub> = 95\u00d79.81 \/ 375,055 \u00d7 1000 = <strong>2.49 mm<\/strong><\/p>\n                <p>T = 1\/(3\u00b2\u22121) = <strong>12.5%<\/strong><\/p>\n            <\/div>\n\n            <div class=\"vc-warning-box\">\n                <p style=\"margin:0;font-size:14px;color:var(--vc-ink-secondary);\"><strong>\u26a0\ufe0f Note:<\/strong> Ensure all springs have equal stiffness and the load is centered. Unequal deflection causes tilting, which distorts vibration readings during balancing.<\/p>\n            <\/div>\n        <\/div>\n    <\/div>\n<\/div>\n\n<!-- Related -->\n<div class=\"vc-section\" id=\"vc-sec-related\">\n    <button type=\"button\" class=\"vc-section-toggle\" aria-expanded=\"false\">\n        <span class=\"vc-section-toggle-text\">\n            <span class=\"vc-section-icon\">\ud83d\udd17<\/span>\n            <span class=\"vc-section-title\">Related Calculators<\/span>\n        <\/span>\n        <svg class=\"vc-section-chevron\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><path d=\"M6 9l6 6 6-6\"\/><\/svg>\n    <\/button>\n    <div class=\"vc-section-body\">\n        <div class=\"vc-section-inner\">\n            <div class=\"vc-related\">\n                <a class=\"vc-related-link\" href=\"\/calculators\/natural-frequency\/\">Natural Frequency (Mass-Spring)<\/a>\n                <a class=\"vc-related-link\" href=\"\/calculators\/spring-selection\/\">Spring Selection by Frequency<\/a>\n                <a class=\"vc-related-link\" href=\"\/calculators\/equivalent-spring-stiffness\/\">Equivalent Spring Stiffness<\/a>\n                <a class=\"vc-related-link\" href=\"\/calculators\/residual-unbalance-iso1940\/\">Residual Unbalance (ISO 1940)<\/a>\n            <\/div>\n        <\/div>\n    <\/div>\n<\/div>\n\n<!-- FAQ -->\n<div class=\"vc-section\" id=\"vc-sec-faq\">\n    <button type=\"button\" class=\"vc-section-toggle\" aria-expanded=\"false\">\n        <span class=\"vc-section-toggle-text\">\n            <span class=\"vc-section-icon\">\u2753<\/span>\n            <span class=\"vc-section-title\">Frequently Asked Questions<\/span>\n        <\/span>\n        <svg class=\"vc-section-chevron\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><path d=\"M6 9l6 6 6-6\"\/><\/svg>\n    <\/button>\n    <div class=\"vc-section-body\">\n        <div class=\"vc-section-inner\">\n            <div class=\"vc-faq-list\" id=\"vc-faq-list\"><\/div>\n        <\/div>\n    <\/div>\n<\/div>\n\n<div class=\"vc-promo\">\n    <div class=\"vc-promo-text\">\n        <strong>Vibromera \u2014 Portable Balancing &amp; Vibration Analysis<\/strong><br>\n        Professional field balancing instruments and software. Design your balancing platform and verify results with our portable balancers. Used in 50+ countries.\n    <\/div>\n    <a class=\"vc-promo-link\" href=\"https:\/\/vibromera.eu\/\" target=\"_blank\" rel=\"noopener\">Learn More<\/a>\n<\/div>\n\n<footer class=\"vc-footer\">\n    <p>\u00a9 2024\u20132025 <a href=\"https:\/\/vibromera.eu\/\">Vibromera<\/a> \u2014 Engineering Calculators<\/p>\n    <p style=\"font-size:12px;margin-top:4px;\">Last updated: June 2025<\/p>\n    <div class=\"vc-footer-links\">\n        <a href=\"\/calculators\/engineering-calculators\/\">All Calculators<\/a>\n        <a href=\"https:\/\/vibromera.eu\/contacts\/\">Contact<\/a>\n    <\/div>\n<\/footer>\n\n<\/div>\n\n<script src=\"https:\/\/cdn.jsdelivr.net\/npm\/katex@0.16.11\/dist\/katex.min.js\"><\/script>\n<script>\n(function() {\n    'use strict';\n\n    var SLUG = 'balancing-platform-design';\n    var unitSystem = 'metric';\n    var KG2LB = 2.20462;\n    var NMM2LBFIN = 5.71015;\n    var MM2IN = 25.4;\n    var G = 9.81;\n\n    function $(id) { return document.getElementById(id); }\n    function fmt(n, d) {\n        if (isNaN(n)) return '\u2014';\n        if (n === 0) return '0';\n        if (Math.abs(n) < 0.001) return n.toExponential(2);\n        if (d !== undefined) { var f = n.toFixed(d); return f.replace(\/(\\.\\d*?)0+$\/, '$1').replace(\/\\.$\/, ''); }\n        if (Math.abs(n) < 1) return n.toFixed(4);\n        if (Math.abs(n) < 10) return n.toFixed(3);\n        if (Math.abs(n) < 100) return n.toFixed(2);\n        if (Math.abs(n) < 10000) return n.toFixed(1);\n        return Math.round(n).toLocaleString('en-US');\n    }\n\n    function parseRatio(str) {\n        if (str === '1\/3') return 1\/3;\n        if (str === '1\/4') return 1\/4;\n        if (str === '1\/5') return 1\/5;\n        return 1\/3;\n    }\n\n    \/* \u2500\u2500 AUTO-FILL PLATFORM MASS \u2500\u2500 *\/\n    $('vc-mrotor').addEventListener('blur', function() {\n        var mp = $('vc-mplatform');\n        if (!mp.value || mp.value === '0') {\n            var mr = parseFloat(this.value);\n            if (mr > 0) mp.value = (mr * 0.2).toFixed(1);\n        }\n    });\n\n    \/* \u2500\u2500 CALCULATION \u2500\u2500 *\/\n    function calculate() {\n        var mRotorVal = parseFloat($('vc-mrotor').value);\n        var mPlatVal = parseFloat($('vc-mplatform').value);\n        var rpmVal = parseFloat($('vc-rpm').value);\n\n        if (!mRotorVal || mRotorVal <= 0 || !rpmVal || rpmVal <= 0) {\n            $('vc-results').classList.remove('vc-visible');\n            return;\n        }\n        if (isNaN(mPlatVal) || mPlatVal < 0) mPlatVal = 0;\n\n        var nSprings = parseInt($('vc-nsprings').value) || 4;\n        var ratioStr = $('vc-ratio').value;\n        var ratio = parseRatio(ratioStr);\n\n        \/* Convert to metric (kg) *\/\n        var mRotorKg = unitSystem === 'imperial' ? mRotorVal \/ KG2LB : mRotorVal;\n        var mPlatKg = unitSystem === 'imperial' ? mPlatVal \/ KG2LB : mPlatVal;\n        var mTotalKg = mRotorKg + mPlatKg;\n\n        \/* Core calculations *\/\n        var fOp = rpmVal \/ 60;\n        var fTarget = fOp * ratio;\n        var omega = 2 * Math.PI * fTarget;\n        var kTotalNm = mTotalKg * omega * omega;\n        var kTotalNmm = kTotalNm \/ 1000;\n        var kPerSpringNmm = kTotalNmm \/ nSprings;\n        var deflMm = mTotalKg * G \/ kTotalNm * 1000;\n\n        var fNatural = Math.sqrt(kTotalNm \/ mTotalKg) \/ (2 * Math.PI);\n        var freqRatioAchieved = fOp \/ fNatural;\n        var T = 1 \/ (freqRatioAchieved * freqRatioAchieved - 1);\n        var Tpct = T * 100;\n\n        \/* Display in user units *\/\n        var stiffUnit, deflUnit, massUnit;\n        var kPerDisplay, kTotalDisplay, deflDisplay, mTotalDisplay;\n        if (unitSystem === 'imperial') {\n            stiffUnit = 'lbf\/in'; deflUnit = 'in'; massUnit = 'lb';\n            kPerDisplay = kPerSpringNmm * NMM2LBFIN;\n            kTotalDisplay = kTotalNmm * NMM2LBFIN;\n            deflDisplay = deflMm \/ MM2IN;\n            mTotalDisplay = mTotalKg * KG2LB;\n        } else {\n            stiffUnit = 'N\/mm'; deflUnit = 'mm'; massUnit = 'kg';\n            kPerDisplay = kPerSpringNmm;\n            kTotalDisplay = kTotalNmm;\n            deflDisplay = deflMm;\n            mTotalDisplay = mTotalKg;\n        }\n\n        $('vc-r-kper').innerHTML = fmt(kPerDisplay) + ' <span class=\"vc-rcard-unit\">' + stiffUnit + '<\/span>';\n        $('vc-r-ktotal').innerHTML = fmt(kTotalDisplay) + ' <span class=\"vc-rcard-unit\">' + stiffUnit + '<\/span>';\n        $('vc-r-fn').innerHTML = fmt(fNatural) + ' <span class=\"vc-rcard-unit\">Hz<\/span> <span class=\"vc-rcard-unit\">(' + fmt(fNatural * 60, 0) + ' RPM)<\/span>';\n        $('vc-r-defl').innerHTML = fmt(deflDisplay) + ' <span class=\"vc-rcard-unit\">' + deflUnit + '<\/span>';\n        $('vc-r-trans').innerHTML = fmt(Tpct, 1) + '<span class=\"vc-rcard-unit\">%<\/span>' + (Tpct <= 15 ? ' <span class=\"vc-rcard-unit\">\u2714<\/span>' : ' <span class=\"vc-rcard-unit\">\u26a0 lower ratio<\/span>');\n        $('vc-r-fratio').innerHTML = fmt(freqRatioAchieved, 2) + '<span class=\"vc-rcard-unit\">:1<\/span>';\n        $('vc-r-mtotal').innerHTML = fmt(mTotalDisplay) + ' <span class=\"vc-rcard-unit\">' + massUnit + '<\/span>';\n\n        $('vc-results').classList.add('vc-visible');\n        drawViz(nSprings, fNatural, fOp, freqRatioAchieved);\n\n        \/* URL params *\/\n        var u = new URL(window.location);\n        u.searchParams.set('mRotor', $('vc-mrotor').value);\n        u.searchParams.set('mPlatform', $('vc-mplatform').value);\n        u.searchParams.set('rpm', $('vc-rpm').value);\n        u.searchParams.set('nSprings', nSprings);\n        u.searchParams.set('ratio', ratioStr);\n        history.replaceState(null, '', u.toString());\n\n        \/* History *\/\n        saveHistory({\n            mRotor: $('vc-mrotor').value,\n            mPlatform: $('vc-mplatform').value,\n            rpm: $('vc-rpm').value,\n            nSprings: nSprings,\n            ratio: ratioStr,\n            _summary: fmt(mTotalDisplay) + ' ' + massUnit + ', ' + rpmVal + ' RPM, ' + nSprings + ' spr \u2192 ' + fmt(kPerDisplay) + ' ' + stiffUnit + '\/spr'\n        });\n    }\n\n    \/* \u2500\u2500 UNIT TOGGLE \u2500\u2500 *\/\n    var unitBtns = document.querySelectorAll('.vc-unit-btn');\n    unitBtns.forEach(function(btn) {\n        btn.addEventListener('click', function() {\n            unitBtns.forEach(function(b) { b.classList.remove('vc-active'); });\n            this.classList.add('vc-active');\n            unitSystem = this.getAttribute('data-system');\n            document.querySelectorAll('.vc-mass-hint').forEach(function(el) {\n                el.textContent = unitSystem === 'imperial' ? '(lb)' : '(kg)';\n            });\n            try { localStorage.setItem('vc_units', unitSystem); } catch(e) {}\n            calculate();\n        });\n    });\n\n    \/* \u2500\u2500 PRESETS \u2500\u2500 *\/\n    document.querySelectorAll('.vc-preset-btn').forEach(function(btn) {\n        btn.addEventListener('click', function(e) {\n            e.preventDefault();\n            var mr = parseFloat(this.getAttribute('data-mr'));\n            var mp = parseFloat(this.getAttribute('data-mp'));\n            $('vc-mrotor').value = unitSystem === 'imperial' ? fmt(mr * KG2LB, 1) : mr;\n            $('vc-mplatform').value = unitSystem === 'imperial' ? fmt(mp * KG2LB, 1) : mp;\n            $('vc-rpm').value = this.getAttribute('data-rpm');\n            $('vc-nsprings').value = this.getAttribute('data-ns');\n            $('vc-ratio').value = this.getAttribute('data-r');\n            calculate();\n        });\n    });\n\n    \/* \u2500\u2500 AUTO-CALCULATE \u2500\u2500 *\/\n    $('vc-form').addEventListener('input', calculate);\n    $('vc-form').addEventListener('change', calculate);\n\n    \/* \u2500\u2500 COPY \u2500\u2500 *\/\n    $('vc-copy-btn').addEventListener('click', function() {\n        var text = 'Balancing Platform Design Calculation\\n' +\n            '\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\\n' +\n            'Rotor Mass: ' + $('vc-mrotor').value + (unitSystem === 'imperial' ? ' lb' : ' kg') + '\\n' +\n            'Platform Mass: ' + $('vc-mplatform').value + (unitSystem === 'imperial' ? ' lb' : ' kg') + '\\n' +\n            'Speed: ' + $('vc-rpm').value + ' RPM\\n' +\n            'Springs: ' + $('vc-nsprings').value + '\\n' +\n            'k per spring: ' + $('vc-r-kper').textContent + '\\n' +\n            'f_n: ' + $('vc-r-fn').textContent + '\\n' +\n            'Static deflection: ' + $('vc-r-defl').textContent + '\\n' +\n            'Transmissibility: ' + $('vc-r-trans').textContent + '\\n' +\n            '\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\\n' +\n            'vibromera.eu\/calculators\/balancing-platform-design\/';\n\n        if (navigator.clipboard) {\n            navigator.clipboard.writeText(text).then(function() {\n                var btn = $('vc-copy-btn');\n                btn.classList.add('vc-copied');\n                btn.innerHTML = '<svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><polyline points=\"20 6 9 17 4 12\"\/><\/svg> Copied!';\n                setTimeout(function() {\n                    btn.classList.remove('vc-copied');\n                    btn.innerHTML = '<svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><rect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\"\/><path d=\"M5 15H4a2 2 0 01-2-2V4a2 2 0 012-2h9a2 2 0 012 2v1\"\/><\/svg> Copy';\n                }, 2000);\n            });\n        }\n    });\n\n    \/* \u2500\u2500 COLLAPSIBLE SECTIONS \u2500\u2500 *\/\n    document.querySelectorAll('.vc-section-toggle').forEach(function(btn) {\n        btn.addEventListener('click', function() {\n            var section = this.closest('.vc-section');\n            var isOpen = section.classList.contains('vc-open');\n            section.classList.toggle('vc-open');\n            this.setAttribute('aria-expanded', !isOpen);\n        });\n    });\n\n    \/* \u2500\u2500 FAQ \u2500\u2500 *\/\n    var faqData = [\n        { q: 'What is a balancing platform?', a: '<p>A balancing platform (soft support) is a simple structure \u2014 typically a steel frame or plate \u2014 mounted on springs. It supports a rotor for field balancing by allowing free vibration response at operating speed. The platform\\'s natural frequency is tuned well below operating speed (typically \u2264 1\/3).<\/p>' },\n        { q: 'Why must the platform natural frequency be below operating speed?', a: '<p>The natural frequency must be well below operating speed to ensure the system operates in the isolation region \u2014 above the resonance peak. At a frequency ratio of 3, transmissibility drops to about 12.5%, meaning the rotor vibrates freely and the balancing instrument can accurately detect unbalance.<\/p>' },\n        { q: 'How to choose the number of springs?', a: '<p>Common configurations:<\/p><ul><li><strong>4 springs<\/strong> \u2014 most common, one at each corner<\/li><li><strong>2 springs<\/strong> \u2014 small, lightweight rotors<\/li><li><strong>3 springs<\/strong> \u2014 triangular platforms<\/li><li><strong>6\u20138 springs<\/strong> \u2014 large, heavy rotors<\/li><\/ul><p>All springs must have equal stiffness and the load must be centered.<\/p>' },\n        { q: 'What materials are best for the platform?', a: '<p>Welded steel frame or plate (10\u201320 mm thick) is most common. Aluminum for smaller rotors. Platform mass is typically 10\u201325% of rotor mass. Ensure the platform is flat and all spring mounting points are at equal height.<\/p>' },\n        { q: 'Can I use rubber mounts instead of springs?', a: '<p>Yes, but rubber mounts have higher damping (reducing measurement precision), and stiffness varies with temperature and load history. Coil springs are preferred for their consistent, well-defined stiffness and low damping. Dynamic rubber stiffness is typically 1.3\u20132\u00d7 higher than static stiffness.<\/p>' }\n    ];\n\n    var faqList = $('vc-faq-list');\n    faqData.forEach(function(faq) {\n        faqList.innerHTML += '<div class=\"vc-faq-item\"><button type=\"button\" class=\"vc-faq-q\"><span>' + faq.q + '<\/span><svg class=\"vc-faq-chevron\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><path d=\"M6 9l6 6 6-6\"\/><\/svg><\/button><div class=\"vc-faq-a\"><div class=\"vc-faq-a-inner\">' + faq.a + '<\/div><\/div><\/div>';\n    });\n    faqList.addEventListener('click', function(e) {\n        var btn = e.target.closest('.vc-faq-q');\n        if (!btn) return;\n        btn.closest('.vc-faq-item').classList.toggle('vc-open');\n    });\n\n    \/* \u2500\u2500 VISUALIZATION \u2500\u2500 *\/\n    function drawViz(nSprings, fN, fOp, freqRatio) {\n        var c = $('vc-viz'), W = 400, H = 180;\n        var svg = '<svg width=\"'+W+'\" height=\"'+H+'\" viewBox=\"0 0 '+W+' '+H+'\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\">';\n        var cx = W \/ 2, baseY = H - 30;\n        var platW = 180, platH = 12, rotorR = 25;\n        \/\/ Springs (zigzag)\n        var springH = 45, springW = 12;\n        var springX = [];\n        for (var i = 0; i < nSprings; i++) {\n            springX.push(cx - platW \/ 2 + 20 + i * (platW - 40) \/ Math.max(1, nSprings - 1));\n        }\n        if (nSprings === 1) springX = [cx];\n        \/\/ Base\n        svg += '<rect x=\"'+(cx - platW \/ 2 - 15)+'\" y=\"'+baseY+'\" width=\"'+(platW + 30)+'\" height=\"8\" rx=\"2\" fill=\"#d9d4cc\" stroke=\"#8a857e\" stroke-width=\"1\"\/>';\n        \/\/ Springs\n        springX.forEach(function(sx) {\n            var sy0 = baseY, sy1 = baseY - springH;\n            var pts = 'M'+sx+' '+sy0;\n            var nz = 5;\n            for (var j = 0; j <= nz; j++) {\n                var ty = sy0 - (j \/ nz) * springH;\n                var tx = sx + ((j % 2 === 0) ? -springW \/ 2 : springW \/ 2);\n                pts += ' L'+tx+' '+ty;\n            }\n            svg += '<path d=\"'+pts+'\" fill=\"none\" stroke=\"#3578b2\" stroke-width=\"2\" stroke-linecap=\"round\"\/>';\n        });\n        \/\/ Platform\n        var platY = baseY - springH - platH;\n        svg += '<rect x=\"'+(cx - platW \/ 2)+'\" y=\"'+platY+'\" width=\"'+platW+'\" height=\"'+platH+'\" rx=\"3\" fill=\"#e0e7ef\" stroke=\"#7b8fa3\" stroke-width=\"1.5\"\/>';\n        \/\/ Rotor (circle on platform)\n        svg += '<circle cx=\"'+cx+'\" cy=\"'+(platY - rotorR)+'\" r=\"'+rotorR+'\" fill=\"#d4e6f9\" stroke=\"#3578b2\" stroke-width=\"1.5\"\/>';\n        svg += '<line x1=\"'+cx+'\" y1=\"'+(platY - rotorR)+'\" x2=\"'+(cx + rotorR * 0.7)+'\" y2=\"'+(platY - rotorR - rotorR * 0.7)+'\" stroke=\"#3578b2\" stroke-width=\"1.5\"\/>';\n        \/\/ Frequency ratio box\n        var frText = 'f_op\/f_n = ' + freqRatio.toFixed(1) + ':1';\n        var fnText = 'f_n = ' + fN.toFixed(1) + ' Hz, f_op = ' + fOp.toFixed(1) + ' Hz';\n        svg += '<text x=\"'+cx+'\" y=\"16\" text-anchor=\"middle\" fill=\"#2c3e50\" font-size=\"11\" font-weight=\"600\">'+frText+'<\/text>';\n        svg += '<text x=\"'+cx+'\" y=\"'+(H - 6)+'\" text-anchor=\"middle\" fill=\"#8a857e\" font-size=\"9\">'+fnText+' | '+nSprings+' springs<\/text>';\n        \/\/ Labels\n        svg += '<text x=\"'+cx+'\" y=\"'+(platY - rotorR + 4)+'\" text-anchor=\"middle\" fill=\"#3578b2\" font-size=\"10\" font-weight=\"600\">Rotor<\/text>';\n        svg += '<\/svg>';\n        c.innerHTML = svg;\n    }\n\n    \/* \u2500\u2500 HISTORY \u2500\u2500 *\/\n    function saveHistory(entry) {\n        var key = 'vc_history_' + SLUG;\n        var arr = [];\n        try { arr = JSON.parse(localStorage.getItem(key)) || []; } catch(e) {}\n        entry._ts = new Date().toISOString();\n        arr.unshift(entry);\n        if (arr.length > 10) arr = arr.slice(0, 10);\n        try { localStorage.setItem(key, JSON.stringify(arr)); } catch(e) {}\n    }\n\n    \/* \u2500\u2500 URL PARAMS \u2500\u2500 *\/\n    function loadParams() {\n        var p = new URLSearchParams(window.location.search);\n        var map = { mRotor: 'vc-mrotor', mPlatform: 'vc-mplatform', rpm: 'vc-rpm', nSprings: 'vc-nsprings', ratio: 'vc-ratio' };\n        Object.keys(map).forEach(function(k) {\n            var v = p.get(k);\n            if (v) $(map[k]).value = v;\n        });\n    }\n\n    \/* \u2500\u2500 KATEX \u2500\u2500 *\/\n    function renderFormulas() {\n        try {\n            katex.render('f_{platform} = \\\\frac{1}{2\\\\pi}\\\\sqrt{\\\\frac{k_{total}}{m_{total}}}', $('vc-katex-1'), { displayMode: true, throwOnError: false });\n            katex.render('k_{per\\\\,spring} = \\\\frac{m_{total} \\\\cdot (2\\\\pi f_{target})^2}{n}', $('vc-katex-2'), { displayMode: true, throwOnError: false });\n            katex.render('T = \\\\frac{1}{\\\\left(\\\\frac{f_{op}}{f_n}\\\\right)^2 - 1}', $('vc-katex-3'), { displayMode: true, throwOnError: false });\n            katex.render('\\\\delta_{static} = \\\\frac{m_{total} \\\\cdot g}{k_{total}} \\\\times 1000 \\\\quad [\\\\text{mm}]', $('vc-katex-4'), { displayMode: true, throwOnError: false });\n        } catch(e) {}\n    }\n\n    \/* \u2500\u2500 INIT \u2500\u2500 *\/\n    function init() {\n        try {\n            var saved = localStorage.getItem('vc_units');\n            if (saved === 'imperial') {\n                unitSystem = 'imperial';\n                unitBtns.forEach(function(b) { b.classList.toggle('vc-active', b.getAttribute('data-system') === 'imperial'); });\n                document.querySelectorAll('.vc-mass-hint').forEach(function(el) { el.textContent = '(lb)'; });\n            }\n        } catch(e) {}\n\n        loadParams();\n        renderFormulas();\n        calculate();\n    }\n\n    if (document.readyState === 'loading') {\n        document.addEventListener('DOMContentLoaded', init);\n    } else {\n        init();\n    }\n})();\n<\/script>\n","protected":false},"excerpt":{"rendered":"<p>Thi\u1ebft k\u1ebf m\u1ed9t b\u1ec7 c\u00e2n b\u1eb1ng \u0111\u1ec3 c\u00e2n b\u1eb1ng r\u00f4to trong kh\u00f4ng gian. T\u00ednh to\u00e1n \u0111\u1ed9 c\u1ee9ng l\u00f2 xo, t\u1ea7n s\u1ed1 t\u1ef1 nhi\u00ean v\u00e0 \u0111\u1ed9 l\u1ec7ch t\u0129nh c\u1ea7n thi\u1ebft \u0111\u1ec3 \u0111\u1ea3m b\u1ea3o c\u00e1ch ly rung \u0111\u1ed9ng hi\u1ec7u qu\u1ea3.<\/p>","protected":false},"featured_media":0,"template":"","meta":{"ai_generated_summary":"","footnotes":""},"categories":[],"tags":[],"class_list":["post-100010","calculator","type-calculator","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/vibromera.eu\/vi\/wp-json\/wp\/v2\/calculator\/100010","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/vibromera.eu\/vi\/wp-json\/wp\/v2\/calculator"}],"about":[{"href":"https:\/\/vibromera.eu\/vi\/wp-json\/wp\/v2\/types\/calculator"}],"version-history":[{"count":1,"href":"https:\/\/vibromera.eu\/vi\/wp-json\/wp\/v2\/calculator\/100010\/revisions"}],"predecessor-version":[{"id":100324,"href":"https:\/\/vibromera.eu\/vi\/wp-json\/wp\/v2\/calculator\/100010\/revisions\/100324"}],"wp:attachment":[{"href":"https:\/\/vibromera.eu\/vi\/wp-json\/wp\/v2\/media?parent=100010"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/vibromera.eu\/vi\/wp-json\/wp\/v2\/categories?post=100010"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/vibromera.eu\/vi\/wp-json\/wp\/v2\/tags?post=100010"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}