.. DO NOT EDIT. .. THIS FILE WAS AUTOMATICALLY GENERATED BY SPHINX-GALLERY. .. TO MAKE CHANGES, EDIT THE SOURCE PYTHON FILE: .. "examples_gallery/advanced_pdes/solver_comparison.py" .. LINE NUMBERS ARE GIVEN BELOW. .. only:: html .. note:: :class: sphx-glr-download-link-note :ref:`Go to the end ` to download the full example code. .. rst-class:: sphx-glr-example-title .. _sphx_glr_examples_gallery_advanced_pdes_solver_comparison.py: Solver comparison ================= This example shows how to set up solvers explicitly and how to extract diagnostic information. .. GENERATED FROM PYTHON SOURCE LINES 8-45 .. image-sg:: /examples_gallery/advanced_pdes/images/sphx_glr_solver_comparison_001.png :alt: Deviation: 8.4e-05, 0.00018, 8.8e-05, 8.8e-05, 9e-05, explicit Euler solver, explicit, adaptive Runge-Kutta solver, implicit solver, Crank-Nicolson solver, Adam-Bashforth solver, scipy solver :srcset: /examples_gallery/advanced_pdes/images/sphx_glr_solver_comparison_001.png :class: sphx-glr-single-img .. rst-class:: sphx-glr-script-out .. code-block:: none Diagnostic information for explicit Euler solver: {'controller': {'mpi_run': False, 't_start': 0, 't_end': 1.0, 'profiler': {'solver': 0.004973414000005505, 'tracker': 3.391999999280415e-05, 'compilation': 4.043484868000007}, 'jit_count': {'make_stepper': 10, 'simulation': 0}, 'solver_start': '2025-12-10 07:35:52.695938+00:00', 'successful': True, 'stop_reason': 'Reached final time', 'solver_duration': '0:00:00.005001', 't_final': 1.0}, 'package_version': 'unknown', 'solver': {'class': 'ExplicitSolver', 'pde_class': 'DiffusionPDE', 'scheme': 'euler', 'backend': 'numba', 'dt': 0.001, 'dt_adaptive': False, 'steps': 1000, 'post_step_data': None, 'stochastic': False}} Diagnostic information for explicit, adaptive Runge-Kutta solver: {'controller': {'mpi_run': False, 't_start': 0, 't_end': 1.0, 'profiler': {'solver': 0.0009715500000027077, 'tracker': 3.177000000675889e-05, 'compilation': 0.6150535529999956}, 'jit_count': {'make_stepper': 1, 'simulation': 0}, 'solver_start': '2025-12-10 07:35:53.316411+00:00', 'successful': True, 'stop_reason': 'Reached final time', 'solver_duration': '0:00:00.000997', 't_final': np.float64(1.0)}, 'package_version': 'unknown', 'solver': {'class': 'ExplicitSolver', 'pde_class': 'DiffusionPDE', 'dt_statistics': {'min': 0.001, 'max': 0.16377518593819976, 'mean': 0.08333333333333333, 'std': 0.05095272967314988, 'count': 12.0}, 'scheme': 'runge-kutta', 'backend': 'numba', 'dt': 0.001, 'dt_adaptive': True, 'steps': 12, 'stochastic': False, 'post_step_data': None}} Diagnostic information for implicit solver: {'controller': {'mpi_run': False, 't_start': 0, 't_end': 1.0, 'profiler': {'solver': 0.8390226650000017, 'tracker': 4.411000000459353e-05, 'compilation': 0.6160930239999942}, 'jit_count': {'make_stepper': 1, 'simulation': 0}, 'solver_start': '2025-12-10 07:35:53.933960+00:00', 'successful': True, 'stop_reason': 'Reached final time', 'solver_duration': '0:00:00.839105', 't_final': 1.0}, 'package_version': 'unknown', 'solver': {'class': 'ImplicitSolver', 'pde_class': 'DiffusionPDE', 'function_evaluations': 0, 'scheme': 'implicit-euler', 'stochastic': False, 'backend': 'numba', 'dt': 0.001, 'dt_adaptive': False, 'steps': 1000, 'post_step_data': None}} Diagnostic information for Crank-Nicolson solver: {'controller': {'mpi_run': False, 't_start': 0, 't_end': 1.0, 'profiler': {'solver': 0.8213862320000089, 'tracker': 4.3739999995295875e-05, 'compilation': 0.6140412130000072}, 'jit_count': {'make_stepper': 1, 'simulation': 0}, 'solver_start': '2025-12-10 07:35:55.387662+00:00', 'successful': True, 'stop_reason': 'Reached final time', 'solver_duration': '0:00:00.821499', 't_final': 1.0}, 'package_version': 'unknown', 'solver': {'class': 'CrankNicolsonSolver', 'pde_class': 'DiffusionPDE', 'function_evaluations': 0, 'scheme': 'implicit-euler', 'stochastic': False, 'backend': 'numba', 'dt': 0.001, 'dt_adaptive': False, 'steps': 1000, 'post_step_data': None}} Diagnostic information for Adam-Bashforth solver: {'controller': {'mpi_run': False, 't_start': 0, 't_end': 1.0, 'profiler': {'solver': 0.010337458000009292, 'tracker': 3.3549999983506495e-05, 'compilation': 0.6123047009999993}, 'jit_count': {'make_stepper': 1, 'simulation': 0}, 'solver_start': '2025-12-10 07:35:56.822024+00:00', 'successful': True, 'stop_reason': 'Reached final time', 'solver_duration': '0:00:00.010366', 't_final': 1.0}, 'package_version': 'unknown', 'solver': {'class': 'AdamsBashforthSolver', 'pde_class': 'DiffusionPDE', 'backend': 'numba', 'dt': 0.001, 'dt_adaptive': False, 'steps': 1000, 'post_step_data': None, 'stochastic': False}} Diagnostic information for scipy solver: {'controller': {'mpi_run': False, 't_start': 0, 't_end': 1.0, 'profiler': {'solver': 0.0014126310000079911, 'tracker': 3.3059999992701705e-05, 'compilation': 0.6131197520000029}, 'jit_count': {'make_stepper': 1, 'simulation': 0}, 'solver_start': '2025-12-10 07:35:57.445829+00:00', 'successful': True, 'stop_reason': 'Reached final time', 'solver_duration': '0:00:00.001441', 't_final': np.float64(1.0)}, 'package_version': 'unknown', 'solver': {'class': 'ScipySolver', 'pde_class': 'DiffusionPDE', 'dt': 0.001, 'steps': 61, 'stochastic': False, 'backend': 'numba'}} | .. code-block:: Python import pde # initialize the grid, an initial condition, and the PDE grid = pde.UnitGrid([32, 32]) field = pde.ScalarField.random_uniform(grid, -1, 1) eq = pde.DiffusionPDE() def run_solver(solver, label): """Helper function testing the solver.""" controller = pde.Controller(solver, t_range=1, tracker=None) sol = controller.run(field, dt=1e-3) sol.label = label + " solver" print(f"Diagnostic information for {sol.label}:") print(controller.diagnostics) print() return sol # try different solvers solutions = [ run_solver(pde.ExplicitSolver(eq), "explicit Euler"), run_solver( pde.ExplicitSolver(eq, scheme="runge-kutta", adaptive=True), "explicit, adaptive Runge-Kutta", ), run_solver(pde.ImplicitSolver(eq), "implicit"), run_solver(pde.CrankNicolsonSolver(eq), "Crank-Nicolson"), run_solver(pde.AdamsBashforthSolver(eq), "Adam-Bashforth"), run_solver(pde.ScipySolver(eq), "scipy"), ] # plot both fields and give the deviation as the title deviations = [(solutions[0] - sol).fluctuations for sol in solutions] title = "Deviation: " + ", ".join(f"{deviation:.2g}" for deviation in deviations[1:]) pde.FieldCollection(solutions).plot(title=title, arrangement=(2, 3)) .. rst-class:: sphx-glr-timing **Total running time of the script:** (0 minutes 9.249 seconds) .. _sphx_glr_download_examples_gallery_advanced_pdes_solver_comparison.py: .. only:: html .. container:: sphx-glr-footer sphx-glr-footer-example .. container:: sphx-glr-download sphx-glr-download-jupyter :download:`Download Jupyter notebook: solver_comparison.ipynb ` .. container:: sphx-glr-download sphx-glr-download-python :download:`Download Python source code: solver_comparison.py ` .. container:: sphx-glr-download sphx-glr-download-zip :download:`Download zipped: solver_comparison.zip `