В начале я хотел бы извиниться за мой английский. Теперь перейдем к моей проблеме.
Я пытаюсь написать простой код, который найдет решение системы линейных уравнений:
Ax = b
где A — квадратная матрица nxn. В этой программе я использую библиотеку Lapack (я ДОЛЖЕН использовать LU-факторизацию БЕЗ поворота).
Я нашел несколько примеров, е. г.:
Понимание вызовов LAPACK в C ++ на простом примере
где мы можем увидеть, как использовать функции: dgetrf_ и dgetrs_. Но даже если я скопирую этот код (из лучшего ответа) в свою программу, он иногда возвращает правильные результаты (например, A и b такие же, как в лучшем ответе), а иногда неправильные результаты (например, A = {1, -3, 1, -1}, b = {3, 5}, правильный ответ: {6, 1} и возврат функции {-4, 7}). Для больших матриц это возвращает неправильные результаты. Кто-нибудь может сказать почему?
На этом сайте: https://software.intel.com/sites/products/documentation/doclib/mkl_sa/11/mkl_lapack_examples/lapackro1.htm написано:
Подпрограммы LAPACK предполагают, что входные матрицы не содержат специальных значений IEEE 754, таких как INF или NaN. Использование этих специальных значений может привести к тому, что LAPACK вернет неожиданные результаты или станет нестабильным.
Я думаю, что INF означает «бесконечность», а NaN означает «не число», верно?
И вторая проблема заключается в том, что, если даже приведенный выше пример будет работать правильно, он использует LU-факторизацию С частичным поворотом. Мне нужны функции из библиотеки Lapack, которые выполняют LU-факторизацию БЕЗ поворота. Я исследовал эту функцию, но ничего не нашел. Есть ли кто-нибудь, кто знает, что это (или может быть) эта (эти) функция (функции)? Я теряю надежду на решение этой проблемы.
Подпрограммы LAPACK написаны на Фортране, а данные хранятся в главном столбце. Вы решаете транспонированную матричную систему A^T x = b
, Попробуйте использовать A = {1, 1, -3, -1}
,
Вы правы, INF означает «бесконечность», а NaN означает «Не число».
Алгоритм LU всегда использует поворот. Декомпозиция Холецкого не использует поворот (dpotrf, dpotrs). Но тогда ваша матрица должна быть «симметричной положительно определенной».