#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)