LAPACK не удается вычислить собственные векторы
-
12-12-2019 - |
Вопрос
Я написал некоторый код для решения общей задачи о собственных значениях, и теперь я сравниваю свои результаты с результатами ЛАПАКА 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
Кому я должен доверять?
ПОСТСКРИПТУМ.Я также проверил, что мои автоматические значения / автовекторы верны, поскольку они дают A*x-лямбда*B*x = 0, в то время как значения из LAPACK - нет.
Решение
Похоже, что DSGPVX решает A* лямбда = B *x*лямбда;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
Другие советы
Я не знаю, почему вы думаете, что ЛАПАК дает неправильные ответы, мне они кажутся правильными.Используя четырехзначные десятичные дроби, которые вы цитируете, я получаю остатки (r = A *x - лямбда* B*x) такие, что
норма (r1) = 1,5921e-04, норма(r2) = 6,0842e-05.
Поскольку норма (A) = 1,2994 и норма (B) = 7,9874, эти остатки кажутся очень удовлетворительными.
Собственные векторы, создаваемые DSPGVX, нормализуются таким образом, что
норма(x'*B*x) = 1.
Похоже, что результаты Lapack действительно соответствуют двум последним собственным значениям, сгенерированным вашим кодом и Mathematica, хотя биты младшего порядка получаются совершенно разными.Соответствующие векторы довольно близки, просто масштабируются по-разному.
Очевидно, что если значения вашего /Mathematica проверяются, а Lapack - нет, вам следует доверять тому, который выдает правильные ответы.Возможно, было бы полезно выяснить, что именно связано с вашей проблемой и алгоритмами Lapack, которые позволяют ей давать очень неточные ответы.