Kod: |
|1 0 2 0 0 | |x1| |1| |1 1 0 1 0 | |x2| |2| A=|0 2 1 0 3 | X= |x3| B= |3| |0 0 1 1 0 | |x4| |4| |0 0 0 2 1 | |x5| |5| |
Kod: |
void dgbsv_(int *n, int *kl, int *ku, int *nrhs, double *ab, int *ldab, int *ipiv, double *b, int *ldb, int *info); |
Kod: |
n = vodeca dimenzija matrice A, tj. N kl = broj podddijagonala ku= broj nadddijagonala nrhs = broj stupaca matrica X i B, tj. NRHS ab = Na ulazu matrica A u trakastoj formi dimenzija ldab*N, a na izlazu detalji provedene LU faktorizacije ldab = vodeca dimenzija matrice A u trakastoj formi, ldab>=2*kl+ku+1 *** ipiv = permutacijski vektor koristen pri rjesavanju sustava b = Na ulazu matrica desne strane B dimenzija N*NRHS. Na izlazu, ako je info = 0, matrica rjesenja X. ldb = vodeca dimenzija od matrice B, tj. N info = 0 ako je sve odradjeno kako treba |
Kod: |
n=5 kl=1 ku=2 nrhs=1 |* * * * *| |* * 2 1 3| |* 0 0 0 0| ab=|1 1 1 1 1|, elementi oznaceni * ne moraju se ispunjavati *** |1 2 1 2 *| ldab=2*1+ 2 + 1=5 ipiv = ne treba podesavati ( samo osigurati memoriju) |1| |2| b=|3| |4| |5| ldb=5 info = ne treba podesavati ( samo osigurati memoriju) |
Kod: |
... int n, kl, ku, nrhs, ldab, ldb, info, *ipiv; double *ab, *b; ... dgbsv_( &n, &kl, &ku, &nrhs, ab, &ldab, ipiv, b, &ldb, &info); ... |
Kod: |
#include <stdio.h> #include <stdlib.h> void dgbsv_(int *n, int *kl, int *ku, int *nrhs, double *ab, int *ldab, int *ipiv, double *b, int *ldb, int *info); int main(){ int i, n, kl, ku, nrhs, ldab, ldb, info, *ipiv; double *ab, *b; n=5; kl=1; ku=2; nrhs=1; ldab=2*kl+ku+1; ldb=5; if(!( ab=(double *) malloc( ldab*n*sizeof( double)) )) return 1; /* "rucno" radimo ab matricu iz matrice A */ ab[3]=1; ab[4]=1; ab[7]=0; ab[8]=1; ab[9]=2; ab[11]=2; ab[12]=0; ab[13]=1; ab[14]=1; ab[16]=1; ab[17]=0; ab[18]=1; ab[19]=2; ab[21]=3; ab[22]=0; ab[23]=1; /* kraj */ if(!( b=(double *) malloc( n*sizeof( double)) )) return 1; for(i=0; i<5; i++){ b[i]=i+1; } if(!( ipiv=(int *) malloc( n*sizeof( int)) )) return 1; dgbsv_( &n, &kl, &ku, &nrhs, ab, &ldab, ipiv, b, &ldb, &info); if(!info){ for(i=0; i<n; i++){ printf("x[%d]=%lf\n", i+1, b[i]); } } free(ab); free(b); free(ipiv); return 0; } |
Kod: |
x[1]=-1.769231 x[2]=1.153846 x[3]=1.384615 x[4]=2.615385 x[5]=-0.230769 |
output generated using printer-friendly topic mod. Vremenska zona: GMT + 01:00.