dgbsv funkcija
Select messages from
# through # FAQ
[/[Print]\]

Forum@DeGiorgi -> Praktikum primijenjene matematike 1

#1: dgbsv funkcija Autor/ica: GauSs_Lokacija: 231 PostPostano: 16:07 pon, 3. 4. 2006
    —
DGBSV racuna rjesenje sistema realnih linearnih jednadzbi A * X = B, gdje je A trakasta matrica N*N sa KU naddijagonala i KL poddijagonala, a X i B su N*NRHS matrice.

npr.
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|


c-ovska deklaracija bi bila
Kod:

void dgbsv_(int *n, int *kl, int *ku, int *nrhs, double *ab, int *ldab, int *ipiv, double *b, int *ldb, int *info);

gdje argumenti predstavljaju sljedece
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

*** Zbog posebnog nacina rada s matricom i potrebne LU faktorizacije funkcija zahtijeva vece zauzimanje memorijskog prostora. zato imamo da je ldab>=2*kl+ku+1.
za detaljnija objasnjenja pogledati man stranicu od dgbsv.

za gornji primjer argumenti bi bili sljedeci:
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)

*** Zbog uvjeta da je ldab>=2*kl+ku+1 dodali smo jedan redak vise na vrh matrice

funkciju bi sada pozvali na sljedeci nacin:
Kod:

...
int n, kl, ku, nrhs, ldab, ldb, info, *ipiv;
double *ab, *b;
...
dgbsv_( &n, &kl, &ku, &nrhs, ab, &ldab, ipiv, b, &ldb, &info);
...

#2:  Autor/ica: GauSs_Lokacija: 231 PostPostano: 16:45 pon, 3. 4. 2006
    —
evo kod u c-u za gornji primjer:

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


i tocno rjesnje:
Kod:

x[1]=-1.769231
x[2]=1.153846
x[3]=1.384615
x[4]=2.615385
x[5]=-0.230769



Forum@DeGiorgi -> Praktikum primijenjene matematike 1


output generated using printer-friendly topic mod. Vremenska zona: GMT + 01:00.

Stranica 1 / 1.

Powered by phpBB © 2001,2002 phpBB Group
Theme created by Vjacheslav Trushkin