Отсутствие одного элемента в решении линейных уравнений по ЛАПАКУ

Я действительно смущен решением, которое я получаю из системы линейных уравнений. Моя цель - решить линейное уравнение: A*x = e с помощью функции в lapack. Вот мой код:

#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;
}

вектор альфа находится на диагонали, а вектор бета находится на субдиагонали и супердиагонали, чтобы построить трехдиагональную матрицу, предположим, что это 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, я вывожу e наконец, и это (0, -0.0444, 0.1333), очевидно, правильный ответ должен быть (0.0148, -0.0444, 0.1333), тогда первый элемент неверен или может отсутствовать, может ли кто-нибудь сделать мне одолжение? Благодарю. Кстати, я использую библиотеку armadillo.


person Fly_back    schedule 17.12.2014    source источник


Ответы (1)


Согласно документации sgtsv(), верхний (DU ) и нижние (DL) диагонали трехдиагональной матрицы A будут перезаписаны по мере решения линейного уравнения.

На выходе DL перезаписывается (n-2) элементами второй супердиагонали верхней треугольной матрицы U из LU-факторизации A в DL (1), ..., DL (n-2). "

А также :

На выходе DU перезаписывается (n-1) элементами первой супердиагонали 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;
}
person francis    schedule 18.12.2014