我需要求解二維泊松方程,也就是說,對於AX = B的方程組,其中A是一個n×n矩陣,B是一個n×n的矩陣, 1矢量。作爲二維泊松問題的離散化矩陣,我知道只有5個對角線不會爲空。 Lapack不提供解決這個特定問題的函數,但它具有求解帶狀矩陣方程組的功能,即DGBTRF(用於LU分解)和DGBTRS。現在,5個對角線是:主對角線,主對角線上方和下方的第一個對角線,以及對角線上下兩對角線與主對角線對角線。在閱讀關於波段存儲的lapack文檔後,我瞭解到我必須創建一個(3 * m + 1)n矩陣來存儲帶內存儲格式,我們稱之爲矩陣AB。現在的問題:求解方程的帶狀矩陣系統
1)dgbtrs和dgbtrs_有什麼區別?英特爾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);
關於#2,是不是會搞亂LU分解?我的意思是,沒有選擇告訴dgbtrf AB是行主要的。另外,我如何設定兩種情況下的主要維度? – Patrik
是的,你會解決A'x = B。讓我糾正我的答案。對於主要維度,它們通常等於行數,除非您正在做一些有趣的事情(如將子矩陣作爲參數傳遞)。再一次,解決LAPACK問題的最好方法是嘗試手動解決小問題。 –