Почему индекс на Python выходит за пределы списка?
Получаю список списков конечных разниц string_all_dif_10
, в котором 10 элементов-строк таблицы. В каждой строке от 1 до 10 элементов-чисел. Есть переменная order
, равная 5. Когда в пункте кода 6.4.1.2 прохожу циклом в диапазоне (order+1)
, то получаю ошибку выхода индекса за диапазон.
Ошибка:
IndexError Traceback (most recent call last)
<ipython-input-38-8e00958d1d18> in <module>
214 return diff_table
215
--> 216 diffs()
217
<ipython-input-38-8e00958d1d18> in diffs()
94 print(f"Список string_one_2: {string_one_2}")
95 for nums in range(order + 1):
---> 96 koef = string_one_2[nums] / (np.math.factorial(nums))
97
98
IndexError: list index out of range
В коде определяется коэффициент k
, который из разных строк выбирает требуемую (это коэффициент как раз и задает), формируя переменную string_one_2
.
Но:
- при проверке
print(f"Список string_one_2: {string_one_2}")
вижу, что строка не одна, а несколько;- переменная цикла
nums
, как и сказал, выводит перебор за границы списка (по идее мы должны получить перебор по одной строке, а не в пределах строк в рамках списка списков).
В чем может быть ошибка?
import numpy as np
import pandas as pd
from itertools import zip_longest
def func(x):
return np.sin(x)
def diffs():
# 1. получим значения полинома
# 1.1. запросим порядок полинома
order = 5
# 1.2. определим коэффициент n, шаг h
num = 10
h = 0.1 * np.pi
# сетка абсцисс оси Ох и ординат на Oy
x_i_list = [(h * i) for i in range(0, num + 1)]
y_i_list = [(func(x)) for x in x_i_list]
# новая сетка
x_j_list = [(h / 2 * j) for j in range(0, num * 2 + 1)]
# 3. Рассчитаем конечные разности для сетки
# 3.1. Сначала по столбцам
if order < len( y_i_list):
result_10 = [np.diff( y_i_list, n=d) for d in np.arange(1, len( y_i_list ))]
else:
print(f'Определите порядок полинома меньше {len(y_i_list) - 1}')
# 3.2. Следом представление разниц переформатируем в построчное размещение
string_all_dif_10 = [list(filter(lambda x_source: x_source is not None, els_source)) for els_source in
zip_longest(*result_10)]
# 4. Длина сетки (x_j).
num_new_grid = 20
# 6. пока индексы в сетке x_j_list_dif не достигли длины списка:
for point, point_elem_j_dif in enumerate(x_j_list):
# 6.1. имеем дело с ближайшим для j слева значением:
k = min(num_new_grid - order, point // 2)
string_one_2 = string_all_dif_10[k] # строка с дельтами
# 6.4.1.2. считаем коэффициент для второй производной
print(f"Список string_one_2: {string_one_2}")
for nums in range(order + 1):
koef = string_one_2[nums] / (np.math.factorial(nums))