赫兹接触应力计算工具 返回
Interactive Calculator

赫兹接触应力计算工具

基于赫兹接触理论,实时计算并可视化球体、圆柱体接触的压力分布、接触半径及次表面最大剪切应力。

参数设置
接触形式
R₁ — 半径1
mm
R₂ — 半径2
mm
E₁ — 弹性模量(体1)
GPa
E₂ — 弹性模量(体2)
GPa
ν₁ — 泊松比1
ν₂ — 泊松比2
P — 载荷
N
计算结果
μm
接触半宽 a
MPa
最大接触压 p₀
MPa
最大剪切应力 τ_max
μm
τ_max 深度 z*
接触面压力分布 p(x)
次表面应力分布 σz, τmax vs 深度 z
接触区形状(俯视图)
赫兹接触动画 — 弹性变形与接触压力
// Hertz contact animation (function() { const el = document.getElementById('hertzAnimCanvas'); if (!el) return; const ctx = el.getContext('2d'); let phase = 0; function getParams() { const P = parseFloat(document.getElementById('P').value) || 1000; const R1 = parseFloat(document.getElementById('R1').value) || 20; const R2v = document.getElementById('R2'); const R2 = R2v ? parseFloat(R2v.value) || 20 : Infinity; const ct = document.getElementById('contactType').value; const isCyl = ct === 'cyl-cyl' || ct === 'cyl-flat'; const isFlat = ct === 'sphere-flat' || ct === 'cyl-flat'; // contact radius a (μm → mm) const aEl = document.getElementById('sA'); const a_um = aEl ? parseFloat(aEl.textContent) || 100 : 100; const a_mm = a_um / 1000; // max pressure p0 (MPa) const p0El = document.getElementById('sP0'); const p0 = p0El ? parseFloat(p0El.textContent) || 500 : 500; return { P, R1, R2, isCyl, isFlat, a_mm, p0, ct }; } function resize() { const dpr = window.devicePixelRatio || 1; const w = Math.max(200, el.parentElement.clientWidth - 40); const H = 260; if (Math.abs(el.width - w * dpr) > 2 || el.height !== H * dpr) { el.width = w * dpr; el.height = H * dpr; el.style.width = w + 'px'; el.style.height = H + 'px'; ctx.setTransform(dpr, 0, 0, dpr, 0, 0); } return { W: w, H }; } function drawArrow(x1, y1, x2, y2, color, lw) { const dx = x2 - x1, dy = y2 - y1; const len = Math.sqrt(dx*dx + dy*dy); if (len < 1) return; const ux = dx/len, uy = dy/len; const hw = lw * 3; ctx.strokeStyle = color; ctx.lineWidth = lw; ctx.beginPath(); ctx.moveTo(x1, y1); ctx.lineTo(x2, y2); ctx.stroke(); ctx.fillStyle = color; ctx.beginPath(); ctx.moveTo(x2, y2); ctx.lineTo(x2 - ux*hw*2 - uy*hw, y2 - uy*hw*2 + ux*hw); ctx.lineTo(x2 - ux*hw*2 + uy*hw, y2 - uy*hw*2 - ux*hw); ctx.closePath(); ctx.fill(); } function drawBody(cx, cy, r, isFlat, isCyl, color, shine) { if (isFlat) { // Draw flat plate ctx.fillStyle = color; ctx.beginPath(); ctx.roundRect(cx - r * 1.4, cy, r * 2.8, r * 0.55, 4); ctx.fill(); ctx.strokeStyle = shine; ctx.lineWidth = 1; ctx.stroke(); } else if (isCyl) { // Cylinder (ellipse) ctx.fillStyle = color; ctx.beginPath(); ctx.ellipse(cx, cy, r, r * 0.55, 0, 0, Math.PI * 2); ctx.fill(); ctx.strokeStyle = shine; ctx.lineWidth = 1; ctx.stroke(); } else { // Sphere const g = ctx.createRadialGradient(cx - r*0.3, cy - r*0.3, r*0.05, cx, cy, r); g.addColorStop(0, '#6ab4ff'); g.addColorStop(0.6, color); g.addColorStop(1, '#002d5a'); ctx.fillStyle = g; ctx.beginPath(); ctx.arc(cx, cy, r, 0, Math.PI * 2); ctx.fill(); ctx.strokeStyle = shine; ctx.lineWidth = 1; ctx.stroke(); } } function frame() { const { W, H } = resize(); const { P, R1, R2, isCyl, isFlat, a_mm, p0, ct } = getParams(); phase += 0.025; ctx.clearRect(0, 0, W, H); // Background const bg = ctx.createLinearGradient(0, 0, 0, H); bg.addColorStop(0, '#f0f4f8'); bg.addColorStop(1, '#e8edf2'); ctx.fillStyle = bg; ctx.fillRect(0, 0, W, H); const cx = W / 2; // sizing: sphere/cyl occupies ~35% of height const r1Vis = Math.min(W * 0.22, H * 0.32); // Pulsating compression: smooth sine const compress = Math.abs(Math.sin(phase)); // 0→1→0 const squeeze = compress * Math.min(r1Vis * 0.08, 6); // Body 1 (top) center Y const body1CY = H * 0.25 + squeeze; // Body 2 (bottom) center Y const isFlat2 = ct === 'sphere-flat' || ct === 'cyl-flat'; const r2Vis = isFlat2 ? r1Vis * 0.4 : Math.min(W * 0.22, H * 0.32); const body2CY = H * 0.75 - squeeze; // Contact zone Y const contactY = H * 0.5; // --- 压力 distribution bar chart in centre --- const barW = Math.min(W * 0.55, 220); const barX = cx - barW / 2; const barMaxH = Math.min(60, H * 0.2); const N = 40; // Hertz: p(x) = p0 * sqrt(1-(x/a)^2), a_vis = barW/2 for (let i = 0; i < N; i++) { const xFrac = (i + 0.5) / N * 2 - 1; // -1 to 1 const pFrac = Math.sqrt(Math.max(0, 1 - xFrac * xFrac)); const bH = pFrac * barMaxH * compress; const bx = barX + (i / N) * barW; const bw = barW / N + 0.5; // Color: red=high, orange=mid, yellow=low const r = Math.round(200 + pFrac * 55); const g = Math.round(80 - pFrac * 60); ctx.fillStyle = `rgba(${r},${g},0,${0.55 + pFrac * 0.35})`; ctx.fillRect(bx, contactY - bH, bw, bH); ctx.fillRect(bx, contactY, bw, bH); // mirror below } // Contact line ctx.strokeStyle = '#d63031'; ctx.lineWidth = 2; ctx.setLineDash([4, 3]); ctx.beginPath(); ctx.moveTo(barX, contactY); ctx.lineTo(barX + barW, contactY); ctx.stroke(); ctx.setLineDash([]); // --- Body 1 (top) --- drawBody(cx, body1CY - (isFlat ? 0 : r1Vis), r1Vis, false, isCyl, '#007BFF', 'rgba(255,255,255,0.25)'); // --- Body 2 (bottom) --- drawBody(cx, isFlat2 ? contactY : body2CY - r2Vis, r2Vis, isFlat2, isCyl, '#0056b3', 'rgba(255,255,255,0.2)'); // --- Force arrows --- const fLen = 30 + compress * 12; const topBodyTop = body1CY - (isCyl ? r1Vis * 0.55 : r1Vis) - 6; drawArrow(cx, topBodyTop - fLen, cx, topBodyTop, '#e17055', 2.5); const botBodyBot = (isFlat2 ? contactY + r2Vis * 0.55 : body2CY) + 6; drawArrow(cx, botBodyBot + fLen, cx, botBodyBot, '#e17055', 2.5); // --- Labels --- ctx.font = 'bold 12px "Roboto Mono", monospace'; ctx.fillStyle = '#001F3F'; ctx.textAlign = 'left'; ctx.fillText(`P = ${P.toLocaleString()} N`, 10, 20); ctx.fillText(`a = ${(a_mm * 1000).toFixed(0)} μm`, 10, 36); ctx.fillStyle = '#d63031'; ctx.textAlign = 'right'; ctx.fillText(`p₀ = ${p0.toFixed(0)} MPa`, W - 10, 20); ctx.fillStyle = '#6c757d'; ctx.font = '11px "Noto Sans JP", sans-serif'; ctx.textAlign = 'center'; const typeLabel = { 'sphere-sphere':'球–球', 'sphere-flat':'球–平板', 'cyl-cyl':'円柱–円柱', 'cyl-flat':'円柱–平板' }; ctx.fillText(typeLabel[ct] || ct, cx, H - 8); ctx.fillText('Hz接触压力 p(x)', cx, contactY - barMaxH - 6); requestAnimationFrame(frame); } frame(); })();

什么是赫兹接触应力

🙋
“赫兹接触应力”是什么?听起来好复杂。
🎓
简单来说,就是两个物体(比如两个钢珠)互相压在一起时,接触点附近产生的巨大压力。它可不是均匀分布的,中心压力最大,像一座小山。你试着在模拟器里把“载荷P”的滑块从1000N拖到5000N看看,你会发现接触半径和中心压力都变大了,这就是赫兹接触的核心现象。
🙋
诶,真的吗?那为什么工程师这么关心这个?
🎓
因为很多零件的破坏都是从接触表面下开始的!比如在汽车轴承里,滚珠和滚道反复碾压,最大剪切应力其实藏在表面以下。你可以在模拟器里选择“球体”或“圆柱体”接触,然后观察下方那个“次表面最大剪切应力”的数值和位置,它才是疲劳裂纹的“发源地”。
🙋
那“等效弹性模量”和“等效半径”这两个滑块是干嘛的?感觉好抽象。
🎓
问得好!这是赫兹理论的巧妙之处。它把两个不同材料、不同曲率的物体,在数学上“等效”成一个物体压在一个平面上。你试着把“球体1的半径R1”调小,你会发现等效半径R*也变小,接触面积立刻缩小,压力飙升!这就是为什么小轴承要用非常硬的钢材——为了扛住巨大的接触压力。

物理模型与关键公式

赫兹接触理论的核心是计算接触区域的半宽(或半径)a和中心最大压力p₀。这首先需要将两个接触物体等效为一个弹性半空间与一个刚性曲面的接触,关键参数是等效弹性模量E*和等效曲率半径R*。

$$ E^* = \left(\frac{1-\nu_1^2}{E_1}+ \frac{1-\nu_2^2}{E_2}\right)^{-1}, \quad R^* = \left(\frac{1}{R_1}+ \frac{1}{R_2}\right)^{-1}$$

E₁, E₂为两物体的杨氏模量;ν₁, ν₂为泊松比;R₁, R₂为曲率半径(凸面为正,凹面为负)。E*综合了材料的软硬,R*综合了几何的弯曲程度。

对于球与球(或球与平面)的接触,接触半径a和最大接触压力p₀由以下公式给出:

$$ a = \left( \frac{3PR^*}{4E^*}\right)^{1/3}, \quad p_0 = \frac{3P}{2\pi a^2}= \left( \frac{6PE^{*2}}{\pi^3 R^{*2}}\right)^{1/3} $$

P为法向载荷。接触面上的压力呈半椭球分布:p(r) = p₀√(1 - (r/a)²)。而真正危险的是次表面的最大剪切应力τ_max,对于球接触,它约为0.31p₀,位于表面以下约0.48a深处。

现实世界中的应用

滚动轴承:滚珠或滚子与内外圈滚道的接触是典型的赫兹接触。工程师使用此理论计算接触应力,以选择材料、热处理工艺和润滑方案,防止过早出现接触疲劳剥落(点蚀)。

齿轮传动:齿轮齿面在啮合过程中是线接触(近似圆柱接触)。赫兹应力是齿面强度(如接触疲劳强度)计算的基础,直接关系到齿轮的承载能力和寿命预测。

轮轨系统:火车车轮与钢轨的接触是赫兹接触理论的重要应用场景。通过计算接触斑(接触区域)的大小和应力,可以分析钢轨的磨损、塑性变形和滚动接触疲劳裂纹的萌生。

人工关节(如髋关节):金属或陶瓷股骨头与髋臼衬垫之间的接触也适用赫兹理论。分析接触应力有助于优化假体设计,减少磨损颗粒的产生,延长人工关节的使用寿命。

常见误解与注意事项

开始使用此模拟器时,存在一些CAE初学者容易陷入的误区。首先一个常见的误解是认为“只要增强材料(采用高强度钢),就能承受任何高载荷”。材料强度固然重要,但赫兹接触应力本质上是“面压力”。例如,当载荷增加至2倍时,接触半径仅按 $a \propto P^{1/3}$ 关系增至约1.26倍,而最大接触压力 $p_0$ 却会按 $P^{2/3}$ 比例跃升至约1.59倍。单纯提高材料强度往往难以应对这种情况,通常需要通过增大形状(曲率半径)来增加接触面积,进行根本性的设计调整。

其次是参数设置的注意事项。模拟器中将“平面”视为曲率半径∞,但实际工程中几乎不存在完全理想的平面。例如在球轴承的滚珠与滚道接触中,滚道沟槽的曲率半径 $R_2$ 应设置为略大于滚珠半径 $R_1$ 的值(如1.05倍)。若此处简化为“平面”,接触压力的计算结果会远高于实际情况(即过于保守),可能导致过度设计。

最后需要理解本工具的基本前提。赫兹理论建立在完全弹性体、光滑表面、弹性极限内三大基础之上。这意味着当载荷引起塑性变形、表面存在粗糙度、或主要关注疲劳寿命时,计算结果仅能作为“初步近似”。例如淬火钢表面存在微小凹痕时,该处会产生应力集中,破坏可能从完全不同于理论最大剪切应力位置处开始。模拟结果应始终视为理想化的“基准值”,必须通过实物测试或更高级的CAE分析进行验证。