Я хочу получить точечное произведение матрицы X и Adjugate (X) в Python, Numpy, я пробовал оба метода, найденные из здесь . Адъюгат из обоих методов дает один и тот же ответ, но когда я выполняю скалярное произведение, были даны разные ответы. Вот код:
#first method
def CM(A):
row, col = A.shape
minor = np.zeros((row-1,col-1))
cofactor = list()
for r in range(row):
for c in range(col):
minor[:r,:c] = A[:r,:c]
minor[r:,:c] = A[r+1:,:c]
minor[:r,c:] = A[:r,c+1:]
minor[r:,c:] = A[r+1:,c+1:]
cofactor.append(np.linalg.det(minor)*(-1)**(r+c))
return np.array(cofactor).reshape(3,3)
#second method
def CM1(A):
return np.linalg.inv(A).T*np.linalg.det(A)
#define x
X = np.array([[-3,2,-5],[-1,0,-2],[3,-4,1]])
print("Output:\n")
print("X =\n", X)
#the adjugate from both method give same answer
print("\nAdjugate(X) =\n",CM(X).T)
print("\nAdj1(X) =\n",CM1(X).T)
#but when I perform dot product, different answers were given
print("\nX dot Adjugate(X) =\n",X.dot(CM(X).T))
print("\nX dot Adj1(X) =\n",X.dot(CM1(X).T))
Вот вывод:
Output:
X =
[[-3 2 -5]
[-1 0 -2]
[ 3 -4 1]]
Adjugate(X) =
[[-8. 18. -4.]
[-5. 12. -1.]
[ 4. -6. 2.]]
Adj1(X) =
[[-8. 18. -4.]
[-5. 12. -1.]
[ 4. -6. 2.]]
X dot Adjugate(X) =
[[-6.00000000e+00 1.42108547e-14 0.00000000e+00]
[-1.77635684e-15 -6.00000000e+00 0.00000000e+00]
[ 1.06581410e-14 -1.42108547e-14 -6.00000000e+00]]
X dot Adj1(X) =
[[-6.00000000e+00 6.21724894e-15 2.22044605e-15]
[ 1.77635684e-15 -6.00000000e+00 8.88178420e-16]
[-4.44089210e-15 -6.21724894e-15 -6.00000000e+00]]
Затем я пытаюсь проверить это, сравнивая их с обратной матрицей X, на этот раз все обратные X дают одинаковое значение
Код:
print("\nInverse (X) =\n",CM(X).T/np.linalg.det(X))
print("\nInv1 (X) =\n",CM1(X).T/np.linalg.det(X))
print("\nInverse X from numpy =\n",np.linalg.inv(X))
Выход:
Inverse (X) =
[[ 1.33333333 -3. 0.66666667]
[ 0.83333333 -2. 0.16666667]
[-0.66666667 1. -0.33333333]]
Inv1 (X) =
[[ 1.33333333 -3. 0.66666667]
[ 0.83333333 -2. 0.16666667]
[-0.66666667 1. -0.33333333]]
Inverse X from numpy =
[[ 1.33333333 -3. 0.66666667]
[ 0.83333333 -2. 0.16666667]
[-0.66666667 1. -0.33333333]]
Может кто-нибудь объяснить мне, почему?