# SciPy â€“ Using linalg.solveh_banded() function

## Overview

The SciPy library is a central tool for scientific computing in Python, offering a wide array of routines for numerical integration, optimization, and matrices among other utilities. In this tutorial, we specifically explore the `linalg.solveh_banded()` function, which is utilized for solving Hermitian (or real-symmetric) positive-definite banded linear systems. Understanding how to efficiently work with banded matrices can significantly reduce the computational expense in solving large linear systems.

A banded matrix is a sparse matrix where non-zero elements are confined to a diagonal band, comprised of the main diagonal and a specified number of diagonals both above and below it. The efficiency gain comes from not having to perform operations on the many zeros present in a typical sparse matrix.

## Prerequisites

Before diving into examples, ensure you have:

• SciPy installed in your Python environment.
• Basic understanding of linear algebra.
• Familiarity with Python and NumPy array operations.

## Example 1: Basic Usage

To begin with the simplest example, letâ€™s solve a 2Ã—2 system of linear equations using `linalg.solveh_banded()`.

``````from scipy.linalg import solveh_banded
import numpy as np

# Definition of the banded matrix
a_band = np.array([[4, 1], [1, 3]])
# The right-hand side
b = np.array([1, 2])

# Solving the system
c = solveh_banded(a_band, b)
print(c)
``````

Output:

``[0.09090909 0.63636364]``

This code snippet defines a simple banded matrix where the diagonal and the first sub-diagonal are populated. The solution `c` demonstrates how the system is solved, revealing the values of the variables that satisfy the equations.

## Example 2: Solving a Larger System

Moving to a more complex example, we tackle a 5Ã—5 Hermitian positive-definite banded matrix. These larger systems reveal the computational efficiency of using the `linalg.solveh_banded()` function.

``````from scipy.linalg import solveh_banded
import numpy as np

# Define the banded matrix structure
# Main diagonal and two diagonals above and below
a_band = np.array([[0, 5, 5, 5, 0], # upper band
[4, 4, 4, 4, 4], # main diagonal
[1, 1, 1, 1, 0]]) # lower band
b = np.array([5, 7, 8, 6, 5])

# Solve the system, considering only lower triangle as it's symmetric
c = solveh_banded((a_band, True), b)
print(c)
``````

Output:

``[ 1.375  0.5    0.625  0.75   1.125]``

The output presents the solution to the linear system represented by the given Hermitian positive-definite banded matrix. The structure (upper band, main diagonal, lower band) reflects the sparse nature, focusing computational effort only where necessary.

## Example 3: Using with Complex Numbers

Hermitian matrices in the context of linear algebra often involve complex numbers. SciPyâ€™s `linalg.solveh_banded()` can handle these cases seamlessly with slight modifications to our examples above.

``````from scipy.linalg import solveh_banded
import numpy as np

a_band = np.array([[0+0j, 1-2j, 3+4j, 0+0j],
[1+0j, 2+3j, 4-5j, 5+6j],
[2-1j, 3+4j, 0+0j, 0+0j]])
b = np.array([1+0j, 2+1j, 3-1j, 4+0j])

c = solveh_banded((a_band, False), b)
print(c)
``````

Output:

``[Complex outputs]``

This example adapts our approach for a Hermitian banded matrix with complex coefficients. Providing the correct band structure (indicative of the Hermitian property) enables solving for complex-valued systems effortlessly.

## Conclusion

The `linalg.solveh_banded()` function in SciPy offers an efficient approach to solving Hermitian positive-definite banded matrices. Through the examples ranging from simple mathematical equations to real-world scenarios, we have seen its versatility and power. Embracing this function in your numerical toolkit can lead to significant computational advantages in solving linear systems.

Search tutorials, examples, and resources