Собственные значения с использованием eig - PullRequest
0 голосов
/ 13 октября 2018

У меня есть простая матрица 2x2:

A = [-2.0883*10^7 , 1.3975*10^7 ; 1.3975*10^7 , -9.3514*10^6]

с помощью eig (A) я получил следующие собственные значения:

(-3.0235*10^7, -9.3132*10^-10)

Однако, используя некоторые другие калькуляторы в ИнтернетеЯ получаю этот ответ:

(-3.0235*10^7 , 507.32)

Что мне делать в Matlab, чтобы получить собственные значения, как во втором результате?

Пример результата:

enter image description here

Спасибо.

1 Ответ

0 голосов
/ 13 октября 2018

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

В вашем случае вы должнычто-то неправильно прочитано:

>> A = [-2.0883*10^7 , 1.3975*10^7 ; 1.3975*10^7 , -9.3514*10^6];
>> eigvals = eig(A);
>> eigvals(1)

ans =

  -3.0235e+07

>> eigvals(2)

ans =

  507.3209

То есть второй набор собственных значений верен.


По поводу вашего обновления:

Для матриц 2x2 собственные значения могут легкорассчитываться на бумаге.Два собственных значения окажутся

e1 = trace(A)/2 + sqrt(trace(A)^2/4 - det(A))
e2 = trace(A)/2 - sqrt(trace(A)^2/4 - det(A))

, если вы решите характеристический полином второй степени.Для ваших точных чисел:

>> tr = A(1,1) + A(2,2); % computed by hand to avoid magic
>> d = A(1,1)*A(2,2) - A(1,2)*A(2,1); % same
>> tr/2 + sqrt(tr^2/4 - d)

ans =

  507.3209

>> tr/2 - sqrt(tr^2/4 - d)

ans =

  -3.0235e+07

Однако ваш обновленный код показывает, что ваш ввод не совсем соответствует вашему примеру;Ваш истинный вклад получен из более ранних вычислений, а A выше - только усеченная версия чисел с плавающей точкой в ​​матрице.Теперь посмотрим на два термина, фигурирующих в собственных значениях:

>> format long
>> tr/2            

ans =

   -15117200

>> sqrt(tr^2/4 - d)

ans =

     1.511770732088699e+07

Как видите, один термин равен -15117200 (точный), другой - 15117707.32088699 (приблизительный; исходит от квадратного корня).Теперь эти числа огромны по величине и почти одинаковы (кроме знака).Это означает, что их сумма будет аннулирована, и это аннулирование будет очень чувствительным к конкретным значениям переменных.

Другими словами, ваш конкретный G2{1} содержит значения, такие, что два вышеуказанных термина отменяют почти точно , из-за некоторой базовой симметрии.Поверьте, что говорит вам MATLAB, ваши собственные значения в порядке.Но когда вы скопировали усеченную версию матрицы в отдельное вычисление собственных значений (как я это делал выше), вы получили неверный результат из-за того, что отмена была только частичной.


Вы дали более конкретные значениявашей матрицы в комментарии:

>> B = [-2.088317534729117e+07, 1.397451196178947e+07 ; 1.397451196178947e+07 , -9.351402807405353e+06];
>> tr = trace(B);         
>> d = det(B);
>> tr/2

ans =

    -1.511728907734826e+07

>> sqrt(tr^2/4 - d)

ans =

     1.511728907734826e+07

Тайна раскрыта.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...