Compute an
LUfactorization of a real tridiagonal matrixAusing elimination with partial pivoting and row interchanges.
The dgttrf routine computes an LU factorization of a real N-by-N tridiagonal matrix A using elimination with partial pivoting and row interchanges. The factorization has the form:
where L is a product of permutation and unit lower bidiagonal matrices and U is upper triangular with non-zeros in only the main diagonal and first two superdiagonals.
For a 5-by-5 tridiagonal matrix A, elements are stored in three arrays:
where:
dlcontains the subdiagonal elements.dcontains the diagonal elements.ducontains the superdiagonal elements.
After factorization, the elements of L and U are used to update the input arrays, where:
dlcontains the multipliers that define unit lower bidiagonal matrixL.dcontains the diagonal elements ofU.duanddu2contain the elements ofUon the first and second superdiagonals.
The resulting L and U matrices have the following structure:
where the l(i) values are stored in DL, the diagonal elements u(i,i) are stored in D, and the superdiagonal elements u(i,i+1) and u(i,i+2) are stored in DU and DU2, respectively.
var dgttrf = require( '@stdlib/lapack/base/dgttrf' );Computes an LU factorization of a real tridiagonal matrix A using elimination with partial pivoting and row interchanges.
var Float64Array = require( '@stdlib/array/float64' );
var Int32Array = require( '@stdlib/array/int32' );
var dgttrf = require( '@stdlib/lapack/base/dgttrf' );
var DL = new Float64Array( [ 6.0, 6.0 ] );
var D = new Float64Array( [ 20.0, 30.0, 10.0 ] );
var DU = new Float64Array( [ 8.0, 8.0 ] );
var DU2 = new Float64Array( [ 0.0 ] );
var IPIV = new Int32Array( [ 0, 0, 0 ] );
/*
A = [
[ 20.0, 8.0, 0.0 ],
[ 6.0, 30.0, 8.0 ],
[ 0.0, 6.0, 10.0 ]
]
*/
dgttrf( 3, DL, D, DU, DU2, IPIV );
// DL => <Float64Array>[ 0.3, ~0.22 ]
// D => <Float64Array>[ 20.0, 27.6, ~8.26 ]
// DU => <Float64Array>[ 8.0, 8.0 ]
// DU2 => <Float64Array>[ 0.0 ]
// IPIV => <Int32Array>[ 0, 1, 2 ]The function has the following parameters:
- N: number of rows/columns in
A. - DL: the first sub diagonal of
Aas aFloat64Array. Should haveN-1indexed elements.DLis overwritten by the multipliers that define the matrixLfrom theLUfactorization ofA. - D: the diagonal of
Aas aFloat64Array. Should haveNindexed elements.Dis overwritten by the diagonal elements of the upper triangular matrixUfrom theLUfactorization ofA. - DU: the first super-diagonal of
Aas aFloat64Array. Should haveN-1indexed elements.DUis overwritten by the elements of the first super-diagonal ofU. - DU2: the second super-diagonal of
Uas aFloat64Array. Should haveN-2indexed elements.DU2is overwritten by the elements of the second super-diagonal ofUas aFloat64Array. - IPIV: vector of pivot indices as a
Int32Array. Should haveNindexed elements.
Note that indexing is relative to the first index. To introduce an offset, use typed array views.
var Float64Array = require( '@stdlib/array/float64' );
var Int32Array = require( '@stdlib/array/int32' );
var dgttrf = require( '@stdlib/lapack/base/dgttrf' );
// Initial arrays...
var DL0 = new Float64Array( [ 0.0, 6.0, 6.0 ] );
var D0 = new Float64Array( [ 0.0, 20.0, 30.0, 10.0 ] );
var DU0 = new Float64Array( [ 0.0, 8.0, 8.0 ] );
var DU20 = new Float64Array( [ 0.0, 0.0 ] );
var IPIV0 = new Int32Array( [ 0, 0, 0, 0 ] );
/*
A = [
[ 20.0, 8.0, 0.0 ],
[ 6.0, 30.0, 8.0 ],
[ 0.0, 6.0, 10.0 ]
]
*/
// Create offset views...
var DL = new Float64Array( DL0.buffer, DL0.BYTES_PER_ELEMENT*1 ); // start at 2nd element
var D = new Float64Array( D0.buffer, D0.BYTES_PER_ELEMENT*1 ); // start at 2nd element
var DU = new Float64Array( DU0.buffer, DU0.BYTES_PER_ELEMENT*1 ); // start at 2nd element
var DU2 = new Float64Array( DU20.buffer, DU20.BYTES_PER_ELEMENT*1 ); // start at 2nd element
var IPIV = new Int32Array( IPIV0.buffer, IPIV0.BYTES_PER_ELEMENT*1 ); // start at 2nd element
dgttrf( 3, DL, D, DU, DU2, IPIV );
// DL0 => <Float64Array>[ 0.0, 0.3, ~0.22 ]
// D0 => <Float64Array>[ 0.0, 20.0, 27.6, ~8.26 ]
// DU0 => <Float64Array>[ 0.0, 8.0, 8.0 ]
// DU20 => <Float64Array>[ 0.0, 0.0 ]
// IPIV0 => <Int32Array>[ 0, 0, 1, 2 ]Computes an LU factorization of a real tridiagonal matrix A using elimination with partial pivoting and row interchanges and alternative indexing semantics.
var Float64Array = require( '@stdlib/array/float64' );
var Int32Array = require( '@stdlib/array/int32' );
var dgttrf = require( '@stdlib/lapack/base/dgttrf' );
var DL = new Float64Array( [ 6.0, 6.0 ] );
var D = new Float64Array( [ 20.0, 30.0, 10.0 ] );
var DU = new Float64Array( [ 8.0, 8.0 ] );
var DU2 = new Float64Array( [ 0.0 ] );
var IPIV = new Int32Array( [ 0, 0, 0 ] );
/*
A = [
[ 20.0, 8.0, 0.0 ],
[ 6.0, 30.0, 8.0 ],
[ 0.0, 6.0, 10.0 ]
]
*/
dgttrf.ndarray( 3, DL, 1, 0, D, 1, 0, DU, 1, 0, DU2, 1, 0, IPIV, 1, 0 );
// DL => <Float64Array>[ 0.3, ~0.22 ]
// D => <Float64Array>[ 20.0, 27.6, ~8.26 ]
// DU => <Float64Array>[ 8.0, 8.0 ]
// DU2 => <Float64Array>[ 0.0 ]
// IPIV => <Int32Array>[ 0, 1, 2 ]The function has the following additional parameters:
- sdl: stride length for
DL. - odl: starting index for
DL. - sd: stride length for
D. - od: starting index for
D. - sdu: stride length for
DU. - odu: starting index for
DU. - sdu2: stride length for
DU2. - odu2: starting index for
DU2. - si: stride length for
IPIV. - oi: starting index for
IPIV.
While typed array views mandate a view offset based on the underlying buffer, the offset parameters support indexing semantics based on starting indices. For example,
var Float64Array = require( '@stdlib/array/float64' );
var Int32Array = require( '@stdlib/array/int32' );
var dgttrf = require( '@stdlib/lapack/base/dgttrf' );
var DL = new Float64Array( [ 0.0, 6.0, 6.0 ] );
var D = new Float64Array( [ 0.0, 20.0, 30.0, 10.0 ] );
var DU = new Float64Array( [ 0.0, 8.0, 8.0 ] );
var DU2 = new Float64Array( [ 0.0, 0.0 ] );
var IPIV = new Int32Array( [ 0, 0, 0, 0 ] );
/*
A = [
[ 20.0, 8.0, 0.0 ],
[ 6.0, 30.0, 8.0 ],
[ 0.0, 6.0, 10.0 ]
]
*/
dgttrf.ndarray( 3, DL, 1, 1, D, 1, 1, DU, 1, 1, DU2, 1, 1, IPIV, 1, 1 );
// DL => <Float64Array>[ 0.0, 0.3, ~0.22 ]
// D => <Float64Array>[ 0.0, 20.0, 27.6, ~8.26 ]
// DU => <Float64Array>[ 0.0, 8.0, 8.0 ]
// DU2 => <Float64Array>[ 0.0, 0.0 ]
// IPIV => <Int32Array>[ 0, 0, 1, 2 ]-
Both functions mutate the input arrays
DL,D,DU,DU2, andIPIV. -
Both functions return a status code indicating success or failure. The status code indicates the following conditions:
0: factorization was successful.>0:U(k, k)is exactly zero the factorization has been completed, but the factorUis exactly singular, and division by zero will occur if it is used to solve a system of equations wherekequals the status code value.
var Int32Array = require( '@stdlib/array/int32' );
var Float64Array = require( '@stdlib/array/float64' );
var dgttrf = require( '@stdlib/lapack/base/dgttrf' );
var N = 9;
var DL = new Float64Array( [ 3.0, 3.0, 3.0, 3.0, 3.0, 3.0, 3.0, 3.0 ] );
var D = new Float64Array( [ 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0 ] );
var DU = new Float64Array( [ 4.0, 4.0, 4.0, 4.0, 4.0, 4.0, 4.0, 4.0 ] );
var DU2 = new Float64Array( N-2 );
var IPIV = new Int32Array( N );
/*
A = [
[ 1.0, 4.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 ],
[ 3.0, 1.0, 4.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 ],
[ 0.0, 3.0, 1.0, 4.0, 0.0, 0.0, 0.0, 0.0, 0.0 ],
[ 0.0, 0.0, 3.0, 1.0, 4.0, 0.0, 0.0, 0.0, 0.0 ],
[ 0.0, 0.0, 0.0, 3.0, 1.0, 4.0, 0.0, 0.0, 0.0 ],
[ 0.0, 0.0, 0.0, 0.0, 3.0, 1.0, 4.0, 0.0, 0.0 ],
[ 0.0, 0.0, 0.0, 0.0, 0.0, 3.0, 1.0, 4.0, 0.0 ],
[ 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 3.0, 1.0, 4.0 ],
[ 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 3.0, 1.0 ],
]
*/
// Perform the `A = LU` factorization:
var info = dgttrf( N, DL, D, DU, DU2, IPIV );
console.log( DL );
console.log( D );
console.log( DU );
console.log( DU2 );
console.log( IPIV );
console.log( info );TODOTODO.
TODOTODO
TODOTODO