Глядя на вашу первую итерацию:
H = np.zeros((NS,50))
Q = np.zeros((NS,50))
for i in range(NS):
H[0][i] = HR-i*R*Q0**2
Q[0][i] = Q0
Форма H
равна (NS,50)
, но когда вы перебираете range(NS)
, вы применяете этот индекс ко 2-му измерению. Зачем? Разве это не относится к размеру с размером NS
?
В numpy
массивы имеют порядок 'C' по умолчанию. Последнее измерение самое внутреннее. У них может быть приказ F
(фортран), но давайте не будем туда идти. Думая о 2d массиве как о таблице, мы обычно говорим о строках и столбцах, хотя у них нет формального определения в numpy
.
Предположим, вы хотите установить для первого столбца следующие значения:
for i in range(NS):
H[i, 0] = HR - i*R*Q0**2
Q[i, 0] = Q0
Но мы можем выполнять назначение целых строк или столбцов одновременно. Я полагаю, что новые версии Fortran также имеют эти функции «целого массива».
Q[:, 0] = Q0
H[:, 0] = HR - np.arange(NS) * R * Q0**2
Одно предостережение при переводе на Python
. Индексирование начинается с 0; так же, как и диапазоны np.arange(...)
.
H[0][i]
функционально совпадает с H[0,i]
. Но при использовании срезов вы должны использовать формат H[:,i]
.
Я подозреваю, что у других ваших итераций есть похожие проблемы, но я пока остановлюсь здесь.