LAPACK не может вычислить собственные векторы

Я написал некоторый код для решения общей проблемы собственных значений, и теперь я сравниваю свои результаты с функцией LAPACK DSPGVX. Я только что работал с этим примером.

Итак, я получил 4 автовектора

{
 {-0.0319133, -0.265466, -0.713483,  0.64765},
 {-0.425628,  -0.520961, -0.714215,  0.193227},
 { 0.32702,    0.565845, -0.37129,  -0.659561},
 {-0.682699,  -0.056645,  0.0771025, 0.724409}
}

и автоматические значения

{-2.22545, 1.12704, -0.454756, 0.100076}

и с моим кодом и с Mathematica и результаты совпадают.

А вот в предыдущей ссылке автовекторы, сообщаемые от LAPACK, совсем другие.

 Eigenvalues
    -0.4548  0.1001
 Selected eigenvectors
          1       2
 1   0.3080  0.4469
 2   0.5329  0.0371
 3  -0.3496 -0.0505
 4  -0.6211 -0.4743

Кому я должен доверять?

P.S. Я также проверил правильность моих автоматических значений/автовекторов, поскольку они дают A*x-lambda*B*x=0, а значения из LAPACK — нет.


person Open the way    schedule 12.03.2012    source источник


Ответы (3)


Похоже, что DSGPVX решает A*lambda = B*x*lambda; Matlab дает решение DSGPVX для вашей проблемы, используя «eig», хотя документация Matlab верна. Я предполагаю, что это ошибка в документации DSGPVX.

>> a=[0.24 0.39 0.42 -0.16;0.39 -0.11 0.79 0.63;0.42 0.79 -0.25 0.48;-0.16 0.63 0.48 -0.03];
>> b=[4.16 -3.12 0.56 -0.1;-3.12 5.03 -0.83 1.09;0.56 -0.83 0.76 0.34;-0.1 1.09 0.34 1.18];
>> [v,d]=eig(a,b)

v =

   -0.0690    0.3080   -0.4469   -0.5528
   -0.5740    0.5329   -0.0371   -0.6766
   -1.5428   -0.3496    0.0505   -0.9276
    1.4004   -0.6211    0.4743    0.2510


d =

   -2.2254         0         0         0
         0   -0.4548         0         0
         0         0    0.1001         0
         0         0         0    1.1270

>> norm(a*v-b*v*d)

ans =

   1.5001e-15
person Rory Yorke    schedule 12.03.2012

Я не знаю, почему вы думаете, что LAPACK дает неправильные ответы, мне они кажутся нормальными. Используя четыре десятичных знака, которые вы цитируете, я получаю остатки (r = A * x - lambda * B * x), такие что

норма(r1) = 1,5921e-04, норма(r2) = 6,0842e-05.

Поскольку норма (А) = 1,2994 и норма (В) = 7,9874, эти остатки кажутся очень удовлетворительными.

Собственные векторы, созданные DSPGVX, нормированы так, что

норма(х'*В*х) = 1.

person Sven Hammarling    schedule 13.03.2012
comment
Я получаю остатки как 1e-15 с моими результатами. Если их нормализация, они должны просто заметить это. - person Open the way; 13.03.2012
comment
спасибо за Ваш ответ. Моя главная забота; так как мое решение дает небольшой осадок, почему ваше нет, так как это тот, о котором сообщается на веб-сайте. В противном случае я предполагаю, что могу принять любой из них как хороший, вы согласны? - person Open the way; 14.03.2012

Похоже, что результаты Лапака на самом деле соответствуют двум последним собственным значениям, сгенерированным вашим кодом и Mathematica, хотя младшие биты получаются совершенно разными. Соответствующие векторы довольно близки, просто масштабируются по-разному.

Ясно, что если ваши значения/значения Mathematica проверяются, а значения Лапака нет, вы должны доверять тому, который дает правильные ответы. Возможно, было бы полезно выяснить, в чем заключается ваша проблема и алгоритмы Лапака, которые заставляют ее давать очень неточные ответы.

person Phil Miller    schedule 12.03.2012