Я пытаюсь взять квадратный корень матрицы. Это найти матрицу B
так B*B=A
. Ни один из методов, которые я нашел, не дает рабочего результата.Рабочая матрица Квадратный корень
Сначала я нашел эту формулу на Wikipedia:
Набор Y_0 = A
и Z_0 = I
затем итерацию:
Y_{k+1} = .5*(Y_k + Z_k^{-1}),
Z_{k+1} = .5*(Z_k + Y_k^{-1}).
Тогда Y
должны сходиться к B
.
Однако реализации алгоритма в Python (с использованием NumPy для обратных матриц), дал мне мусор результатов:
>>> def denbev(Y,Z,n):
if n == 0: return Y,Z
return denbev(.5*(Y+Z**-1), .5*(Z+Y**-1), n-1)
>>> denbev(matrix('1,2;3,4'), matrix('1,0;0,1'), 3)[0]**2
matrix([[ 1.31969074, 1.85986159],
[ 2.78979239, 4.10948313]])
>>> denbev(matrix('1,2;3,4'), matrix('1,0;0,1'), 100)[0]**2
matrix([[ 1.44409972, 1.79685675],
[ 2.69528512, 4.13938485]])
Как вы можете видеть, перебор 100 раз, дает хуже результатов, чем итерация три раза, и ни один из результатов не попадает в пределы погрешности 40%.
Тогда я попробовал SciPy метод sqrtm, но это было еще хуже:
>>> scipy.linalg.sqrtm(matrix('1,2;3,4'))**2
array([[ 0.09090909+0.51425948j, 0.60606061-0.34283965j],
[ 1.36363636-0.77138922j, 3.09090909+0.51425948j]])
>>> scipy.linalg.sqrtm(matrix('1,2;3,4')**2)
array([[ 1.56669890+0.j, 1.74077656+0.j],
[ 2.61116484+0.j, 4.17786374+0.j]])
Я не знаю много о матрице квадратного укоренения, но я полагаю, что должно быть алгоритмы, которые работают лучше, чем выше ?
спасибо. Работает отлично. Только я до сих пор не понимаю, почему 'sqrtm (matrix ('1,2; 3,4') ** 2)' не работает? –
Он работает ... попробуйте построить решение, см. Http://www.mathworks.com/help/techdoc/ref/sqrtm.html – steabert
Правильно, есть много решений, и sqrtm просто выбирает другой, чем я. –