Я почти уверен, что вы пропустили цель этого упражнения, если вы можете использовать inv
, то вы также можете использовать linalg.inv(A)
или лучше linalg.solve(A,b)
. Обратите внимание, что у вас есть ошибки знака и что умножение *
не является умножением матрицы между numpy массивами. (Ваша декларация массивов несовместима с их последующим использованием.)
Ваша конкретная проблема c может быть решена путем добавления дополнительного теста
if i>1 and abs(w[-1] - w[-2]) < err:
при первом условии терпит неудачу второй не оценивается.
Вы должны подумать, не является ли пустой тратой памяти создание списка w
, когда все, что вам когда-либо понадобится, это последние две записи.
x_last, x = x, jacobi_step(A,b,x)
также будет работать для имейте это в наличии.
Подготовка может быть уменьшена до
D=np.diag(A); A_reduced = A-np.diag(D);
, тогда шаг Якоби будет простым, используя, что арифметические c операции применяются поэлементно по умолчанию
x_last, x = x, (b-A_reduced.dot(x))/D