2016-04-17 2 views
2

Предположим, у меня есть приведенная матрица в такой форме:Нахождение решения грести редуцированной матрицы питона

x y z = 
[[2.0, 4.0, 4.0, 4.0], 
[0.0, 2.0, 1.0, 2.0], 
[0.0, 0.0, 1.0, 1.0], 
[0.0, 0.0, 0.0, 0.0]] 

И я хочу, массив, содержащий решения.

В этом случае я хотел бы вернуться

z y  x 
[1.0, 0.5, -1.0] 

Мы можем предположить, что это идеальный треугольник без свободных переменных.

Я искал scipy.linalg.solve, чтобы решить, но это требует формы Ax=B, и я не уверен, как конвертировать в эту форму.

+1

Что именно вы подразумеваете под «решениями»? – miradulo

+0

См. Править. Я хочу вернуть х, у, z в этом случае в виде массива –

ответ

4

У вас уже есть вся информация, необходимая для использования numpy.linalg.solve. A представлен тремя основными столбцами вашего 2d массива, а b - последний столбец. Следовательно, если вы нарезаете свой массив на эти элементы соответственно, вы можете позвонить .solve. Обратите внимание, что я отрезал последнюю строку таким образом, что ваша система будет хорошо определяется, как numpy.linalg.solve требует хорошо определенную систему:

init_array = numpy.array(
     [[2.0, 4.0, 4.0, 4.0], 
     [0.0, 2.0, 1.0, 2.0], 
     [0.0, 0.0, 1.0, 1.0], 
     [0.0, 0.0, 0.0, 0.0]]) 

A = init_array[0:3,:-1] 
b = init_array[0:3, -1] 
x = numpy.linalg.solve(A, b) 
print(x) 

Выходы:

[-1. 0.5 1. ] 

Дальнейшее чтение:

+0

Предположим, что это была матрица 'nxn'. Я бы использовал 'init_array [0: n-1,: -1]' –

+0

@GregPeckory Нет, вы могли бы использовать методы списка для создания 'A' и' b'. Например, 'A = [sub [: 3] для sub в coeff [: - 1]]' – miradulo

+0

Извините, что понимание списков меня немного смущает, не могли бы вы объяснить, как я могу создать общий случай для 'nxn' матриц, извините за hassle –

1

Примечание, чем:

 [2.0, 4.0, 4.0, 4.0] x  0 
    [0.0, 2.0, 1.0, 2.0] y = 0 
    [0.0, 0.0, 1.0, 1.0] z  0 
    [0.0, 0.0, 0.0,-1.0] t  1 

имеет тот же раствор, с т = -1.

Так что давайте I=np.eye(4) и b=I[3]. затем раствор определяют следующим образом:

In [2]: solve(A-I*b,b)[:-1] 
Out[2]: array([-1. , 0.5, 1. ]) 
Смежные вопросы