Я пытаюсь написать сценарий, который помещает матрицу в уменьшенную форму ряда строк, однако мой сценарий (и другие сценарии python, которые я нашел в Интернете), похоже, дает сбой в определенных случаях.
Например, мой скрипт выдает правильные результаты на следующих матрицах:
In: [[-1 1]
[-1 2]
[-3 2]]
Out: [[1. 0.]
[0. 1.]
[0. 0.]]
In: [[-1 1 0 1]
[-2 -3 -1 -2]
[-3 -1 -2 -1]]
Out: [[ 1. 0. 0. -0.33333333]
[ 0. 1. 0. 0.66666667]
[-0. -0. 1. 0.66666667]]
Но на матрицах, подобных этой, это не работает:
In: [[ 0 -3 1 -1]
[-2 1 0 3]]
Out: [[ 1. -0.5 -0. -1.5]
[ 0. 0. 0. 0. ]]
Где правильный ответ должен быть:
[[ 1. 0. -0.16666, -1.33333
[ 0. 1. -0.33333, 0.33333 ]]
Код для rref следующий:
import numpy as np
def rref(M):
lead = 0
rowCount = len(M)
columnCount = len(M[0])
for r in range(rowCount):
if lead >= columnCount:
return
i = r
while (M[i][lead] == 0):
i += 1
if (i == rowCount):
i = r
lead += 1
if (columnCount == lead):
return
M[r],M[i] = M[i],M[r]
if (M[r][lead] != 0):
M[r] = M[r]/M[r][lead]
for i in range (rowCount):
if (i != r):
M[i] = M[i] - M[i][lead]*M[r]
lead += 1
a = np.array([[0,-3,1,-1],[-2,1,0,3]])
#prints original matrix
print(a)
#ARRAY MUST BE FLOATS FOR RREF FUNCTION
a = a.astype(np.float)
rref(a)
#prints rref matrix
print(a)
Этот код является улучшением также и нефункционального кода, найденного здесь: https://rosettacode.org/wiki/Reduced_row_echelon_form#Python
Мне известно, что в sympy есть встроенная функция rref, и я знаю, как ее использовать, но мне нужно реализовать свой собственный код rref, так как позже мне потребуется отслеживать замены строк / операции, выполняемые с оригиналом. матрица.