Скрипт формы с уменьшенным числом строк не работает в определенных случаях - PullRequest
1 голос
/ 10 июня 2019

Я пытаюсь написать сценарий, который помещает матрицу в уменьшенную форму ряда строк, однако мой сценарий (и другие сценарии 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, так как позже мне потребуется отслеживать замены строк / операции, выполняемые с оригиналом. матрица.

1 Ответ

1 голос
/ 10 июня 2019

Ваши строки не поменялись должным образом.

M[r],M[i] = M[i],M[r]

приводит к

[-2.  1.  0.  3.]
[-2.  1.  0.  3.]

Правильный способ обмена -

M[[r,i]] = M[[i,r]]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...