почему возникает ошибка "index 4 is out of bounds for axis 0 with size 4"
import numpy as np
import matplotlib.pyplot as plt
def cubic_spline(x, y, y_prime):
n = len(x)
h = np.diff(x)
alpha = np.zeros(n - 1)
beta = np.zeros(n - 1)
for i in range(1, n - 1):
alpha[i] = h[i - 1] / (h[i - 1] + h[i])
beta[i] = (3 / h[i]) * (y[i + 1] - y[i]) - (3 / h[i - 1]) * (y[i] - y[i - 1])
c = np.zeros(n)
l = np.zeros(n)
mu = np.zeros(n)
z = np.zeros(n)
l[0] = 1
mu[0] = 0
z[0] = 0
for i in range(1, n - 1):
l[i] = 2 * (x[i + 1] - x[i - 1]) - h[i - 1] * mu[i - 1]
mu[i] = h[i] / l[i]
z[i] = (beta[i] - h[i - 1] * z[i - 1]) / l[i]
l[-1] = 1
z[-1] = 0
c[-1] = 0
for j in range(n - 2, -1, -1):
c[j] = z[j] - mu[j] * c[j + 1]
b = np.zeros(n - 1)
d = np.zeros(n - 1)
for j in range(n - 1):
b[j] = (y[j + 1] - y[j]) / h[j] - h[j] * (c[j + 1] + 2 * c[j]) / 3
d[j] = (c[j + 1] - c[j]) / (3 * h[j])
return b, c, d
def evaluate_spline(x, a, b, c, d):
n = len(a) + 1
y = np.zeros_like(x)
for i in range(n - 1):
mask = (x >= x[i]) & (x <= x[i + 1])
y[mask] = a[i] + b[i] * (x[mask] - x[i]) + c[i] * (x[mask] - x[i]) ** 2 + d[i] * (x[mask] - x[i]) ** 3
return y
# Пример использования
x = np.array([0, 1, 2, 3, 4]) # Узлы сплайна
y = np.array([0, 1, 4, 1, 0]) # Значения функции в узлах сплайна
y_prime = np.array([1, 2, 1, -1, -2]) # Значения производной функции в узлах сплайна
b, c, d = cubic_spline(x, y, y_prime)
x_eval = np.linspace(0, 4, 100)
y_eval = evaluate_spline(x_eval, y, b, c, d)
plt.plot(x_eval, y_eval, label='Cubic Spline')
plt.scatter(x, y, color='red', label='Data Points')
plt.xlabel('x')
plt.ylabel('y')
plt.legend()
plt.grid(True)
plt.show()
Ошибка после запуска следующая:
Traceback (most recent call last):
File "D:\pythonProject2\main1.py", line 62, in <module>
y_eval = evaluate_spline(x_eval, y, b, c, d)
File "D:\pythonProject2\main1.py", line 50, in evaluate_spline
y[mask] = a[i] + b[i] * (x[mask] - x[i]) + c[i] * (x[mask] - x[i]) ** 2 + d[i] * (x[mask] - x[i]) ** 3
IndexError: index 4 is out of bounds for axis 0 with size 4
Ответы (1 шт):
Автор решения: Oopss
→ Ссылка
Ошибка "index 4 is out of bounds for axis 0 with size 4" возникает по тому, что в функции evaluate_spline(x, a, b, c, d): в момент ошибки, список
b в своем составе четыре элемента [0.0, 3.0, 0.0, -3.0] и список
d имеет четыре элемента [1.0, -3.0, 3.0, -0.999]
n=6, т.е. n - 1 = 5, получается что максимальный индекс этих массивов равен 3. Когда i достигает 4, в b[i] и d[i], возникает ошибка!