我试图搜索与此主题相关的类似线程,但似乎没有人关心带状系统(...)
我有兴趣使用C代码中的LAPACK / ScaLAPACK来解决带状矩阵。首先,在尝试使用ScaLAPACK之前,我希望使用LAPACK实现顺序解决方案。
问题:两种语言之间的行主要/列主要差异似乎正在影响我的解决方案流程。这是我打算解决的系统:
以下代码将该矩阵转换为here中指定的LAPACK带状数据结构。
int rr = 6; // Rank.
int kl = 2; // Number of lower diagonals.
int ku = 1; // Number of upper diagonals.
int nrhs = 1; // Number of RHS.
double vals[36] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, // Req. ex. space.
0.0, 0.0, 0.0, 0.0, 0.0, 0.0, // Req. ex. space.
666.0, 0.0, 0.0, 0.0, 0.0, 22.5, // First up diag.
1.0, -50.0, -50.0, -50.0, -50.0, -2.6, // Main diagonal.
27.5, 27.5, 27.5, 27.5, 4.0, 666.0, // First low diag.
0.0, 0.0, 0.0, -1.0, 666.0, 666.0}; // 2nd low diag.
int lda = rr; // Leading dimension of the matrix.
int ipiv[6]; // Information on pivoting array.
double rhs[] = {1.0, 1.0, 1.0, 1.0, 1.0, 0.0}; // RHS.
int ldb = lda; // Leading dimension of the RHS.
int info = 0; // Evaluation variable for solution process.
int ii; // Iterator.
int jj; // Iterator.
dgbsv_(&rr, &kl, &ku, &nrhs, vals, &lda, ipiv, rhs, &ldb, &info);
printf("info = %d\n", info);
for (ii = 0; ii < ldb; ii++) {
printf("%f\n", rhs[ii]);
}
putchar('\n');
正如我所说,我担心我翻译矩阵的方式是不正确的,因为col-major性质以及Fortran的索引性质,因为我的解决方案产生了:
[ejspeiro@node01 lapack-ex02]$ make runs
`pwd`/blogs < blogs.in
info = 1
1.000000
1.000000
1.000000
1.000000
1.000000
0.000000
Fortran info = 1
的返回值意味着分解已完成,但U(1,1) = 0
的LU分解中A = LU
。
任何帮助都非常受欢迎。
先谢谢!
答案 0 :(得分:1)
正如您所注意到的,您的矩阵以行主格式输入。将它写在专业列中,我们可视化的行将对应于列:
double vals[36] = {0.0, 0.0, 0.0, 1.0, 27.5, 0.0,
0.0, 0.0, 0.0, -50.0, 27.5, 0.0,
0.0, 0.0, 22.5, -50.0, 27.5, 0.0,
0.0, 0.0, 22.5, -50.0, 27.5, -1.0,
0.0, 0.0, 22.5, -50.0, 4.0, 0.0,
0.0, 0.0, 22.5, -2.6, 0.0, 0.0};
答案 1 :(得分:0)
好的,我会回答这个问题,以便将其称为“已解决”。
这些文件代表正常运行的代码。如果有任何人遇到同样的问题,我可以使用它:使用C中的LAPACK 解决带状方程组。
如果有任何人在实施过程中有任何额外的建议,我将很乐意欢迎他们!
我的下一步是分发核心矩阵,以便用ScaLAPACK解决。
谢谢!