用dpotrs求解线性系统(Cholesky分解)

时间:2014-02-06 20:06:07

标签: c linear-algebra lapack

我正在尝试用clapack解决线性方程组。

我的代码如下:

//ATTENTION: matrix in column-major
double A[3*3]={  2.0, -1.0,  0.0,
                0.0,  2.0, -1.0,
                0.0,  0.0,  2.0},
b[3]={1.0,2.0,3.0};

integer n=3,info,nrhs=1; char uplo='L';

dpotrf_("L", &n, A, &n, &info);
dpotrs_("L", &n, &nrhs, A, &n, b, &n, &info);

printf("Solution: %10.4f %10.4f %10.4f",b[0], b[1], b[2]);

正如this question所述,有必要首先对矩阵进行分解。 dpotrf应该分解,dpotrs使用分解矩阵求解系统。

然而,我的结果

2.5   4.0   3.5

显然是错误的,我在这里查了with WolframAlpha

我的错误在哪里?

1 个答案:

答案 0 :(得分:2)

奇怪的是,2.5 4.0 3.5是rhs 1 2 3的解决方案...如果矩阵是

 2   -1  0
 -1  2   -1
 0   -1  2

dpotrfdpotrs是针对对称正定矩阵制作的......

我建议改用dgetrfdgetrs。在你的情况下:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <lapacke.h>

int main()
{
    //ATTENTION: matrix in column-major
    double A[3*3]={  2.0, -1.0,  0.0,
            0,  2.0, -1.0,
            0.0,  0,  2.0},
            b[3]={1.0,2,3.0};

    int n=3,info,nrhs=1; char uplo='L';
    int ipvs[3];
    dgetrf_(&n, &n, A, &n,ipvs, &info);
    printf("info %d\n",info);
    dgetrs_("T", &n, &nrhs, A, &n,ipvs, b, &n, &info);
    printf("info %d\n",info);
    printf("Solution: %10.4f %10.4f %10.4f\n",b[0], b[1], b[2]);

    return 0;
}

我得到的解决方案是1.3750 1.75 1.5。如果不是列主要订单,请切换为"N"而不是"T"。然后,解决方案变为0.5 1.25 2.125

选择你最喜欢的!

再见,

弗朗西斯