Indice del forum Olimpo Informatico
I Forum di Zeus News
Leggi la newsletter gratuita - Attiva il Menu compatto
 
 FAQFAQ   CercaCerca   Lista utentiLista utenti   GruppiGruppi   RegistratiRegistrati 
 ProfiloProfilo   Messaggi privatiMessaggi privati   Log inLog in 

    Newsletter RSS Facebook Twitter Contatti Ricerca
metodo jacobi
Nuovo argomento   Rispondi    Indice del forum -> Programmazione
Precedente :: Successivo  
Autore Messaggio
maddy
Mortale devoto
Mortale devoto


Registrato: 21/09/09 12:38
Messaggi: 9

MessaggioInviato: 21 Set 2009 15:16    Oggetto: metodo jacobi Rispondi citando

ho implementato il metodo di jacobi in c++
il mio problema e' che il codice scritto prima del while mi da i risultati corretti mentre quello scritto nel ciclo non va ma non capisco perche
vi allego il codice :
in matlab
Codice:

n = length(A);
iter = 0;
x = g;
iter = 1;
z(iter) = iter;
y = A*x+b
z1(iter) = norm(y-x,inf)/norm(y,inf);

while z1(iter) > eps & iter <= 100
    x = y;
    y = A*x+b
    iter = iter + 1;
    z(iter) = iter;
    z1(iter) = norm(y-x,inf)/norm(y,inf);
end


in c++ con gmp:
Codice:

void metodoJacobi(mp_limb_t n, mpfr_class A[n][n], mpfr_class b[], mpfr_class x[]) {
    mp_limb_t iter = 0;
    mpfr_class yParziale[n];
    mpfr_class y[n];
    mpfr_class zIterazione[100];
    mpfr_class z1Iterazione[100];
 
    //introduciamo il vettore differenza per il calcolo della norma infinito :
    mpfr_class differenza[n];
   

    for(int i = 0; i < n; i++) {
        for(int j = 0; j < n;j++) {
            yParziale[i] = yParziale[i] + A[i][j]*x[j];
        }
    }
    for (int i = 0; i < n; i++) {
        y[i] = yParziale[i] + b[i];
    }

    for (int i = 0; i < n; i++) {
        differenza[i] = x[i] - y[i];
    }
    mpfr_class massimoDifferenza = differenza[0];
    for (int i = 1; i < n; i++) {
        if (massimoDifferenza < differenza[i]) {
                massimoDifferenza = differenza[i];
        }
    }
    mpfr_class massimoVettoreY = y[0];
    for (int i = 1; i < n; i++) {
        if (massimoVettoreY < y[i]) {
            massimoVettoreY = y[i];
        }
    }
    for(int i = 0; i < n; i++) {
        cout << "iterata zero : " << y[i] << endl;
    }


    cout << "valore di iter : " << iter << endl;
    zIterazione[iter] = iter;
    z1Iterazione[iter] = abs(massimoDifferenza) / abs(massimoVettoreY);
    cout << "norma 2 : " << z1Iterazione[iter] << endl;
    while(z1Iterazione[iter] < (2.220446049250313e-016) && iter <= 100) {
       for(int i = 0; i < n; i++) {
           x[i] = y[i];
       }
    for(int i = 0; i < n; i++) {
        cout << "iterata  : " << iter  << "y[i]" << y[i] << endl;
    }
       for(int i = 0; i < n; i++) {
           for(int j = 0; j < n;j++) {
               yParziale[i] = yParziale[i] + A[i][j]*x[j];
           }
        }
        for (int i = 0; i < n; i++) {
            y[i] = yParziale[i] + b[i];
        }   
       iter = iter + 1;
       z1Iterazione[iter] = iter;
    for (int i = 1; i < n; i++) {
        differenza[i] = x[i] - y[i];
    }
    mpfr_class massimoDifferenza = differenza[0];
    for (int i = 1; i < n; i++) {
        if (massimoDifferenza < differenza[i]) {
                massimoDifferenza = differenza[i];
        }
    }
    mpfr_class massimoVettoreY = y[0];
    for (int i = 1; i < n; i++) {
        if (massimoVettoreY < y[i]) {
            massimoVettoreY = y[i];
        }
    }


    z1Iterazione[iter] = abs(massimoDifferenza) / abs(massimoVettoreY);           

    }

       
   
}


aiuto!!!!
Top
Profilo Invia messaggio privato
freemind
Supervisor sezione Programmazione
Supervisor sezione Programmazione


Registrato: 04/04/07 21:28
Messaggi: 4643
Residenza: Internet

MessaggioInviato: 21 Set 2009 20:01    Oggetto: Rispondi citando

Ciao Maddy,
in che senso non va?
Potresti essere un po' più precisa?

Inoltre, dato che non conosco molto la libreria gmp, la classe mpfr_class prevede l'overloading di [] oppure l'allocazione:
Codice:

mpfr_class yParziale[n];

è una tua svista?
Top
Profilo Invia messaggio privato
Scrigno
Semidio
Semidio


Registrato: 26/07/09 05:32
Messaggi: 313

MessaggioInviato: 21 Set 2009 21:58    Oggetto: Rispondi citando

Premetto che non conoscendo il C non riesco a sapere bene cosa fa il tuo codice. comunque spero di poterti dare una spintarella verso la soluzione del problema anche con questo grande deficit Razz


Quando mi capitano di queste cose generalmente i casi sono 2:
1) ho sbagliato a creare l' algoritmo
2) L' algoritmo è giusto ma ho sbagliato qualche passo del codice come ad esempio una variabile che non viene azzerata, il prelevamento di una parte di stringa nel posto sbagliato per via di un espressione non corretta.

In tutti e due i casi uso un metodo che per ora mi ha sempre aiutato molto...

metto dopo ogni istruzione un "Scrivi a monitor le variabili che m' interessano" così le seguo passo passo e mi accorgo di quello che fa il programma invece di quello che dovrebbe fare.

Spero di essere stato d' aiuto Embarassed ciao Smile
Top
Profilo Invia messaggio privato
maddy
Mortale devoto
Mortale devoto


Registrato: 21/09/09 12:38
Messaggi: 9

MessaggioInviato: 22 Set 2009 10:57    Oggetto: Rispondi

l'algoritmo non funziona nel senso ke la parte prima del while mi da i risultati analoghi a quelli del matlab poi l'altra parte all'interno del while non da gi stessi risultati...pero la porzione di codice e' corretta altrimenti neanche la prima parte mi avrebbe dato i risultati corretti.inizio a pesare ke il problema di tutto sia il pezzo di codice
for(int i = 0; i < n;i++) {
x[i] = y[i];
}
perche secondo me il valore di x non risale al passo successivo.
comunque il tipo mpfr_class equivale ad un float.
Top
Profilo Invia messaggio privato
Mostra prima i messaggi di:   
Nuovo argomento   Rispondi    Indice del forum -> Programmazione Tutti i fusi orari sono GMT + 2 ore
Pagina 1 di 1

 
Vai a:  
Non puoi inserire nuovi argomenti
Non puoi rispondere a nessun argomento
Non puoi modificare i tuoi messaggi
Non puoi cancellare i tuoi messaggi
Non puoi votare nei sondaggi