Мне нужно решить двумерное уравнение Пуассона, то есть систему уравнений для AX=B, где A — матрица n на n, а B — вектор n на 1. Будучи матрицей дискретизации для двумерной задачи Пуассона, я знаю, что только 5 диагоналей не будут нулевыми. Lapack не предоставляет функций для решения этой конкретной задачи, но имеет функции для решения системы уравнений с ленточной матрицей, а именно DGBTRF (для факторизации LU) и DGBTRS. Теперь 5 диагоналей: главная диагональ, первые диагонали выше и ниже главной и две диагонали выше и ниже на m диагоналей относительно главной диагонали. Прочитав документацию lapack о хранении диапазонов, я узнал, что мне нужно создать матрицу (3 * m + 1) на n для хранения A в формате хранения диапазонов, назовем эту матрицу AB. Теперь вопросы:
1) в чем разница между dgbtrs и dgbtrs_? Intel MKL предоставляет оба, но я не могу понять, почему
2) dgbtrf требует, чтобы матрица хранения полос была массивом. Должен ли я линеаризовать AB по строкам или по столбцам?
3) это правильный способ вызова двух функций?
int n, m;
double *AB;
/*... fill n, m, AB, with appropriate numbers */
int *pivots;
int nrows = 3 * m + 1, info, rhs = 1;
dgbtrf_(&n, &n, &m, &m, AB, &nrows, pivots, &info);
char trans = 'N';
dgbtrs_(&trans, &n, &m, &m, &rhs, AB, &nrows, pivots, B, &n, &info);