Получение ошибки double_scalars, переполнение в matmul, недопустимое значение в matmul, с использованием итерационного метода Якоби

#python #numpy #matrix #runtime-error #overflow

Вопрос:

Я пытаюсь закодировать итерацию Якоби на Python и сравнить x_(k 1)= D^(-1) b- (D^(-1) O) x_k с исходной матрицей. Диагональная матрица равна D, а недиагональная матрица равна O. Я получаю ошибку double_scalars, переполнение в matmul и недопустимое значение в matmul. Есть некоторые матричные входы, которые не приводят к ошибке, поэтому я не уверен, в чем ее причина. Насколько я могу судить, фактическая итерация Якоби верна с D и O, но я не могу провести через нее исходные матрицы A и b.

 A = np.array([[5, 6, 7, 5, -1],
              [8, -4, -1, 0, -3],
              [2, 1, -1, 3, 6],
              [-9, 10, 1, -4, 6],
              [9, 5, -5, -8, 4]])
b = np.array([[-3],
              [5],
              [2],
              [9],
              [-2]])

n = 5
Adot = np.copy(A)
for i in range(n):
    sum = 0
    for k in range(n):
        sum  = abs(A[i,k])
    Adot [i, i] = sum
print('A* =n',Adot)
D = np.diag(np.diag(Adot))
O = Adot - D
D_inv = np.linalg.inv(D)
x_k = 2   np.zeros([n,1])
iterations = 0
while True:
    iterations  = 1
    D_inv_O = np.matmul(D_inv,O)
    D_inv_x_k = np.matmul(D_inv_O, x_k)
    D_inv_b = np.matmul(D_inv,b)
    x_k_p1 = D_inv_b - D_inv_x_k
    e=np.linalg.norm(x_k_p1-x_k)/np.linalg.norm(x_k)
    if e<10**-6:
        break
    x_k = np.copy(x_k_p1)
print("x_k values for Adot = n", x_k)
print("2-norm error = ", e)
print("Number of iterations =", iterations)
print("    ")

n = 5
print('A =n',A)
D = np.diag(np.diag(A))
O = A - D
D_inv = np.linalg.inv(D)
x_k = 2   np.zeros([n,1])
iterations = 0
while True:
    iterations  = 1
    D_inv_O = np.matmul(D_inv,O)
    D_inv_x_k = np.matmul(D_inv_O, x_k)
    D_inv_b = np.matmul(D_inv,b)
    x_k_p1 = D_inv_b - D_inv_x_k
    error = np.linalg.norm(x_k_p1 - x_k)/np.linalg.norm(x_k)
    if error<0.000001:
        break
    x_k = np.copy(x_k_p1)
print("x_k values for A = n" , x_k)
print("2-norm error = ", error)
print("Number of iterations = ", iterations)
 

Выход:

 A* =
 [[24  6  7  5 -1]
 [ 8 16 -1  0 -3]
 [ 2  1 13  3  6]
 [-9 10  1 30  6]
 [ 9  5 -5 -8 31]]
x_k values for Adot = 
 [[-0.29995663]
 [ 0.46969663]
 [ 0.15873728]
 [ 0.05103921]
 [-0.014415  ]]
2-norm error =  9.183062537962699e-07
Number of iterations = 24
    
A =
 [[ 5  6  7  5 -1]
 [ 8 -4 -1  0 -3]
 [ 2  1 -1  3  6]
 [-9 10  1 -4  6]
 [ 9  5 -5 -8  4]]
RuntimeWarning: invalid value encountered in double_scalars error = np.linalg.norm(x_k_p1 - x_k)/np.linalg.norm(x_k)
RuntimeWarning: overflow encountered in matmul D_inv_x_k = np.matmul(D_inv_O, x_k)
RuntimeWarning: invalid value encountered in matmul D_inv_x_k = np.matmul(D_inv_O, x_k)