Цитата:
У Вас ранее было написано, что под корнем отрицательные значения появляются. Я проверил, у меня их нет.
Я тоже немного напутал..
под корнем отрицательные значения появляются это при разложении IC_Decomposition (мой) . А при разложении IC_Decomposition2 в самом конце появляются нули.
Посмотрел ваш файл AN2_mod3000 действительно разложил!!!
И нулей в конце нет.... странно у меня совсем другое разложение получается. Вы точно использовали мой IC_Decomposition2?А ваш ITL -овский дает тоже самое?
Цитата:
typedef matrix<Type, symmetric<lower>, array< compressed<> >, column_major>::type Matrix;
Значит храните нижний треугольник по столбцам. Я храню верхний треугольник по строкам. Это получается одно и тоже.. Значит хранение у нас организовано одинаково
.
Попробовал использовать ваш разложенный AN_mod3000 в качестве предобуславливателя, но cg выдал вектор неизвестных весь NAN после 1073 итерации. Решил разобраться из-за чего, оказывается при нахождении скалярного произведения в CG производиться умножение примерно таких огромных чисел:
Код:
-2.574249076548091E299 * 1.9501677570630539E304
после котого результат такого произведения естественно не влезает в формат double и записывает infinity. А потом ещё в CG при нахождении alfa происходит деление double/infinity = NAN. Вот, откуда и появляется вектор, где все элементы его NAN. И поэтому и у вас наверно и не сходится. Только тут вопрос откуда взялись такие огромные числа?
Цитата:
Может попробывать перенумерацию узлов сделать.
Где то яслышал что пед тем как применять алгоритм Неполного Холецкого нужно предварительно сделать перестановку строк , чтобы максимально сократить появление новых ненулевых элементов в процессе факторизации в тех местах где раньше стояли нули в исходной матрице до факоризации. Один из самых лучших таких алгоритмов это Minimal Degree (Алгоритм минимальной степени). Но если это делать то это уже получается не итерационное решение а прямое, потому что при применении такого алгоритма Неполное разложение будет максимально приближено к полному, а в некоторых случаях будет полным. И как вы ранее говорили
Цитата:
это значит, что всю работу делает разложение, а не решатель.
На то он и итерационный, чтоб решать за несколько итераций
Тем более в этом примере мне кажется что и даже перенумерация не поможет так как расчетная схема - это арка. Узел 1 связан с узлом 2 - конечным элементом 1 ; Узел 2 связан с узлом 3 -конечным элементом 2 ........ Узел 999 связан с узлом 1000 - конечным элементом 999. Тут как узлы не перенумеровывай всё равно получается 6 ненулевых в строке. Хотя я могу ошибаться.
Кроме того я читал в одном
форуме что в переобуславливателе заполнение нужно контролировать порогами.Т.е ненулевые элементы динамически отбрасываются по порогу и при факторизации должна постоянно поддерживаться положительно определенность(алгоритм Азиза Дженнингса). Но ничего по этому в инэте не нашел. Может вы что - то знаете по этому поводу?
Кроме того есть ещё какая-то модернизация неполного разложения Холецкого со сдвигом (со Shift - ом , так её называют). Но тоже поиски в инэте были без результатны