The Ramberg-Osgood Equation

The Ramberg-Osgood equation describes the non-linear relationship between stress and strain of a material around its yield point. When performing a non-linear finite element analysis, the solver needs a complete stress-strain curve as input. If only the Ramberg-Osgood parameters ($K$ and $n$) are known — as is common in material databases and design codes — this equation lets you reconstruct the full curve.

The Ramberg-Osgood relationship

Hooke's law states that below the yield point, the stress is linearly proportional to the strain:

$${\sigma = {E} \; {\varepsilon}_{e}}$$

Ramberg and Osgood defined a power-law to describe the plastic strain:

$${{\varepsilon}_{p} = \left(\frac{\sigma}{K} \right)^n}$$

The material dependent parameters $K$ and $n$ describe the hardening behaviour of the material.

The total strain ${\varepsilon}_{t}$ is the sum of the elastic strain ${\varepsilon}_{e}$ and the plastic strain ${\varepsilon}_{p}$, which results in:

$${{\varepsilon}_{t} = {\varepsilon}_{e} + {\varepsilon}_{p} = \frac{\sigma}{E} + \left(\frac{\sigma}{K} \right)^n}$$

With:

  • ${\varepsilon}$ the strain
  • ${\sigma}$ the stress
  • $K$ material nonlinear modulus
  • $n$ material strain-hardening exponent

Accuracy of the equation

The equation is not a perfect representation of the real material's stress-strain behaviour, because the Ramberg-Osgood equation implies that plastic strain is present at any stress level, also way below the yield point. However, the plastic strain part of the total strain is very small at low stress levels.

Some materials show an abrupt change of stiffness at yielding. In that case, the Ramberg-Osgood relationship doesn't hold well around the yield point (see Figure 1 below).

Example

In Figure 1, the stress-strain data of a carbon steel with a yield stress σy = 500 MPa and a Young's Modulus E = 210000 MPa is presented. The Ramberg-Osgood curve (K = 1480, n = 6.71) is plotted against the measured stress-strain data. The error at stresses between zero and around 350 MPa is very small, but increases at stresses between 400 and 550 MPa.

Stress-strain curve of a carbonsteel with the Ramberg-Osgood fit
Figure 1. Stress-strain material curve and the Ramberg-Osgood fit

The Ramberg-Osgood curve provides the material input needed for elastic-plastic FEA calculations, and is equally important for fatigue and durability analysis, where the cyclic stress-strain curve governs the local strain range at notches and stress concentrations.

How to fit stress-strain data to the Ramberg-Osgood equation?

Fitting the stress-strain data to a Ramberg-Osgood curve can be done using Excel, but also with, for example, Python. The Python 3.x code is provided below:

     
import numpy as np
from scipy.optimize import curve_fit
import matplotlib.pyplot as plt


# MATERIAL DATA
strain = np.array([0, 500/210000, 0.003749347, 0.005234888, 0.007631515, 
                   0.011446096, 0.017384888, 0.026405375, 0.039775799])
stress = np.array([0, 500, 550, 600, 660, 720, 780, 840, 900])
E = stress[1] / strain[1]  # CALCULATE YOUNG'S MODULUS

# FITTING RAMBERG-OSGOOD EQUATION
def test_func(x, K, n):
    return x / E + np.power(x / K, n)

p0 = [500, 5]  # Initial estimate for [K, n]
c, cov = curve_fit(test_func, stress, strain, p0)

# PRINT CURVE FIT PARAMETERS
print()
print('-' * 28)
print(' Ramberg-Osgood parameters')
print('-' * 28)
print(f' K = {c[0]} \n n = {c[1]}')
print('-' * 28)

# CREATE DATA ARRAY FOR THE FITTED CURVE
e = test_func(np.linspace(0, stress[-1]), c[0], c[1])  # STRAIN
s = np.linspace(0, stress[-1])  # STRESS

# PLOT DATA AND FITTED CURVE
plt.figure(1, figsize=(12, 8))
# PLOT FITTED CURVE:
plt.plot(e, s, lw=3, c='C1')
# PLOT MEASURED DATA:
plt.plot(strain, stress, '--o', lw=2.5, ms=9, mew=2, mfc='white', c='C0')
plt.grid()
plt.xlabel(r'Strain $\epsilon$ [mm/mm]')
plt.ylabel(r'Stress $\sigma$ [MPa]')
plt.title(f'Ramberg-Osgood curve fit (K = {np.round(c[0], 2)} '
          f'| n = {np.round(c[1], 3)})\n')
plt.legend(['Ramberg-Osgood fit', 'Stress-Strain measured data'])

plt.show()
                            

Frequently asked questions

Common questions about the Ramberg-Osgood equation in engineering practice.

Material databases such as MMPDS (formerly MIL-HDBK-5) for aerospace alloys, and ASME Boiler and Pressure Vessel Code Section VIII for pressure vessel steels, list Ramberg-Osgood parameters or sufficient data to derive them. For European steels, Eurocode 3 Annex C provides a method to estimate the parameters from the yield strength and ultimate tensile strength. If no published parameters are available, you can fit the equation to measured stress-strain data as shown in the Python example above.

Most FEA solvers (Ansys, Abaqus, Nastran) do not accept the Ramberg-Osgood equation directly. Instead, you generate a table of stress-strain data points from the equation and enter these as a multilinear or piecewise-linear plasticity model. Use a sufficient number of points — especially around the yield region where the curvature is highest — to ensure an accurate representation. Some solvers also accept true stress vs. true plastic strain, so check whether your data needs to be converted from engineering values.

Yes — it is essential for strain-life (low-cycle) fatigue analysis. The cyclic stress-strain curve, which describes the material's stabilised response under repeated loading, is typically expressed in Ramberg-Osgood form with cyclic parameters $K'$ and $n'$. These cyclic parameters are used together with the strain-life (Coffin-Manson) equation to predict fatigue life at notch roots and stress concentrations.