Поиск:

Ответ в темуСоздание новой темы Создание опроса
> решение больших разреженых систем уравнений, эффективный метод 
:(
    Опции темы
maxchv
Дата 17.4.2006, 08:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 10.2.2006

Репутация: нет
Всего: нет



Какие более эффективные методы решения больших систем (например 10000x10000 и более) численные (Зейделя) или точные (Гаусса, Холецкого) с точки зрения времени счета, занимаемой машинной памяти и точности в конечном счете?  
PM MAIL   Вверх
nostromo
Дата 17.4.2006, 14:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 194
Регистрация: 23.3.2006

Репутация: 5
Всего: 10



Кажется, эти вопросы в свое время подробно обсуждались при разработке фортрановских библиотек (linpack).  

Это сообщение отредактировал(а) nostromo - 17.4.2006, 14:35
--------------------
На пыльных тропинках далеких планет останутся наши следы.
PM MAIL   Вверх
maxim1000
Дата 17.4.2006, 15:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: 33
Всего: 110



про Холецкого ничего не скажу - не знаю
но если смотреть Гаусса, то брать его не стоит - в процессе решения очень многие коэффициенты матрицы могут стать ненулевыми
а вот какие-нибудь итеративные методы подойдут
они даже не требуют знания коэффициентов матрицы - просто какую-нибудь функцию, которая действует на вектор... 


--------------------
qqq
PM WWW   Вверх
esperant0
Дата 17.4.2006, 16:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 714
Регистрация: 20.5.2005

Репутация: 4
Всего: 14



для разных видов разреженных систем есть разные способы решения 


--------------------
 
 Student->Teacher Assistant ->Research assistant->Microsoft Software Development Engineer 

Пользователь получил наказание за то, что проигнорировал замечание которое было написано модератором  а затем стерто и которое он - пользователь не мог видеть. 
PM MAIL   Вверх
Cr@$h
Дата 19.4.2006, 15:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Исследователь
***


Профиль
Группа: Участник Клуба
Сообщений: 1693
Регистрация: 3.4.2005
Где: Санкт-Петербург, Россия

Репутация: 4
Всего: 41



Цитата(maxim1000 @  17.4.2006,  16:53 Найти цитируемый пост)
но если смотреть Гаусса, то брать его не стоит - в процессе решения очень многие коэффициенты матрицы могут стать ненулевыми

Вырождение, в смысле, -- оно решается путем выбора ведущего элемента по строкам и по столбцам.
Цитата(maxim1000 @  17.4.2006,  16:53 Найти цитируемый пост)
они даже не требуют знания коэффициентов матрицы - просто какую-нибудь функцию, которая действует на вектор... 

 smile  smile 
Цитата(maxchv @  17.4.2006,  09:29 Найти цитируемый пост)
Какие более эффективные методы решения больших систем (например 10000x10000 и более) численные (Зейделя) или точные (Гаусса, Холецкого) с точки зрения времени счета, занимаемой машинной памяти и точности в конечном счете?   

Немного прокоменчу. Все методы численные и все неточные на машине ввиду округлений. Здесь методы делят на прямые и итерационные. Прямые обычно больше учитывают структуру матрицы, но требуют обычно и больше памяти. Например, Гаусса потребует места для хранения всей матрицы. Итерационные более универсальные, но стрктуру матрицы учитывают в меньшей степени. Не портят разреженный вид матрицы, решение получается итерационным способом. Наконец, в "последнее" время все большую популярность получают неявные прямые методы, или "итерационно-прямые": действуют как итерационные, но на каждой итерации решается прямым методом какая-то более простая система.
Если размер матрицы большой, например, для указанной матрицы потребуется 763 Мб, то следует использоватьь итерационные методы, которые потребую хранения только ненулевых элементов и не нарушат структуру матрицы. Все еще зависит от того, откуда произрастает матрица -- очень часто из уравнений мат физики, a la дифуры в частных производных. Для некоторых их видов, например, матрица будет иметь специальный вид и решаться эффективно одним из прямых методов, учитывающих эту структуру.
Для симметричных систем советую использовать метод сопряженных градиентов или т.н. чебышевский, но последний нужно будет подкручивать. Для несимметричных такой вопрос еще не решен, но можно попробовать аналог МСГ -- биортогональный алгоритм. Правда он сходится довольно таки странно.
Во всех итерационных случаях рекомендуется использовать предобуславливание. К сожалению, нормальных книг, где это было бы "популярно" расписано я не встречал. 
PM MAIL ICQ   Вверх
maxim1000
Дата 19.4.2006, 17:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: 33
Всего: 110



Цитата(Cr@$h @  19.4.2006,  14:52 Найти цитируемый пост)
Вырождение, в смысле, -- оно решается путем выбора ведущего элемента по строкам и по столбцам

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

Цитата(Cr@$h @  19.4.2006,  14:52 Найти цитируемый пост)
они даже не требуют знания коэффициентов матрицы - просто какую-нибудь функцию, которая действует на вектор... 

матрица - один из способов записи линейного отображения - когда f(x+y)=f(x)+f(y) и f(a*x)=a*f(x) для векторных пространств
и если Гаусс манипулирует коэффициентами матрицы, то для некоторых других методов достаточно, чтоб им дали указатель на функцию, которая берет вектор x и возвращает Ax, а как она их вычисляет, для метода абсолютно все равно

можно представить себе такую задачу: у нас есть матрица, которая при действии на вектор сдвигает все его компоненты на 1 вниз, а последний ставит наверх
задача сформулирована для размерности, скажем, тысяча
что нужно? решить Ax=b, как обычно
для использования Гаусса нужно записать матрицу полностью, что потребует миллиона ячеек
при том, любой программист напишет простенькую функцию, которая будет занимать сотню байт... 


--------------------
qqq
PM WWW   Вверх
Cr@$h
Дата 23.4.2006, 13:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Исследователь
***


Профиль
Группа: Участник Клуба
Сообщений: 1693
Регистрация: 3.4.2005
Где: Санкт-Петербург, Россия

Репутация: 4
Всего: 41



Цитата(maxim1000 @  19.4.2006,  18:01 Найти цитируемый пост)
предположим, в матрице очень мало ненулевых элементов (неважно, где они находятся), так вот в процессе решения Гауссом количество ненулевых элементов может сильно увеличиться
в конце-то оно будет небольшим - только на диагонали, а вот где-нибудь в середине может получиться матрица с кучей ненулевых элементов
с точки зрения корректности никаких проблем 

Это все понятно. Только "в конце-то оно будет небольшим" -- на самом деле такой халявы не будет. Решая разреженную систему методом Гаусса, мы нарушим ее разреженный вид раз и навсегда и в конце получим примерно полностью заполненную треугольную матрицу. Собственно, поэтому и нерекомендуется (если вообще возможно) применять для больших разреженных систем прямые методы.

Цитата(maxim1000 @  19.4.2006,  18:01 Найти цитируемый пост)
для некоторых других методов достаточно, чтоб им дали указатель на функцию, которая берет вектор x и возвращает Ax, а как она их вычисляет, для метода абсолютно все равно

Для любого метода -- "все равно", он просто содержит это действие внутри себя да и не имеет право заставлять делать это как-то по-особенному. Итерационные методы используют практически только операции с векторами и умножение матрицы на вектор, а не, например, умножение матриц, которое увеличит число ненулевых элементов в результате такого умножения.
А как это уже реализовывать -- дело техники: через функции, подпрограммы, операции и прочее. 
PM MAIL ICQ   Вверх
maxim1000
Дата 24.4.2006, 03:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: 33
Всего: 110



Цитата(Cr@$h @  23.4.2006,  12:30 Найти цитируемый пост)
Это все понятно. Только "в конце-то оно будет небольшим" -- на самом деле такой халявы не будет. Решая разреженную систему методом Гаусса, мы нарушим ее разреженный вид раз и навсегда и в конце получим примерно полностью заполненную треугольную матрицу

ну есть же обратный ход (а иногда это делают и сразу) - когда обнуляется вторая треугольная часть и остаются только диагональные элементы, так что матрица получится, возможно, даже более разреженной, чем в начале, но никак не менее...
Цитата(Cr@$h @  23.4.2006,  12:30 Найти цитируемый пост)
Для любого метода -- "все равно", он просто содержит это действие внутри себя да и не имеет право заставлять делать это как-то по-особенному.

В принципе, конечно, можно, имея функцию f(x)=Ax получить все ее коэффициенты, но Гаусс использует кучу таких коэффициентов, которые надо хранить в памяти, а итерационные методы - вычисляют иногда всего один раз, и памяти для хранения этого результата (вектора) надо порядка N, а не N^2, как в Гауссе... 


--------------------
qqq
PM WWW   Вверх
Cr@$h
Дата 24.4.2006, 13:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Исследователь
***


Профиль
Группа: Участник Клуба
Сообщений: 1693
Регистрация: 3.4.2005
Где: Санкт-Петербург, Россия

Репутация: 4
Всего: 41



Цитата(maxim1000 @  24.4.2006,  04:26 Найти цитируемый пост)
ну есть же обратный ход (а иногда это делают и сразу) - когда обнуляется вторая треугольная часть и остаются только диагональные элементы, так что матрица получится, возможно, даже более разреженной, чем в начале, но никак не менее...

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

Цитата(maxim1000 @  24.4.2006,  04:26 Найти цитируемый пост)
можно, имея функцию f(x)=Ax получить все ее коэффициенты, но Гаусс использует кучу таких коэффициентов, которые надо хранить в памяти, а итерационные методы - вычисляют иногда всего один раз

Часто по многу, но зато не заполняют нулевые элементы, в этом их основное преимущество для разряженных систем. 
PM MAIL ICQ   Вверх
Vitaly333
Дата 23.1.2008, 02:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 220
Регистрация: 6.11.2006
Где: Volgograd

Репутация: нет
Всего: 2



Цитата

Собственно, поэтому и нерекомендуется (если вообще возможно) применять для больших разреженных систем прямые методы.

Ещё как возможно .... просто нужно перед тем как делать треуголное численное разложение нужно найти хорошую перестановку P. Для этого существует специальный класс алгоритмов которые ищат приемлемые по качеству перестановки исходя из графа матрицы или из самой матрицы.
После того ка перестановка найдена .. делаеться след. замена:

C = P*A*PT и   вектор D = b*P

А потом уже решаеться система:

C*X = D

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

Что касаеться итерационных алгоритмов то одни из самых быстрых - это итерационные алгоритмы крыловского подпространства!
Но у них есть один большой минус - плохая сходимость на больших и плохообусловленных  задачах! Для улучшения сходимости также существует  специальный класс алгоритмов -  называемых предобуславливателями. В качестве предобуславливателя часто берут Неподные факторизации Холецкого (для симметричных) и LU (не симметричных) систем. Поэтому как кто -то выше и писал они и получаються итерационно - прямыми. 
 

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Алгоритмы"

maxim1000

Форум "Алгоритмы" предназначен для обсуждения вопросов, связанных только с алгоритмами и структурами данных, без привязки к конкретному языку программирования и/или программному продукту.


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, maxim1000.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Алгоритмы | Следующая тема »


 




[ Время генерации скрипта: 0.1001 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.