2014-02-20 3 views
1

У меня есть матрица T:умножения блок Numpy LHS собственный вектор раз в NumPy матрицу

[ 0.2 0.4 0.4] 
[ 0.8 0.2 0. ] 
[ 0.8 0. 0.2] 

Я хочу, чтобы умножить его на вектор л.ш. строк (s1, s2, s3) и установите выражение продукта, равное элементы соответствующего вектора ок столбца, поэтому было бы

vl * T = s(..., ..., ...) 

Это будет эквивалентно решением трех линейных уравнений, из которых вы можете решить для элементов собственных векторов с точностью до множителя масштабирования. Установка суммы элементов, равных 1, затем дает единицу собственного вектора.

Например, для начала, умножая вектор строки lhs на первый столбец матрицы и установив произведение, равное s1, вы получите уравнение 0,2 x s1 + 0,8 x s2 + 0,8 x s3 = s1.

Остальные два уравнения получены путем умножения вектора строки lhs на второй и третий столбцы матрицы и установки продуктов, равных s2 и s3, соответственно. Решение этих трех уравнений даст вам относительные значения среди s1, s2 и s3. После этого суммирование этих равных 1 даст вам элементы собственного вектора.

Я хочу сделать это с помощью питона, вот моя попытка:

>>> import numpy as np 
    >>> from scipy.linalg import eig 
    >>> np.set_printoptions(precision=4) 
    >>> T = np.mat("0.2 0.4 0.4;0.8 0.2 0.0;0.8 0.0 0.2") 
    >>> np.set_printoptions(precision=4) 
    >>> w, vl, vr = eig(T, left=True) 
    >>> vlUnit = vl[:,1]/sum(vl[:,1]) 
    >>> s = vlUnit 
    >>> s 
    array([ 7.3543e+15, -3.6772e+15, -3.6772e+15]) 

Так что я знаю, как vl и VlUnit являются тип numpy.array и T матрично

Я также не могу прочитать результаты s ,

Я конвертировал и его 7354300000000000, -3677200000000000, 3677200000000000, которые не выглядят мне прямо. Что я делаю не так??

Спасибо,

Chris

+0

v1Unit не является единичный вектор (если это то, что вам нужно). Единичные векторы вы получаете путем деления на длину (квадрат суммы квадратов элементов). Кроме того, если s является всего лишь единичным вектором, почему бы не назвать это напрямую? – deinonychusaur

+0

deinonychusaur, спасибо! Я не знал ... –

+0

deinonychusaur любые советы о том, как это сделать? –

ответ

1

Это должно дать вам единичный вектор v1:

v1Unit = np.linalg.norm(v1[:, 1]) 
+0

Спасибо deinonychusaur, 1) Как v1Unit = np.linalg.norm (v1 [:, 1]) отличается от v1Unit [:, 1]/sqrt (sum (vl [:, 1] ** 2))? 2) Я правильно умножу свой vl * T на python, чтобы решить проблему? –

+0

должно быть то же самое, что просто выглядит аккуратно, чтобы использовать np.linalg.norm – deinonychusaur

+0

Спасибо, помощник! Я изучаю, что мне нужно знать, правильно ли выполняю умножение. Что ты думаешь? –

Смежные вопросы