2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки


Правила форума


Посмотреть правила форума



Начать новую тему Ответить на тему На страницу 1, 2  След.
 
 Собственный вектор становится не собственным.
Сообщение15.02.2016, 19:22 


16/10/12
15
Здравствуйте.
Не смог найти более подходящий раздел. Возникла такая проблема
Возьмем нормированный собственный вектор, подействуем на него своей матрицей (размерность матрицы порядка 100 на 100). Получившийся вектор нормируем снова. Получиться должен тот же самый собственный вектор.
Но если мы на компьютере повторим эту операцию хотя бы 10 раз, то получится совершенно другой вектор. Происходит это из за машинной ошибки.
Вопрос: как от этого избавиться? Может есть какие то численные методы, которые не накапливают эту ошибку?

Конкретно у меня матрица трехдиагональная и имеет большие элементы ближе к краям относительно элементов, которые находятся в центре.

 Профиль  
                  
 
 Re: Собственный вектор становится не собственным.
Сообщение15.02.2016, 19:40 
Заслуженный участник
Аватара пользователя


01/03/06
13626
Москва
agent150 в сообщении #1099656 писал(а):
Возьмем нормированный собственный вектор, подействуем на него своей матрицей (размерность матрицы порядка 100 на 100). Получившийся вектор нормируем снова. Получиться должен тот же самый собственный вектор.

Не обязательно. Например, если собственное значение было отрицательным или нулевым, то новый вектор нормировкой в исходный не превратить.

 Профиль  
                  
 
 Re: Собственный вектор становится не собственным.
Сообщение15.02.2016, 19:56 


16/10/12
15
Brukvalub
Да, согласен. В моём случае все собственные значения больше нуля.

 Профиль  
                  
 
 Re: Собственный вектор становится не собственным.
Сообщение15.02.2016, 20:15 
Заслуженный участник


10/01/16
2318
agent150
Для отыскания собственного вектора, соответствующего данному собственному значению (которое мы реально нашли, решая некую систему уравнений - т.е., приближенно), мы решаем здоровенную систему линейных уравнений, так что, конечно, найденный собственный вектор будет собственным лишь "приближенно". Прогоняя его по вашей процедуре, мы получим, вообше говоря, еще более худшее приближение, при многократной процедуре - совсем плохое.
agent150 в сообщении #1099656 писал(а):
Вопрос: как от этого избавиться?

Т.е., у вас есть метод, который портит решения. А вы не хотите их портить . Как этого добиться?
Ответ: не применять этот метод.
Но если все-таки надо применять, то сделайте так: сосчитайте все, как считали. А потом выбросьте это на фиг, и замените исходным вектором. :D
Другое дело если вы хототе найти с.в-р поточнее. Вообще, метод прогонки обычно дает приемлемую точность. Может, имеет смысл его как то модифицировать под вашу специфическую матрицу (в порядке бреда - разорвать по середине, и устроить "прогонку к краям"?)
И еще: для сжимающего оператора Ваша процедура, вообще говоря, действительно должна бы давать улучшение решения. Но: "большие числа" - говорит о том, что сжимаемости нет....

 Профиль  
                  
 
 Re: Собственный вектор становится не собственным.
Сообщение15.02.2016, 20:37 


16/10/12
15
DeBill
Спасибо за ответ.
Задачу я решаю, конечно не такую. Просто результат получается не правильный и нашел ошибку свою в этом, поэтому заменить ответ собственным вектором-конечно не выход.
На счет разрыва матрицы-получившийся вектор ( после многократного действия на него матрицы и нормировки) неадекватно возрастает в элементах, в которых сама матрица большая. Если при исходной матрице возрастают элементы, соответствующие маленьким и большим порядковым номерам (т.к. сами элементы матрицы большие, соответствующие маленьким и большим порядковым номерам). То если мы разорвем матрицы на две, то так же у векторов, за счет ошибки будут увеличиваться те элементы, порядковые номера которых соответствуют большим элементам в матрицах. Или я что то не так понял?

И, как мне кажется, изначально я нахожу собственный вектор с очень хорошей точностью. И ошибка накапливается именно в момент действия оператора на вектор.

 Профиль  
                  
 
 Re: Собственный вектор становится не собственным.
Сообщение15.02.2016, 20:47 
Заслуженный участник


27/04/09
28128

(Оффтоп)

Ещё можно по деталям: сама нормировка (или вычисление любой другой суммы кучи чисел) может портить дело, если в ней складываются попеременно числа, отличающиеся на многие порядки (с разностью порядков больше числа разрядов мантиссы). В таком случае первым улучшением будет складывать числа от меньших к бо́льшим (а есть метод ещё лучше).

Плюс, если, например (не знаю, есть ли у этого use cases), какие-то векторы представляются в виде линейной комбинации некоторых собственных и остатка, можно завести для них отдельную структуру данных, хранящую коэффициенты этой комбинации и остаток, и тогда, когда надо действовать на такие векторы соответствующим оператором, действовать им только на остаток, а коэффициенты умножать на собственные числа и всё.

 Профиль  
                  
 
 Re: Собственный вектор становится не собственным.
Сообщение15.02.2016, 21:18 
Заслуженный участник


03/01/09
1711
москва
agent150, а вы действуете на вектор, соответствующий наименьшему собственному значению, или это может быть любой собственный вектор?

 Профиль  
                  
 
 Re: Собственный вектор становится не собственным.
Сообщение15.02.2016, 21:46 
Заслуженный участник


11/05/08
32166
Вдогонку предыдущему оратору:

agent150 в сообщении #1099656 писал(а):
Возьмем нормированный собственный вектор, подействуем на него своей матрицей (размерность матрицы порядка 100 на 100).

А с какой целью подействуем-то?...

 Профиль  
                  
 
 Re: Собственный вектор становится не собственным.
Сообщение15.02.2016, 22:06 


16/10/12
15
mihiv
Хмм, сейчас проверил. Есть такая зависимость, чем меньше собственное значение, тем быстрее накапливается ошибка.

ewert

Я решаю вообще другую задачу. Просто поразбиравшись, понял, что ошибка накапливается именно тут. Поэтому решил написать только суть проблемы, т.к. всю свою задачу вываливать было бы не логично.

arseniiv
Идея хорошая. Вот только действовать на линейную комбинацию приходится не в точности собственной матрицей этих векторов, а матрицей слабо отличающейся от неё.

 Профиль  
                  
 
 Re: Собственный вектор становится не собственным.
Сообщение15.02.2016, 23:02 
Заслуженный участник


03/01/09
1711
москва
agent150 в сообщении #1099716 писал(а):
Есть такая зависимость, чем меньше собственное значение, тем быстрее накапливается ошибка.

Это вполне понятно. Пусть $\vec a_i$- собственные векторы, а $\lambda _i$- соответствующие собственные значения $0<\lambda _1<\dots <\lambda _n$. Предположим, мы хотим подействовать оператором $A$ на вектор $\vec a_1$. Из-за погрешности это будет на самом деле вектор $\vec q=c_1\vec a_1+\sum \limits _{i=2}^nc_i\vec a_i$(разложение $\vec q$ по собственным векторам), где $c_1$ много больше $c_i, i=2,\dots,n$. Действуя $N$ раз оператором $A$ на $\vec q$, получим: $$A^N\vec q=\lambda _1^Nc_1\vec a_1+\dots +\lambda ^N_nc_n\vec a_n$$Мы видим, что в сумме при большом $N$ преобладает вклад собственного вектора с максимальным собственным значением $\lambda _n$.

 Профиль  
                  
 
 Re: Собственный вектор становится не собственным.
Сообщение15.02.2016, 23:03 
Заслуженный участник


27/04/09
28128
agent150 в сообщении #1099716 писал(а):
Вот только действовать на линейную комбинацию приходится не в точности собственной матрицей этих векторов, а матрицей слабо отличающейся от неё.
Тогда можно подействовать первой, а потом подействовать разностью матриц на результат уже в обычном представлении, хотя не имею понятия, можно ли это обставить так, чтобы ошибка получалась меньше.

 Профиль  
                  
 
 Re: Собственный вектор становится не собственным.
Сообщение15.02.2016, 23:23 
Заслуженный участник


11/05/08
32166
agent150 в сообщении #1099716 писал(а):
Я решаю вообще другую задачу.

Да какую угодно решайте. Но сперва всё-таки разберитесь: а с какой целью Вы все эти манипуляции производите?...

Пока что от Вас этого ни разу не поступало. Пока что всё выглядит с Вашей стороны примерно так: вот модно итерировать; ну а дай-ка и я тоже поитерирую!

 Профиль  
                  
 
 Re: Собственный вектор становится не собственным.
Сообщение16.02.2016, 10:16 
Заслуженный участник
Аватара пользователя


11/03/08
10004
Москва
Это вполне себе работающий метод отыскания собственных векторов. Метод прямых итераций. Причём начинать можно вообще с произвольного вектора. Вот только работает этот метод лишь для отыскания вектора, соответствующего наибольшему собственному значению. Поскольку вектор начального приближения (а на следующих итерациях вектор ошибки) можно разложить по собственным векторам, и после умножения коэффициенты разложения вновь полученного вектора будут равны прежним, домноженным на собственные значения соответствующие этим векторам (равны с точность до общего множителя, ввиду нормировки). То есть с каждой итерацией коэффициент при с.в., соответствующем максимальному собственному значению, будет расти, а остальные убывать, пока у нас не останется только "старший с.в.". Если в качестве начального приближения взять какой-то иной с.в., то неизбежная ошибка вычислений, даже если с.в. точно вычислен, даст уклонение в сторону "старшего с.в.", и рано или поздно сойдётся к нему.
Небольшой доработкой можно отыскивать и с.в., соответствующий минимальному с.з., для этого вместо матрицы $A$ надо взять матрицу $B=(kI-A)$, где $k\ge\max(\lambda_i)$, для которой бывшее минимальное с.з. станет максимальным.
Для всех прочих собственных значений техника сложнее, используются обратные итерации с $C=(A-\lambda I)^{-1}$, где $\lambda$ - собственное значение, для которого ищется вектор (явно обращать матрицу не обязательно, просто решать систему уравнений).

 Профиль  
                  
 
 Re: Собственный вектор становится не собственным.
Сообщение16.02.2016, 12:28 
Заслуженный участник


11/05/08
32166
Евгений Машеров в сообщении #1099809 писал(а):
Это вполне себе работающий метод отыскания собственных векторов. Метод прямых итераций. Причём начинать можно вообще с произвольного вектора. Вот только работает этот метод лишь для отыскания вектора, соответствующего наибольшему собственному значению.

Да и то не всегда. Но не в этом проблема. А в том, что вопрос был поставлен изначально бессмысленно.

Вопрос был поставлен так: дескать, мне захотелось чего-то зачем-то поитерировать. Зачем -- я и сам не знаю, но вот захотелось. И чего-то там не выходит. Как жыть?

 Профиль  
                  
 
 Re: Собственный вектор становится не собственным.
Сообщение18.02.2016, 21:46 
Заслуженный участник
Аватара пользователя


11/03/08
10004
Москва
Ну, может, я был неправ, не дождавшись подробного объяснения от ТС - зачем он это делает и как именно. Просто подумал, в какой ситуации я стал бы так делать (скажем, не сейчас, а когда знаний было меньше, а энтузиазма больше), и представил так - надо отыскать собственные вектора, есть для них приближения, и если $Av=\lambda v$, то взять начальное приближение и итерировать "до полного удовлетворения". И, попробовав, обнаружил бы, что не вытанцовывается, и спросил бы совета, не задумавшись, что окружающие о моих проблемах не информированы...
Вот я и попытался объяснить в этой гипотетической ситуации "самому себе, только давно".

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 16 ]  На страницу 1, 2  След.

Модераторы: Модераторы Математики, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group