---
title: ?gtsv
description: "求解线性方程组A*X=B，其中系数矩阵A为一般三对角矩阵。"
url: https://www.hikunpeng.com/document/detail/zh/hpchistory/hpckit/develop2400/kunpengaccel_kml_0688.html
sourcePath: /source/zh/hpchistory/hpckit/develop2400/kunpengaccel_kml_0688.html
indexId: 9c4a34971ee986f81b2652552bdbf4ede3c2950f3c42ef79db22e47ef17de48667
---
# ?gtsv

求解线性方程组A*X=B，其中系数矩阵A为一般三对角矩阵。

#### 接口定义

C Interface：

void sgtsv(const int *N, const int *NRHS, float *DL, float *D, float *DU, float *B, const int *LDB, int *INFO);

void dgtsv(const int *N, const int *NRHS, double *DL, double *D, double *DU, double *B, const int *LDB, int *INFO);

void cgtsv(const int *N, const int *NRHS, float _Complex *DL, float _Complex *D, float _Complex *DU, float _Complex *B, const int *LDB, int *INFO);

void zgtsv(const int *N, const int *NRHS, double _Complex *DL, double _Complex *D, double _Complex *DU, double _Complex *B, const int *LDB, int *INFO);

Fortran Interface：

SGTSV(N, NRHS, DL, D, DU, B, LDB, INFO);

DGTSV(N, NRHS, DL, D, DU, B, LDB, INFO);

CGTSV(N, NRHS, DL, D, DU, B, LDB, INFO);

ZGTSV(N, NRHS, DL, D, DU, B, LDB, INFO);


#### 参数

| 参数名 | 类型 | 描述 | 输入/输出 |
| --- | --- | --- | --- |
| N | 整数型 | 矩阵A的维数，N≥0。 | 输入 |
| NRHS | 整数型 | 矩阵B的列数，NRHS≥0。 | 输入 |
| DL | 在sgtsv中为单精度浮点型数组。 在dgtsv中为双精度浮点型数组。 在cgtsv中为单精度复数型数组。 在zgtsv中为双精度复数型数组。 | 输入时，为三对角矩阵A的次对角元素，维度为N\-1。 输出时，为U的第二超对角元素。 | 输入、输出 |
| D | 在sgtsv中为单精度浮点型数组。 在dgtsv中为双精度浮点型数组。 在cgtsv中为单精度复数型数组。 在zgtsv中为双精度复数型数组。 | 输入时，为三对角矩阵A的对角元素，维度为N。 输出时，为U的对角元素。 | 输入、输出 |
| DU | 在sgtsv中为单精度浮点型数组。 在dgtsv中为双精度浮点型数组。 在cgtsv中为单精度复数型数组。 在zgtsv中为双精度复数型数组。 | 输入时，为三对角矩阵A的超对角元素，维度为N\-1。 输出时，为U的第一超对角元素。 | 输入、输出 |
| B | 在sgtsv中为单精度浮点型数组。 在dgtsv中为双精度浮点型数组。 在cgtsv中为单精度复数型数组。 在zgtsv中为双精度复数型数组。 | 右端项矩阵，维度为(LDB, NRHS)。 | 输入、输出 |
| LDB | 整数型 | 矩阵B的主维。 | 输入 |
| INFO | 整数型 | 等于0：成功退出。 小于0：第\-info个参数值不合法。 大于0：表示U(INFO, INFO)为零。 | 输出 |


#### 依赖

include "klapack.h"


#### 示例

C Interface：

```
const int n = 4;
const int ldb = n;
const int nrhs = 1;
double dl[] = {0.923077, 0.153846, 0.153846};
double d[] = {0.521739, 0.043478, 0.304348, 0.086957};
double du[] = {0.924528, 0.150943, 0.566038};
double b[] = {0.986301, 0.397260, 0.958904, 0.520548};
int info = 0;
dgtsv_(&n, &nrhs, dl, d, du, b, &ldb, &info);
if (info != 0) {
    printf("ERROR, info = %d\n", info);
}

/* 
* Output: 
*   d:  0.923077        0.899954        0.318932        -0.186088
*   dl: 0.150943        0.000000        0.153846
*   du: 0.043478        -0.085316       0.566038
*   b:  -0.239541       1.201996        3.750506        -0.649209
*/
```

Fortran Interface：

```
PARAMETER (n = 4)
PARAMETER (ldb = 4)
PARAMETER (nrhs = 1)
INTEGER :: info = 0
REAL(8) :: d(n)
REAL(8) :: dl(n-1)
REAL(8) :: du(n-1)
REAL(8) :: b(ldb, nrhs)
DATA d / 0.521739, 0.043478, 0.304348, 0.086957 /
DATA dl / 0.923077, 0.153846, 0.153846 /
DATA du / 0.924528, 0.150943, 0.566038 /
DATA b / 0.986301, 0.397260, 0.958904, 0.520548 /
EXTERNAL DGTSV
CALL DGTSV(n, nrhs, dl, d, du, b, ldb, info);
*
* Output:
*   d:  0.923077        0.899954        0.318932        -0.186088
*   dl: 0.150943        0.000000        0.153846
*   du: 0.043478        -0.085316       0.566038
*   b:  -0.239541       1.201996        3.750506        -0.649209
```
