from mpi4py import MPI
import numpy as np
import matplotlib.pyplot as plt

def create_jacobi_matrix(n, c1, c2, b):
    c = np.array([c1 if i % 2 == 0 else c2 for i in range(n)])
    b = np.full(n-1, b)
    return np.diag(c) + np.diag(b, k=1) + np.diag(b, k=-1)

def calculate_sturm_count(diagonal, off_diagonal, x):
    n = len(diagonal)

    p0 = 1.0
    p1 = diagonal[0] - x
    if np.isclose(p1, 0):
        p1 = 1e-10
    count = 0
    if p1 < 0:
        count += 1
    for i in range(1, n):
        p2 = (diagonal[i] - x) * p1 - off_diagonal[i-1]**2 * p0
        if np.isclose(p2, 0):
            p2 = 1e-10
        if p1 * p2 < 0:
            count += 1
        p0, p1 = p1, p2
    return count

# Инициализация MPI
comm = MPI.COMM_WORLD
rank = comm.Get_rank()
size = comm.Get_size()

# Параметры
n = 100
c1 = 12
c2 = 7
b = 15

# Генерация матрицы Якоби
jacobi_matrix = create_jacobi_matrix(n, c1, c2, b)
diagonal = np.diag(jacobi_matrix)
off_diagonal = np.diag(jacobi_matrix, k=1)

# Получение собственных значений
eigenvalues, _ = np.linalg.eig(jacobi_matrix)
eigenvalues.sort()
interval_min, interval_max = eigenvalues.min(), eigenvalues.max()

# Создание точек для интервала и разделение на процессы
num_points = 20  # Общее число точек
step = (interval_max - interval_min) / num_points
x_points = np.linspace(interval_min - step, interval_max + step, num_points + 2)

# Определить, сколько точек должен обрабатывать каждый процесс
points_per_process = len(x_points) // size

# Распределить точки между процессами
if rank < size - 1:
    local_points = x_points[rank * points_per_process: (rank + 1) * points_per_process]
else:
    local_points = x_points[rank * points_per_process:]

# Подсчет числа собственных значений на локальных отрезках
local_counts = np.zeros(len(local_points), dtype=int)
for idx, x in enumerate(local_points):
    local_counts[idx] = calculate_sturm_count(diagonal, off_diagonal, x)

# Сбор данных с всех процессов
# Убедитесь, что количество элементов в all_counts соответствует общему количеству точек x_points
all_counts = None
if rank == 0:
    all_counts = np.zeros(num_points, dtype=int)

# Сбор результатов со всех процессов
comm.Gatherv(local_counts, (all_counts, points_per_process), root=0)

# Построение графика на главном процессе
if rank == 0:
    # Вычисление различий между соседними значениями
    count_differences = np.diff(all_counts)

    # Построение гистограммы
    plt.bar(x_points[:-1], count_differences, width=(x_points[1] - x_points[0]), align='edge', label='Sequential')
    
    # Построение перевёрнутого графика для MPI
    plt.bar(x_points[:-1], -np.array(count_differences), width=(x_points[1] - x_points[0]), align='edge', alpha=0.5, label='MPI')

    plt.xlabel('Отрезки')
    plt.ylabel('Изменение числа собственных значений')
    plt.title('Количество собственных значений в каждом отрезке')
    plt.xticks(ticks=x_points[:-1], labels=[f'{x:.2f}' for x in x_points[:-1]], rotation=45, ha="right")
    plt.legend()
    plt.tight_layout()
    plt.show()

Выдаёт ошибку

Traceback (most recent call last):
  File "C:\Users\home\Desktop\Simple\mpi2.py", line 76, in <module>
    comm.Gatherv(local_counts, (all_counts, points_per_process), root=0)
  File "src\\mpi4py\\MPI.src\\Comm.pyx", line 956, in mpi4py.MPI.Comm.Gatherv
mpi4py.MPI.Exception: Message truncated, error stack:
MPI_Gatherv failed(sbuf=0x0000019E47A2C1A0, scount=5, MPI_LONG, rbuf=0x0000019E47B8E6B0, rcnts=0x0000019E47A2BF20, displs=0x0000019E47A2BD40, MPI_LONG, root=0, MPI_COMM_WORLD) failed
Message from rank 3 and tag -1342177152 truncated; 28 bytes received but buffer size is 20