gpt4 book ai didi

c++ - LAPACK 求解线性方程组时缺少一个元素

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:51:41 32 4
gpt4 key购买 nike

我真的很困惑我从线性方程组中得到的解。我的目标是通过 lapack 中的函数求解线性方程:A*x = e。这是我的代码:

#include <iostream>
#include "/usr/include/armadillo"
#include "/usr/local/include/lapacke.h"

using namespace std;

int main()
{
int n = 3;
arma::fvec alpha( n );//define a vetor alpha with a size 3
arma::fvec beta( n );//define a vector beta with a size 2
alpha << 1 << 2 << 3 << arma::endr;//assign 1,2,3 to alpha;
beta << 0.3 << 0.6 << arma::endr;//assign 0.3, 0.6 to beta;
float a = 0.1;
arma::fvec e = arma::zeros<arma::fvec>( n );//define a vector e with all element equal to 0;
e( n - 1 ) = beta( n - 2 ) * beta( n - 2 ); //the last element of e equals to the square of the last element of vector beta;
arma::fvec tri_alpha = alpha - a;
LAPACKE_sgtsv(LAPACK_COL_MAJOR, n, 1, &( beta[ 0 ] ), &( tri_alpha[ 0 ] ), &( beta[ 0 ] ), &( e[ 0 ] ), n );
cout << e.t() << endl;
return 0;
}

vector alpha在对角线上, vector beta在下对角线和上对角线上构造三对角矩阵,假设为T。下面是函数sgtsv.

LAPACKE_sgtsv( int matrix_order, int n, int nrhs, float *dl, float *d, float *du, float *b, int ldb)

B is REAL array, dimension (LDB,NRHS),On exit, if INFO = 0, the N by NRHS solution matrix X

在我的例子中,B = e,我最后输出的是(0, -0.0444, 0.1333),显然正确答案应该是(0.0148, -0.0444, 0.1333),那么第一个元素是错误的或者可能缺少,谁能帮我个忙?谢谢。顺便说一下,我使用的库是 Armadillo 。

最佳答案

根据documentation sgtsv() 的三对角矩阵 A 的上对角线 (DU) 和下对角线 (DL) 将在求解线性方程时被覆盖。

On exit, DL is overwritten by the (n-2) elements of the second super-diagonal of the upper triangular matrix U from the LU factorization of A, in DL(1), ..., DL(n-2)."

和:

On exit, DU is overwritten by the (n-1) elements of the first super-diagonal of U.

问题的出现是因为 beta 应该同时是上对角线 DU 和下对角线 DL

解决方案是复制 beta :

#include <iostream>

#include "/usr/include/armadillo"
#include "/usr/local/include/lapacke.h"

//#include "/usr/local/include/armadillo"
//#include "lapacke.h"

using namespace std;

int main()
{
int n = 3;
arma::fvec alpha( n );//define a vetor alpha with a size 3
arma::fvec beta( n );//define a vector beta with a size 2
alpha << 1 << 2 << 3 << arma::endr;//assign 1,2,3 to alpha;
beta << 0.3 << 0.6 << arma::endr;//assign 0.3, 0.6 to beta;
float a = 0.1;
arma::fvec e = arma::zeros<arma::fvec>( n );//define a vector e with all element equal to 0;
e( n - 1 ) = beta( n - 2 ) * beta( n - 2 ); //the last element of e equals to the square of the last element of vector beta;
arma::fvec tri_alpha = alpha - a;

arma::fvec betabis( n );//define a vector betabis with a size 2...copy of beta
betabis=beta;
LAPACKE_sgtsv(LAPACK_COL_MAJOR, n, 1, &( beta[ 0 ] ), &( tri_alpha[ 0 ] ), &( betabis[ 0 ] ), &( e[ 0 ] ), n );
cout << e.t() << endl;
return 0;
}

关于c++ - LAPACK 求解线性方程组时缺少一个元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27531074/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com