Precedente :: Successivo |
Autore |
Messaggio |
maddy Mortale devoto

Registrato: 21/09/09 12:38 Messaggi: 9
|
Inviato: 21 Set 2009 15:16 Oggetto: metodo jacobi |
|
|
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 |
|
 |
freemind Supervisor sezione Programmazione


Registrato: 04/04/07 21:28 Messaggi: 4643 Residenza: Internet
|
Inviato: 21 Set 2009 20:01 Oggetto: |
|
|
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 |
|
 |
Scrigno Semidio


Registrato: 26/07/09 05:32 Messaggi: 313
|
Inviato: 21 Set 2009 21:58 Oggetto: |
|
|
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
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 ciao  |
|
Top |
|
 |
maddy Mortale devoto

Registrato: 21/09/09 12:38 Messaggi: 9
|
Inviato: 22 Set 2009 10:57 Oggetto: |
|
|
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 |
|
 |
|