Search
 
 
  Engleski
 
 
 
Open in this window (click to change)
Forum@DeGiorgi: Početna
Forum za podršku nastavi na PMF-MO
Login Registracija FAQ Smajlići Članstvo Pretražnik Forum@DeGiorgi: Početna

dgbsv funkcija (objasnjenje gradiva)

Moja sarma
 
Započnite novu temu   Odgovorite na temu   printer-friendly view    Forum@DeGiorgi: Početna -> Kolegiji diplomskih i starih studija -> Praktikum primijenjene matematike 1
Prethodna tema :: Sljedeća tema  
Autor/ica Poruka
GauSs_
Moderator
Moderator


Pridružen/a: 28. 01. 2004. (21:01:17)
Postovi: (53C)16
Spol: muško
Sarma = la pohva - posuda
72 = 110 - 38
Lokacija: 231

PostPostano: 16:07 pon, 3. 4. 2006    Naslov: dgbsv funkcija Citirajte i odgovorite

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.
[code:1]
|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|
[/code:1]

c-ovska deklaracija bi bila
[code:1]
void dgbsv_(int *n, int *kl, int *ku, int *nrhs, double *ab, int *ldab, int *ipiv, double *b, int *ldb, int *info);
[/code:1]
gdje argumenti predstavljaju sljedece
[code:1]
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
[/code:1]
*** Zbog posebnog nacina rada s matricom i potrebne LU faktorizacije funkcija zahtijeva vece zauzimanje memorijskog prostora. zato imamo da je [b]ldab>=2*kl+ku+1[/b].
za detaljnija objasnjenja pogledati [b]man[/b] stranicu od [b]dgbsv[/b].

za gornji primjer argumenti bi bili sljedeci:
[code:1]
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)
[/code:1]
*** Zbog uvjeta da je ldab>=2*kl+ku+1 dodali smo jedan redak vise na vrh matrice

funkciju bi sada pozvali na sljedeci nacin:
[code:1]
...
int n, kl, ku, nrhs, ldab, ldb, info, *ipiv;
double *ab, *b;
...
dgbsv_( &n, &kl, &ku, &nrhs, ab, &ldab, ipiv, b, &ldb, &info);
...
[/code:1]
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);
...



_________________
The purpose of life is to end
Malo sam lose volje...

Prosle su godine kolokviji bili laksi, zar ne?
[Vrh]
Korisnički profil Pošaljite privatnu poruku Posjetite Web stranice
GauSs_
Moderator
Moderator


Pridružen/a: 28. 01. 2004. (21:01:17)
Postovi: (53C)16
Spol: muško
Sarma = la pohva - posuda
72 = 110 - 38
Lokacija: 231

PostPostano: 16:45 pon, 3. 4. 2006    Naslov: Citirajte i odgovorite

evo kod u c-u za gornji primjer:

[code:1]
#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;
}
[/code:1]

i tocno rjesnje:
[code:1]
x[1]=-1.769231
x[2]=1.153846
x[3]=1.384615
x[4]=2.615385
x[5]=-0.230769
[/code:1]
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



_________________
The purpose of life is to end
Malo sam lose volje...

Prosle su godine kolokviji bili laksi, zar ne?
[Vrh]
Korisnički profil Pošaljite privatnu poruku Posjetite Web stranice
Prethodni postovi:   
Započnite novu temu   Odgovorite na temu   printer-friendly view    Forum@DeGiorgi: Početna -> Kolegiji diplomskih i starih studija -> Praktikum primijenjene matematike 1 Vremenska zona: GMT + 01:00.
Stranica 1 / 1.

 
Forum(o)Bir:  
Možete otvarati nove teme.
Možete odgovarati na postove.
Ne možete uređivati Vaše postove.
Ne možete izbrisati Vaše postove.
Ne možete glasovati u anketama.
You cannot attach files in this forum
You can download files in this forum


Powered by phpBB © 2001, 2002 phpBB Group
Theme created by Vjacheslav Trushkin
HR (Cro) by Ančica Sečan