2010-11-09 2 views
2

Итак, я делаю метод мощности в python.Как избежать кажущегося неизбежного деления на ноль

В принципе, уравнение вращается вокруг умножения матрицы А на вектор (у), как это:

for i in range(0, 100): 

    y = mult(matrix,y) 

    y = scalarMult(y, 1.0/y[0][0]) 

Затем нужно умножить вектор у на 1/(первый элемент в г). Теперь, если матрица разрежена или имеет нуль в нужном месте, вы получите нуль для первого элемента в a. Ни одно из моих навыков работы с поисковыми системами не привело к модификации метода мощности, чтобы избежать этого.

Для заинтересованных, я пытаюсь решить для собственных значений матрицы; и мой код работает до тех пор, пока не осталось слишком много нулей.

+1

Если вы можете использовать стороннюю библиотеку, попробуйте существующие решения, такие как [numpy.linalg.eig] (http://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.eig.html# numpy.linalg.eig). – kennytm

+1

На стороне: Вы знаете о пакетах, таких как numpy и scipy? В вашем случае может представлять интерес numpy.linalg.eig. –

ответ

3

Вместо деления на первый элемент вектора вы можете разделить по одной из своих норм. Например, если вы используете вторую норму, длина вектора всегда будет 1.

norm = sum(e**2 for e in y)**0.5 

норма вектора равна нулю только при векторе 0 (имеет все элементы 0), так что деление на 0 не должны бывает.