У меня есть код в сложной арифметике с двойной точностью, который формирует большие разреженные матрицы (благодаря PETSc) для решения задач, где обычно требуется высокая точность (результаты сходятся, скажем, до 7/8 цифр)
Полученная линейная система Ax=b решается с помощью параллельного LU-разложения. Я стремлюсь решать большие трехмерные задачи, чтобы главный размер матрицы мог достигать нескольких десятков миллионов.
Матрица содержит элементы, полученные в результате умножения весов метода конечных разностей на коэффициенты различных решаемых физических уравнений и метрические члены.
Если один элемент матрицы меньше по абсолютному значению, чем точность машины с двойной точностью, я отбрасываю его и обрезаю до нуля. Считаете ли вы такой подход разумным или, по крайней мере, бессмысленным? Одна из причин заключается в том, что мы хотим сохранить каждый возможный мегабайт памяти. Но что открыто для обсуждения, так это то,
«Очень маленькие» записи могут загрязнить процесс инверсии LU и сделать его нестабильным при увеличении заполнения.
Если в процессе используются элементы матрицы, близкие к машинной точности, я бы предположил, что результат любой арифметической операции с этими элементами можно считать «ненадежным»? Если да, то я не понимаю, почему они должны быть сохранены.
Я знаю, что машинная точность - это другое понятие, чем наименьшее представимое положительное число. Поэтому возможно, что мои рассуждения концептуально неверны, и я хотел бы получить ваше мнение или исправления. Спасибо!