我正在尝试用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
我的错误在哪里?
答案 0 :(得分:2)
奇怪的是,2.5 4.0 3.5
是rhs 1 2 3
的解决方案...如果矩阵是
2 -1 0
-1 2 -1
0 -1 2
dpotrf
和dpotrs
是针对对称正定矩阵制作的......
我建议改用dgetrf
和dgetrs
。在你的情况下:
#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
选择你最喜欢的!
再见,
弗朗西斯