Как я могу исправить это для l oop, чтобы решить систему линейных уравнений с помощью итерационного метода Якоби? - PullRequest
0 голосов
/ 31 марта 2020

Я пытаюсь написать функцию, которая проходит итерационный метод Якоби для решения системы линейных уравнений. У меня есть большая часть этого, мне просто нужно выяснить, как выполнить итерацию последнего для l oop либо 1000 раз, либо до тех пор, пока не будет выполнено условие разрыва. Как я могу сделать так, чтобы значение x обновляло каждую итерацию?

import numpy as np

def Jacobi(A,b,err):
    n = A.shape
    k = np.zeros(n[0])
    D = np.zeros(n)
    U = np.zeros(n)
    L = np.zeros(n)
    for i in range(n[0]):
        for j in range(n[0]):
            if i == j:
                D[i,j] = A[i,j]
            elif i < j:
                U[i,j] = A[i,j]
            else:
                L[i,j] = A[i,j]
    w = []
    for i in range(1000):
        x = np.linalg.inv(D)*(U+L)*x +np.linalg.inv(D)*b
        w.append(x)

        if abs(w[-1] - w[-2]) < err:
            break
    return w[-1]

Для справки, мое утверждение об ошибке говорит, что индекс списка в предложении if находится вне диапазона. Я предполагаю, что это потому, что есть только один элемент в w, так как я не знаю, как сделать для l oop. Заранее спасибо за любую помощь.

1 Ответ

1 голос
/ 31 марта 2020

Я почти уверен, что вы пропустили цель этого упражнения, если вы можете использовать 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
...