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

Worked example: 2-D principal stresses

Given: σₓ = 80, σᵧ = 20, τₓᵧ = 40 MPa

Find: σ₁, σ₂, θₚ, τ_max.

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.

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.

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 MPa

eigh 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

Applications

Key takeaways

Going further