Stress & Strain Tensors
The stress tensor σᵢⱼ and strain tensor εᵢⱼ are the most-used tensors in engineering. Learn Cauchy's traction formula, principal stresses as eigenvalues, invariants, hydrostatic and deviatoric parts, Mohr's circle, the small-strain tensor from displacement gradients, generalised Hooke's law and the von Mises criterion — with a NumPy eigen-analysis.
Cut a loaded body anywhere and the internal force per unit area on the cut depends on how you orient the cut. The stress tensor stores all this in nine numbers (six independent, because σᵢⱼ = σⱼᵢ), and Cauchy's formula tᵢ = σᵢⱼnⱼ gives the traction on any plane.
Designers care about the largest normal stress (principal stress) and a combined measure (von Mises). Both come straight out of the eigenvalues — linear algebra doing structural safety.
An analogy
The stress tensor is a 3-D 'pressure' that is different in each direction. Principal axes are the special directions where the material feels pure push or pull with no sideways shearing — like the grain of wood.
Nine components, six independent
σₓₓ, σᵧᵧ, σ_zz are normal stresses (pull/push); σₓᵧ, σᵧ_z, σ_zₓ are shears. Moment balance on a tiny cube forces σₓᵧ = σᵧₓ, so the tensor is symmetric with 6 independent values.
Principal stresses are eigenvalues
On a principal plane the traction is parallel to the normal: σn = λn. That is exactly an eigenvalue problem. Because σ is symmetric, there are always three real principal stresses with mutually perpendicular directions.
In 2-D, Mohr's circle draws this: centre (σₓ + σᵧ)/2, radius √[((σₓ − σᵧ)/2)² + τ²]. The circle's ends on the σ-axis are the principal stresses; its top is the maximum in-plane shear.
Strain tensor from displacements
If a point moves by u(x), the symmetric part of the displacement gradient is strain; the antisymmetric part is rigid rotation, which causes no stress. Engineering shear strain γₓᵧ = 2εₓᵧ — a factor that trips up many hand calculations.
Deviatoric stress and yielding
Metals do not yield under pure hydrostatic pressure; only the deviatoric part sᵢⱼ = σᵢⱼ − pδᵢⱼ matters. The von Mises stress √(3J₂), with J₂ = ½sᵢⱼsᵢⱼ, reduces a 3-D state to one number compared with the uniaxial yield strength.
For large deformations, other stress/strain measures (Green–Lagrange strain, 2nd Piola–Kirchhoff stress) are needed; these are what nonlinear FEM solvers use.
Formulas
- Cauchy traction:
tᵢ = σᵢⱼ nⱼ - Principal stresses:
det(σ − λI) = 0 → λ³ − I₁λ² + I₂λ − I₃ = 0 - Invariants:
I₁ = σᵢᵢ; I₂ = ½(σᵢᵢσⱼⱼ − σᵢⱼσᵢⱼ); I₃ = det σ - Hydrostatic / deviatoric:
σᵢⱼ = p δᵢⱼ + sᵢⱼ, p = I₁/3 - Small strain:
εᵢⱼ = ½(∂uᵢ/∂xⱼ + ∂uⱼ/∂xᵢ) - Isotropic Hooke's law:
σᵢⱼ = λ εₖₖ δᵢⱼ + 2μ εᵢⱼ - 2-D principal / Mohr:
σ₁,₂ = (σₓ + σᵧ)/2 ± √[((σₓ − σᵧ)/2)² + τ²]; tan 2θₚ = 2τ/(σₓ − σᵧ) - von Mises:
σ_vm = √{½[(σ₁ − σ₂)² + (σ₂ − σ₃)² + (σ₃ − σ₁)²]}
Worked example: 2-D principal stresses
Given: σₓ = 80, σᵧ = 20, τₓᵧ = 40 MPa
Find: σ₁, σ₂, θₚ, τ_max.
- Centre = 50; R = √(30² + 40²) = 50
- σ₁ = 100, σ₂ = 0
- tan 2θₚ = 80/60 → θₚ = 26.57°
Answer: σ₁ = 100 MPa, σ₂ = 0, θₚ = 26.6°, τ_max = 50 MPa
Worked example: Traction on an inclined plane
Given: σ = [[50, 30],[30, −20]] MPa; n = (1, 1)/√2
Find: Traction vector and normal stress.
- t = σn = (80, 10)/√2 = (56.57, 7.07)
- σₙ = t·n = (80 + 10)/2
Answer: t = (56.6, 7.1) MPa; σₙ = 45 MPa
Worked example: Hydrostatic part
Given: σ = diag(61.1, 10, −31.1) MPa
Find: Mean stress p.
- p = I₁/3 = 40/3
Answer: p = 13.3 MPa; deviator = σ − 13.3 I
Principal stresses, invariants and von Mises
import numpy as np
# Stress tensor at a point (MPa); symmetric
s = np.array([[50, 30, 0],
[30, -20, 0],
[0, 0, 10]], dtype=float)
p, v = np.linalg.eigh(s) # principal stresses & directions
p, v = p[::-1], v[:, ::-1] # order sigma1 >= sigma2 >= sigma3
print("principal stresses:", np.round(p, 2))
print("sigma1 direction: ", np.round(v[:, 0], 4))
I1 = np.trace(s)
I2 = 0.5 * (I1**2 - np.trace(s @ s))
I3 = np.linalg.det(s)
print(f"invariants I1={I1:.0f} I2={I2:.0f} I3={I3:.0f}")
tau_max = (p[0] - p[2]) / 2
vm = np.sqrt(0.5 * ((p[0]-p[1])**2 + (p[1]-p[2])**2 + (p[2]-p[0])**2))
print(f"max shear = {tau_max:.2f} MPa von Mises = {vm:.2f} MPa")
# principal stresses: [ 61.1 10. -31.1]
# sigma1 direction: [-0.9379 -0.3469 -0. ]
# invariants I1=40 I2=-1600 I3=-19000
# max shear = 46.10 MPa von Mises = 80.00 MPaeigh is used because σ is symmetric (real eigenvalues, orthogonal eigenvectors). The eigenvector's overall sign is arbitrary: (−0.938, −0.347, 0) and (0.938, 0.347, 0) are the same axis, about 20.3° from x.
Common mistakes
- Wrong: Using γₓᵧ in the strain tensor. — Right: Tensor shear strain is γ/2.
- Wrong: Taking the largest component as the max stress. — Right: Compute eigenvalues; principal stress can exceed every component.
- Wrong: Ignoring σ₃ = 0 in plane stress for max shear. — Right: Absolute max shear = (σ₁ − σ₃)/2 including the zero stress.
Applications
- Machine design: Shafts under bending + torsion checked with von Mises.
- Pressure vessels: Hoop, axial and radial principal stresses.
- Geomechanics: In-situ stress tensor for tunnels and wellbores.
- FEM post-processing: Every stress contour plot is an invariant of σᵢⱼ.
Key takeaways
- tᵢ = σᵢⱼnⱼ gives traction on any plane.
- Principal stresses = eigenvalues.
- Invariants and von Mises are frame-free.
- Tensor shear strain = γ/2.
Going further
- Tresca vs von Mises: Max-shear versus distortion-energy yield surfaces.
- Finite strain: Green–Lagrange and logarithmic strains for large deformation.
- Anisotropic elasticity: Cᵢⱼₖₗ for composites: 9 constants for orthotropic.