Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - Aiuto iterazioni!!
Forum - C/C++ - Aiuto iterazioni!!

Avatar
PetraSA (Normal User)
Newbie


Messaggi: 10
Iscritto: 31/01/2010

Segnala al moderatore
Postato alle 17:18
Domenica, 31/01/2010
Salve, io ho un problema a capire dei punti di questo programma, è molto importante.. vi posto la traccia:
Scrivere un programma C++ che svolga le seguenti operazioni:
1. Richiede in input una matrice A^(0) = (aij ) € R^nxn, 0 < n <= 10; ed un numero reale
positivo tol.
2. Calcola il vettore w^(0) = (w^(0)j ) €Rn, dove w^(0)j =sommatora con i da 1 a n di |aij|. Calcola e stampa wmax,
dove wmax = max j=1,...,n w^(0)j.
3. Se wmax < tol stampa un opportuno messaggio, altrimenti calcola la matrice A=          A^(0)/(10wmax) e, a partire da B^(0) = A, esegue le seguenti operazioni in sequenza (per k >= 1)
- B^(k) = B^(k-1) A
- m^(k) = max j=1,...,n della sommatoria con i da 1 a n del |b^(k)ji|
- w^(k+1)=B w^(k)+w^(k-1)
4. Stampa m(k) ad ogni iterazione.
5. Quando m^(k)<=tol oppure k=100 arresta il calcolo e stampa il numero k delle iterazioni.

Io ho provato a scrivere il programma solo che dalle operazioni in sequenza del punto tre mi sono bloccata, non so più andare avanti, ho solo calcolato mk, e per il punto 4 e 5 non sono molto sicura.. Spero che qualcuno con tanta pazienza possa darmi una mano o qualche suggerimento :hail:.. grazie mille a tutti.. QUESTO E' IL CODICE CHE HO SCRITTO:

Codice sorgente - presumibilmente C

  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<math.h>
  4.  
  5. const int size=10;
  6. typedef double vettore[size];
  7. typedef double matrice[size][size];
  8.  
  9. int leggidim();
  10. double leggitol();
  11. void leggimatrice(matrice, int);
  12. void calcolaw(matrice, vettore, int);
  13. int calcola_wmax(vettore, int);
  14.  
  15. double calcola_mk(matrice, int);
  16.  
  17. main()
  18. {
  19.       int n,i,j, k=1; double tol, wmax, mk; matrice A0,A ,B; vettore w;
  20.      
  21.       n=leggidim();
  22.       tol=leggitol();
  23.       leggimatrice(A0,n);
  24.       calcolaw(A0,w,n);
  25.       wmax=calcola_wmax(w,n);
  26.       if(wmax<tol){
  27.       printf("attenzione, wmax minore della tolleranza");}
  28.       else
  29.       {  for(int i=0; i<n; i++)
  30.                   for(int j=0; j<n; j++)
  31.          A[i][j]=(A0[i][j])/(10*wmax);}
  32.      
  33.       for(int i=0; i<n; i++)
  34.                   for(int j=0; j<n; j++)
  35.        B[i][j]=A[i][j];
  36.      
  37.       do {
  38.             mk=calcola_mk(B,n);
  39.             printf("mk=%lf",mk);}
  40.       while((mk<=tol)||(k==100));
  41.      
  42.       k++;
  43.       printf("k=%d",k);
  44.      
  45.       system("pause");
  46.       return 0;
  47. }
  48.  
  49.  
  50. int leggidim()
  51. {
  52.     int n;
  53.    
  54.     do
  55.       {
  56.           printf("\n\n inserire dimensione del vettore w e della matrice A?   n=");
  57.           scanf("%d", &n);    
  58.       }
  59.     while((n<0)&&(n>10));
  60.    
  61.     return n;    
  62. }
  63.  
  64.        
  65.  double leggitol()
  66. {
  67.        double tol;
  68.        
  69.        printf("\n\n Inserire tolleranza  tol=");
  70.        scanf("%lf", &tol);
  71.        
  72.        return tol;
  73. }      
  74.  
  75. void leggimatrice(matrice A0, int n)
  76. {
  77.      for(int i=0; i<n; i++)
  78.                   for(int j=0; j<n; j++)
  79.                                {
  80.                                     printf("\n A0[%d][%d]=", i+1, j+1);
  81.                                     scanf("%lf", & A0[i][j]);
  82.                                }
  83.      return;      
  84. }
  85.  
  86. void calcolaw(matrice A0,vettore w,int n)
  87. {
  88.      int i,j;
  89.      
  90.      for(i=0; i<n; i++){
  91.              w[i]=0;
  92.              for(j=0; j<n; j++)
  93.               w[i]+=A0[i][j];}
  94.     return;
  95. }
  96.  
  97. int calcola_wmax(vettore w, int n)
  98. {
  99.        double max=w[1];
  100.        int i;
  101.        for(i=2; i<n; i++){
  102.                 if(w[i]<max){max=w[i];}
  103.        }
  104.        printf("wmax=%d",max);
  105.        return 0;
  106. }
  107.  
  108. double calcola_mk (matrice B, int n)
  109. {
  110.        int i, j; double sum=0, norma=0;
  111.        for(i=0; i<n; i++){
  112.            for(j=0; j<n; j++){
  113.                     sum+=B[i][j];
  114.                     norma=sqrt(sum*2);}}
  115.        return 0;
  116. }


PM Quote
Avatar
Poggi Marco (Member)
Guru


Messaggi: 969
Iscritto: 05/01/2010

Segnala al moderatore
Postato alle 20:06
Domenica, 31/01/2010
Ciao!

Ho letto la tua traccia, e ndevo dire che non ho capito molto, per favore puoi rispiegarmi il punto 3?

Nel codice ho notato che:
Codice sorgente - presumibilmente Plain Text

  1. {  for(int i=0; i<n; i++)
  2.                   for(int j=0; j<n; j++)
  3.          A[i][j]=(A0[i][j])/(10*wmax);}
  4.        
  5.       for(int i=0; i<n; i++)
  6.                   for(int j=0; j<n; j++)
  7.        B[i][j]=A[i][j];


Le varibili i e j sono già state dichiarate int, quindi non serve scrivere for(int i...

Nella funzione
Codice sorgente - presumibilmente C#

  1. double calcola_mk (matrice B, int n)
  2. {
  3.        int i, j; double sum=0, norma=0;
  4.        for(i=0; i<n; i++){
  5.            for(j=0; j<n; j++){
  6.                     sum+=B[i][j];
  7.                     norma=sqrt(sum*2);}}
  8.        return 0;
  9. }


Come mai alla fine c' e "return 0"?
L' istruzione "norma=sqrt(sum*2);", secondo me, va portata fuori dal ciclo.

Ultima modifica effettuata da Poggi Marco il 31/01/2010 alle 21:50
PM Quote
Avatar
PetraSA (Normal User)
Newbie


Messaggi: 10
Iscritto: 31/01/2010

Segnala al moderatore
Postato alle 21:43
Domenica, 31/01/2010
Grazie per avermi fatto notare gli errori.. e return 0 ho sbagliato, ci andava solo return..
per quanto riguarda il punto 3 sono prodotti di matrici e vettori con iterate attuali, precedebti e successive, che io non so applicare nel c++..

PM Quote
Avatar
Poggi Marco (Member)
Guru


Messaggi: 969
Iscritto: 05/01/2010

Segnala al moderatore
Postato alle 22:05
Domenica, 31/01/2010
Prova a spiegare cosa non sai fare.
Comunque non credo che nella funzione "calcola_mk", alla fine ci vada solo "return", visto che l' hia dichiarata double e viene lanciata
da "mk=calcola_mk(B,n);".

Lo stesso vale per la funzione "calcola_wmax".

PM Quote
Avatar
PetraSA (Normal User)
Newbie


Messaggi: 10
Iscritto: 31/01/2010

Segnala al moderatore
Postato alle 22:34
Domenica, 31/01/2010
Hai ragione, forse devo mettere return mk e return wmax!?!
Cmq io non so applicare l'iterazione al vettore e alla matrice.. so matematicamente cos'è, ma non so costruire la funzine.. è solo tre mesi che studio la programmazione in c e non avevo mai fatto nulla del genere.. ti ringrazio tanto..

PM Quote
Avatar
Poggi Marco (Member)
Guru


Messaggi: 969
Iscritto: 05/01/2010

Segnala al moderatore
Postato alle 23:22
Domenica, 31/01/2010
Procediamo con calma!

Return ha lo scopo di terminare la funzione e, restituisce al chiamante il valore dell' espressione che segue.
Nel tuo caso, le variabili mk e wmax, sono visibili solo nel main, quindi presumo che dovrai mettere rispettivamente "return norma;" e "return max;"

Se tu hai capito come risolvere matematicamente il problema, sei a buon punto!

:_doubt: Io non l' ho capito, quindi non posso aiutarti più di tanto.

Ti posso solo suggerire di "frammentare" le funzioni.
Per ogni problema che non sai risolvere, c' è sempre un problema più facile che sai fare!

Ultima modifica effettuata da Poggi Marco il 31/01/2010 alle 23:32
PM Quote
Avatar
PetraSA (Normal User)
Newbie


Messaggi: 10
Iscritto: 31/01/2010

Segnala al moderatore
Postato alle 10:30
Lunedì, 01/02/2010
Grazie mille per il tuo aiuto..
seguirò il tuo consiglio, anche se le ho provate di tutte le maniere, ma non riesco proprio.. ciao

PM Quote