2013-10-02 3 views
1

Вот моя проблема, у меня есть вещественная симметричная матрица M в зависимости от двух параметров а, б (которые предполагаются положительными), и я хочу найти ортогональную матрицу P такой, что PMP^{- 1} является диагональной матрицей. Вот пример того, что я сделал:диагонализирующие симметричная матрица в Maxima

assume(a>0,b>0); 
M : matrix([a,a+b,a+b],[a+b,a,a+b],[a+b,a+b,a]); 
load("eigen"); 
[myeigval,myeigvec]:similaritytransform(ev(M,hermitianmatrix)); 

или просто

assume(a>0,b>0); 
M : matrix([a,a+b,a+b],[a+b,a,a+b],[a+b,a+b,a]); 
load("eigen"); 
[myeigval,myeigvec]:similaritytransform(M); 

я получаю тот же результат для этих двух тестов:

[[[2*b+3*a,-b],[1,2]],[[[1/sqrt(3),1/sqrt(3),1/sqrt(3)]],[[1/sqrt(2),0,-1/sqrt(2)],[0,1/sqrt(2),-1/sqrt(2)]]]] 

норма векторов равна 1, но эти векторы не дают мне ортогональной матрицы. Может кто-нибудь объяснить мне, в чем проблема?

ответ

3

Посмотрите на глобальные переменные rightmatrix и leftmatrix после того, как вы позвоните similaritytransform. Когда я попробую ваш пример, я обнаружил, что rightmatrix . leftmatrix - это единичная матрица (и так leftmatrix . rightmatrix).

Согласен, что документация для similaritytransform не совсем понятна. Ну что ж.

+0

Благодарим вас за ответ. Я согласен, что мы получаем rightmatrix.leftmatrix = Identity, но правая матрица не является транспонированием левой матрицы, и это то, что я хочу. Вы знаете, как это получить? – user37238

+0

@ user37238 ОК, я понимаю вопрос сейчас. Похоже, что когда некоторое собственное число имеет кратность> 1, соответствующие собственные векторы, возвращаемые 'сходным преобразованием', не обязательно ортогональны. (Вероятно, это ошибка в 'similaritytransform'.) Вы можете применить функцию' gramschmidt' для построения ортогональных векторов, хотя, если вы хотите ортонормировать, вам придется нормализовать их после 'gramschmidt'. –

+0

@ user37238 Я думаю, именно то, что вы хотите сделать, это 'gramschmidt (transpose (rightmatrix))'. –

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