Skip to content

FAQ

General Questions

What is Neuber correction?

Neuber correction accounts for plastic deformation when elastic analysis gives unrealistic results. When stresses exceed the yield strength, elastic analysis overestimates the stress because it doesn't consider that the material will yield. Neuber correction finds the actual stress by intersecting the Neuber hyperbola with your material's stress-strain curve.

When should I use it?

Use it when you have:

  • Elastic FEA results with stresses above yield
  • Materials that yield (most metals)
  • Fatigue analysis where accuracy matters
  • Static analysis with plastic deformation

Technical Implementation

How does the intersection calculation work?

The tool calculates the intersection between the Neuber hyperbola and the Ramberg-Osgood curve regardless of the yield strength. This means:

  • Above yield: Normal correction behavior
  • Around/below yield: May result in overcorrection (stresses below yield)
  • Numerical stability: Continuous solution across all stress ranges
  • No discontinuities: Smooth transition between elastic and plastic regions

Why do you overcorrect around/below yield strength?

This approach is used for numerical stability:

  1. Continuous solution: No abrupt changes at yield point
  2. FEA analysis: Results often span both elastic and plastic regions
  3. Primary use case: Judging FEA results higher than yield
  4. Visual feedback: Overcorrection is flagged on plots (orange markers)

What do the different marker colors mean in the plots?

  • Green: Elastic stress point (input)
  • Orange: Corrected stress below yield (overcorrection flagged)
  • Magenta: Corrected stress above yield (normal correction)
  • Black: Intersection point between curves

Usage Questions

How do I set up the material properties?

Use the MaterialForNeuberCorrection class:

from neuber_correction import MaterialForNeuberCorrection

material = MaterialForNeuberCorrection(
    yield_strength=240,      # MPa
    sigma_u=290,    # MPa
    elastic_mod=68900, # MPa (69 GPa)
    eps_u=0.10     # dimensionless
)

Where do I get my elastic stress?

This tool is designed to be used with FEA results. You need the elastic stress from your finite element analysis. The tool doesn't calculate stress concentration factors - it corrects the elastic stress you already have.

How do I get my material properties?

From material standards:

  • EN 10025 (steels)
  • ASTM standards
  • Material datasheets

From testing:

  • Tensile tests
  • Stress-strain curves

What units should I use?

All stresses in MPa (or N/mm²):

material = MaterialForNeuberCorrection(
    yield_strength=315,      # MPa
    sigma_u=470,    # MPa
    elastic_mod=210000, # MPa (210 GPa)
    eps_u=0.12     # dimensionless
)

My calculation isn't converging. What's wrong?

Check these common issues:

  • Invalid material properties (tensile < yield strength)
  • Negative or zero values
  • Unrealistic stress values (way above tensile strength)

You can also adjust convergence settings:

from neuber_correction import NeuberSolverSettings

settings = NeuberSolverSettings(
    tolerance=1e-8,        # More precise
    max_iterations=1000    # More iterations
)

How accurate is the correction?

Depends on your material data quality:

  • Good data: ±5% typical
  • Poor data: ±10-15% possible
  • Always validate with test results when possible

Technical Questions

What's the Ramberg-Osgood exponent n?

It describes how quickly the material hardens after yielding:

  • Low n (5-10): Soft materials, gradual hardening
  • High n (20-50): Hard materials, rapid hardening
  • Calculated automatically from your material properties

Why does the correction reduce stress?

Because of plastic yielding:

  1. Elastic analysis assumes infinite strength
  2. Reality: Material yields, redistributes stress
  3. Result: Lower peak stress, higher strain

Can I use this for cyclic loading?

Current version: Monotonic loading only Future: May add cyclic Neuber correction For now: Use for static analysis or peak loads

How does the caching work?

The library automatically caches results for performance:

  • Same material + settings = shared instance
  • Repeated stress values = cached results
  • Memory efficient with sorted insertion
  • Clear cache with NeuberCorrection.clear_all_instances()

Troubleshooting

"ValueError: sigma_u must be greater than yield_strength"

Your material properties are inconsistent. Check:

  • Typo in values
  • Wrong material grade
  • Units confusion (ksi vs MPa)

Plot shows weird curves

Check your material properties:

  • Fracture strain should be 0.05-0.20 typically
  • Young's modulus should be realistic (200k MPa for steel)
  • Yield/tensile ratio should be 0.6-0.9

Need to save plots?

# Save directly from the method
neuber.plot_neuber_diagram(
    elastic_stress=600, 
    plot_file="neuber_diagram.png",
    plot_pretty_name="My Analysis"
)

# Or save manually
fig, ax = neuber.plot_neuber_diagram(600, show_plot=False)
fig.savefig('neuber_diagram.png', dpi=300, bbox_inches='tight')
plt.close(fig)

Performance is slow with many calculations

The library is optimized for repeated calculations:

  • First calculation per stress value takes time
  • Subsequent calculations use cached results
  • Batch processing is more efficient than individual calls
  • Clear cache if memory becomes an issue

Still Stuck?

  • 📖 Check the Quick Start for examples
  • 🔬 Review the Theory for background
  • 🐛 Open an issue on GitHub with your specific problem