Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Learn Step-Size Control and Numerical Instability | Differential Equations and Dynamic Systems
Numerical Methods for Scientific Computing with Python

bookStep-Size Control and Numerical Instability

When solving ordinary differential equations (ODEs) numerically, the choice of step size is crucial for both the accuracy and stability of your solution. Traditional ODE solvers often use a fixed step size, meaning that the increment between each computed value is constant throughout the integration. While this approach is simple to implement, it can lead to significant problems: if the step size is too large, you may miss important changes in the solution or even encounter numerical instability; if it is too small, the computation becomes unnecessarily slow and resource-intensive.

Adaptive step-size control addresses these issues by dynamically adjusting the step size as the solution progresses. The idea is to use larger steps when the solution is changing slowly and smaller steps when rapid changes or high error estimates are detected. This strategy can greatly improve the balance between computational efficiency and the reliability of your results.

123456789101112131415161718192021222324252627282930313233343536373839404142
import numpy as np def adaptive_euler(f, y0, t0, t_end, h_init, tol): t = t0 y = y0 h = h_init t_values = [t] y_values = [y] while t < t_end: # Take one step of size h y1 = y + h * f(t, y) # Take two half-steps h_half = h / 2 y_half = y + h_half * f(t, y) y2 = y_half + h_half * f(t + h_half, y_half) # Estimate the error error = np.abs(y2 - y1) # Adjust step size if error < tol: # Accept the step t += h y = y2 t_values.append(t) y_values.append(y) # Try increasing the step size h *= min(2, (tol / (error + 1e-16))**0.5) else: # Reduce the step size and retry h *= max(0.5, (tol / (error + 1e-16))**0.5) # Prevent overshooting the end point if t + h > t_end: h = t_end - t return np.array(t_values), np.array(y_values) # Example usage: dy/dt = -2y, y(0) = 1 def f(t, y): return -2 * y t_vals, y_vals = adaptive_euler(f, y0=1.0, t0=0.0, t_end=2.0, h_init=0.2, tol=1e-4) for t, y in zip(t_vals, y_vals): print(f"t={t:.3f}, y={y:.5f}")
copy

Adaptive step-size methods like the one above provide a flexible way to control both the accuracy and the efficiency of your ODE solver. By automatically adjusting the step size, you can maintain a desired error tolerance without having to manually guess an appropriate fixed step size. However, this adaptability comes with its own trade-offs.

  • Smaller steps mean more function evaluations and slower performance;
  • Larger steps may save time but risk missing rapid changes in the solution or even causing instability in stiff problems.

Finding the right balance is essential: you want your solver to be as efficient as possible without sacrificing the reliability of your numerical results.

Note
Study More

The scipy.integrate module offers advanced ODE solvers with sophisticated adaptive step-size control, such as solve_ivp with Runge–Kutta methods and error estimation. Reviewing its documentation and experimenting with these tools will deepen your understanding of adaptive algorithms and their practical applications.

question mark

Which of the following statements best describes the main advantage of adaptive step-size control in ODE solvers?

Select the correct answer

Everything was clear?

How can we improve it?

Thanks for your feedback!

SectionΒ 3. ChapterΒ 3

Ask AI

expand

Ask AI

ChatGPT

Ask anything or try one of the suggested questions to begin our chat

bookStep-Size Control and Numerical Instability

Swipe to show menu

When solving ordinary differential equations (ODEs) numerically, the choice of step size is crucial for both the accuracy and stability of your solution. Traditional ODE solvers often use a fixed step size, meaning that the increment between each computed value is constant throughout the integration. While this approach is simple to implement, it can lead to significant problems: if the step size is too large, you may miss important changes in the solution or even encounter numerical instability; if it is too small, the computation becomes unnecessarily slow and resource-intensive.

Adaptive step-size control addresses these issues by dynamically adjusting the step size as the solution progresses. The idea is to use larger steps when the solution is changing slowly and smaller steps when rapid changes or high error estimates are detected. This strategy can greatly improve the balance between computational efficiency and the reliability of your results.

123456789101112131415161718192021222324252627282930313233343536373839404142
import numpy as np def adaptive_euler(f, y0, t0, t_end, h_init, tol): t = t0 y = y0 h = h_init t_values = [t] y_values = [y] while t < t_end: # Take one step of size h y1 = y + h * f(t, y) # Take two half-steps h_half = h / 2 y_half = y + h_half * f(t, y) y2 = y_half + h_half * f(t + h_half, y_half) # Estimate the error error = np.abs(y2 - y1) # Adjust step size if error < tol: # Accept the step t += h y = y2 t_values.append(t) y_values.append(y) # Try increasing the step size h *= min(2, (tol / (error + 1e-16))**0.5) else: # Reduce the step size and retry h *= max(0.5, (tol / (error + 1e-16))**0.5) # Prevent overshooting the end point if t + h > t_end: h = t_end - t return np.array(t_values), np.array(y_values) # Example usage: dy/dt = -2y, y(0) = 1 def f(t, y): return -2 * y t_vals, y_vals = adaptive_euler(f, y0=1.0, t0=0.0, t_end=2.0, h_init=0.2, tol=1e-4) for t, y in zip(t_vals, y_vals): print(f"t={t:.3f}, y={y:.5f}")
copy

Adaptive step-size methods like the one above provide a flexible way to control both the accuracy and the efficiency of your ODE solver. By automatically adjusting the step size, you can maintain a desired error tolerance without having to manually guess an appropriate fixed step size. However, this adaptability comes with its own trade-offs.

  • Smaller steps mean more function evaluations and slower performance;
  • Larger steps may save time but risk missing rapid changes in the solution or even causing instability in stiff problems.

Finding the right balance is essential: you want your solver to be as efficient as possible without sacrificing the reliability of your numerical results.

Note
Study More

The scipy.integrate module offers advanced ODE solvers with sophisticated adaptive step-size control, such as solve_ivp with Runge–Kutta methods and error estimation. Reviewing its documentation and experimenting with these tools will deepen your understanding of adaptive algorithms and their practical applications.

question mark

Which of the following statements best describes the main advantage of adaptive step-size control in ODE solvers?

Select the correct answer

Everything was clear?

How can we improve it?

Thanks for your feedback!

SectionΒ 3. ChapterΒ 3
some-alt