Стратегии устранения проблем с числовой стабильностью?

Я пытаюсь написать реализацию алгоритма факторизации спектральной плотности Уилсона [1] для Python. Алгоритм итеративно разлагает матричную функцию [QxQ] на ее квадратный корень (это своего рода расширение искателя квадратного корня Ньютона-Рафсона для матриц спектральной плотности).

Проблема в том, что моя реализация сходится только для матриц размером 45x45 и меньше. Таким образом, после 20 итераций суммарная квадратичная разница между матрицами составляет около 2,45e-13. Однако, если я сделаю ввод размером 46x46, он не сходится до 100-й итерации или около того. Для размеров 47x47 и больше матрицы никогда не сходятся; ошибка колеблется между 100 и 1000 примерно на 100 итерациях, а затем начинает очень быстро расти.

Как бы вы попытались отладить что-то подобное? Кажется, нет какой-то конкретной точки, в которой он сходит с ума, и матрицы слишком велики, чтобы я мог попытаться выполнить расчет вручную. Есть ли у кого-нибудь советы/учебники/эвристика для поиска странных числовых ошибок, подобных этой?

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

Спасибо, - Дэн

[1] Г. Т. Уилсон. «Факторизация матричных спектральных плотностей». СИАМ Дж. Заявл. Математика (Том 23, № 4, декабрь 1972 г.)


person Dan    schedule 21.11.2009    source источник
comment
Что вы подразумеваете под сходится только для матриц размера 45x45? Матрицы меньше 45х45 тоже выходят из строя?   -  person badp    schedule 21.11.2009
comment
Нет, извините, отредактирую пост. Успешно сходится для размера 45x45 и меньше   -  person Dan    schedule 21.11.2009


Ответы (2)


Я бы рекомендовал задать этот вопрос в списке рассылки scipy-user, возможно, с пример вашего кода. Как правило, люди в списке, кажется, имеют большой опыт в численных вычислениях и действительно помогают, простое следование списку само по себе является образованием.

В противном случае, боюсь, у меня нет никаких идей... Если вы думаете, что это проблема числовой точности/округления с плавающей запятой, первое, что вы можете попробовать, это увеличить все dtypes до float128 и посмотреть, есть ли разница .

person robince    schedule 21.11.2009
comment
Да, я попробую оба варианта. Я не уверен, что это проблема числовой точности ... но размерность матрицы определенно не используется в качестве входных данных нигде в алгоритме ... и тот факт, что он работает для небольших матриц, предполагает, что вероятно да. - person Dan; 21.11.2009

интервальная арифметика может помочь, но я не уверен, что производительность быть достаточным, чтобы на самом деле разрешить значимую отладку при интересующих вас размерах матриц (вы должны учитывать замедление на пару порядков, что между заменой «скалярных» операций с плавающей запятой с высокой помощью HW на SW-тяжелый «интервал» единицы и добавление проверок того, какие интервалы становятся слишком широкими, когда, где и почему).

person Alex Martelli    schedule 21.11.2009
comment
Итак ... вы имеете в виду вставку матриц интервалов в SciPy? Я даже не уверен, что смогу сделать это, не переписывая linpack в интервальной математике, не так ли? - person Dan; 21.11.2009