C++ Aiuto codice per esame!!!veramente molto importante..
Salve, io ho un problema a capire dei punti di questo programma che mi serve per un esame univesitario.. vi posto la traccia:
Scrivere un programma C++ che svolga le seguenti operazioni:
1. Richiede in input una matrice $A^((0)) = (aij ) in R^(nxn)$, 0 < n <= 10; ed un numero reale
positivo tol.
2. Calcola il vettore $w^((0)) = (w^((0))j ) in R^(n)$, dove $w^((0))j$ =$sum_( i = 1 )^( n ) |a^((0))ij|$. 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 sum_( i = 1 )^( n ) |a^((0))ij|$
- $A^((k+1))=s^((k+1)) A^((k))$
- $w^((k+1))=A^((k+1)) w^((k))$
- $w^((K+1))=B w^((k))+w^((k-1))$
4. Stampa $m^((k))$ ad ogni iterazione.
5. Quando $m^((k)) \leq$ 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.. grazie mille a tutti.. QUESTO E' IL CODICE CHE HO SCRITTO:
Scrivere un programma C++ che svolga le seguenti operazioni:
1. Richiede in input una matrice $A^((0)) = (aij ) in R^(nxn)$, 0 < n <= 10; ed un numero reale
positivo tol.
2. Calcola il vettore $w^((0)) = (w^((0))j ) in R^(n)$, dove $w^((0))j$ =$sum_( i = 1 )^( n ) |a^((0))ij|$. 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 sum_( i = 1 )^( n ) |a^((0))ij|$
- $A^((k+1))=s^((k+1)) A^((k))$
- $w^((k+1))=A^((k+1)) w^((k))$
- $w^((K+1))=B w^((k))+w^((k-1))$
4. Stampa $m^((k))$ ad ogni iterazione.
5. Quando $m^((k)) \leq$ 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.. grazie mille a tutti.. QUESTO E' IL CODICE CHE HO SCRITTO:
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
const int size=10;
typedef double vettore[size];
typedef double matrice[size][size];
int leggidim();
double leggitol();
void leggimatrice(matrice, int);
void calcolaw(matrice, vettore, int);
int calcola_wmax(vettore, int);
double calcola_mk(matrice, int);
main()
{
int n,i,j, k=1; double tol, wmax, mk; matrice A0,A ,B; vettore w;
n=leggidim();
tol=leggitol();
leggimatrice(A0,n);
calcolaw(A0,w,n);
wmax=calcola_wmax(w,n);
if(wmax<tol){
printf("attenzione, wmax minore della tolleranza");}
else
{ for(int i=0; i<n; i++)
for(int j=0; j<n; j++)
A[i][j]=(A0[i][j])/(10*wmax);}
for(int i=0; i<n; i++)
for(int j=0; j<n; j++)
B[i][j]=A[i][j];
do {
mk=calcola_mk(B,n);
printf("mk=%lf",mk);}
while((mk<=tol)||(k==100));
k++;
printf("k=%d",k);
system("pause");
return 0;
}
int leggidim()
{
int n;
do
{
printf("\n\n Quante componenti ha il vettore w e la matrice A? n=");
scanf("%d", &n);
}
while((n<0)&&(n>10));
return n;
}
double leggitol()
{
double tol;
printf("\n\n Inserire un numero reale positivo eps=");
scanf("%lf", &tol);
return tol;
}
void leggimatrice(matrice A0, int n)
{
for(int i=0; i<n; i++)
for(int j=0; j<n; j++)
{
printf("\n A0[%d][%d]=", i+1, j+1);
scanf("%lf", & A0[i][j]);
}
return;
}
void calcolaw(matrice A0,vettore w,int n)
{
int i,j;
for(i=0; i<n; i++){
w[i]=0;
for(j=0; j<n; j++)
w[i]+=A0[i][j];}
return;
}
int calcola_wmax(vettore w, int n)
{
double max=w[1];
int i;
for(i=2; i<n; i++){
if(w[i]<max){max=w[i];}
}
printf("wmax=%d",max);
return 0;
}
double calcola_mk (matrice B, int n)
{
int i, j; double sum=0, norma=0;
for(i=0; i<n; i++){
for(j=0; j<n; j++){
sum+=B[i][j];
norma=sqrt(sum*2);}}
return 0;
}
Risposte
Ti consiglio di andare a leggerti bene come devi inserire le formule. Nel testo dell'esercizio manca comunque la definizione di $s^{k+1}$. Hai sbagliato a scrivere e si tratta di $m^{k+1}$?
Ci sono diverse operazioni in questo problema che vengono svolte più volte e che sarebbe meglio, a mio parere, implementare in una funzione. In particolare mi riferisco alla moltiplicazione di una matrice per uno scalare, della moltiplicazione di una matrice per un vettore, della moltiplicazione tra matrici e del calcolo della norma 1 di una matrice (in cui potresti restituire sia $w$ che la norma oppure separarla in due operazioni distinte).
Ci sono diverse operazioni in questo problema che vengono svolte più volte e che sarebbe meglio, a mio parere, implementare in una funzione. In particolare mi riferisco alla moltiplicazione di una matrice per uno scalare, della moltiplicazione di una matrice per un vettore, della moltiplicazione tra matrici e del calcolo della norma 1 di una matrice (in cui potresti restituire sia $w$ che la norma oppure separarla in due operazioni distinte).
si, scusami, quel $s^(k+1)$ è $w^(k+1)$, ho sbagliato a scrivere..
$w^{k+1}$? Ma $w^{k+1}$ non è ancora stato definito e considerando la riga successiva verrebbe la relazione $w^{k+1} = w^{k+1}A^{k}w^{k}$. Inoltre definisci due volte $w^{k+1}$. Posteresti il testo originale dell'esercizio per intero (o un link ad esso se possibile)?
purtroppo non è in rete, lo abbiamo trascritto a mano dalla lavagna.. forse ho sbagliato a trascrivere io ed è come dicevi tu, cioè $m^k+1$ .. sono un disastro!!
Cmq mi aiuterebbe tanto anche solo uno o due punti della terza parte.. grazie mille..
Cmq mi aiuterebbe tanto anche solo uno o due punti della terza parte.. grazie mille..