devo
-legge un intero n con
, una tolleranza
, due vettori reali a n componenti 
-genera una matrice A(di dimensione nxn) nel modo seguente:
se
:![A[i][j]=1 A[i][j]=1](/forum/latexrender/pictures/5f2c14e7b2856bf0fe1356c34fe9cc5d.png)
altrimenti
![A[i][j]=0.1 A[i][j]=0.1](/forum/latexrender/pictures/ec86b7a57380b21ff02a16ac5d86b159.png)
-genera per
le seguenti successioni:

(norma infinito)e si arresta quando
o se
e stampa gli ultimi vettori
calcolati e il numero di iterazioni effettuateIO l'ho realizzato nel modo seguente, però io risultati vengono sbagliati...
Qualcuno riesce a vedere l'errore che ho commesso? io l'ho riguardato più volte ma non riesco a capire cosa sbaglio...
- Codice: Seleziona tutto
//ESERCIZIO n 4
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<iostream>
using namespace std;
void controlla_puntatore(float*);
float tolleranza();
float* alloca_vet(int);
float** alloca_mat(int);
int leggi_dimensione();
void leggi_vet(float*,int);
void matrice(float**,int);
float* mat_vet(float**,float*,int);
float norma(float*,int);
float* somma(float*,float*,int);
void stampa(float*,int);
int metodo(float**,float*,float*,int,float);
void vettore_nullo(float*,int);
float* uguaglianza_vettori(float*,int);
float* differenza_vettori(float*,float*,int);
main()
{
int n; //n=dimensione vettori e matrice (nxn)
n=leggi_dimensione();
//leggo da tastiera il vettore x0
float* x0;
x0=alloca_vet(n);
leggi_vet(x0,n);
//leggo da testiera il vettore y0
float* y0;
y0=alloca_vet(n);
leggi_vet(y0,n);
//eps=tolleranza
float eps;
eps=tolleranza();
//alloco e determino la matrice A
float** A;
A=alloca_mat(n);
matrice(A,n);
//iter=numero d'iterazioni
int iter;
iter=metodo(A,x0,y0,n,eps);
//stampa numero d'iterazioni
cout<<endl;
cout<<"Il numero d'iterazioni effettuate e':"<< endl << iter << endl ;
//stampa il vettore finale x0
cout<<"Il vettore finale della successione, calcolata a partire da x0 e' " << endl ;
stampa(x0,n);
//stampa il vettore finale y0
cout<<"Il vettore finale della successione, calcolata a partire da y0 e' " << endl ;
stampa(y0,n);
return 0;
}
//definisco le funzioni
float* differenza_vettori(float* a,float* b,int n)
{
float* differenza;
differenza=alloca_vet(n);
for(int i=0;i<n;i++)
differenza[i]=a[i]-b[i];
return differenza;
}
float *uguaglianza_vettori(float *a, int dim)
{
// Creo un nuovo vettore uguale a quello passato in input
float *uguale;
uguale=alloca_vet(dim);
for(int i=0;i<dim;i++)
uguale[i]=a[i];
return uguale;
}
void vettore_nullo(float* x,int n)
{
for(int i=0;i<n;i++)
x[i]=0;
return;
}
void controlla_puntatore(float* p)
{
if(p!=NULL) return;
else
{
cout<<"Memoria non allocata..." << endl;
cout<<"Il programma verra' terminato. " << endl;
exit(1);
}
}
float* alloca_vet(int n)
{
float* v;
v=new float[n];
controlla_puntatore(v);
return v;
}
float** alloca_mat(int dim)
{
float** A;
A=new float*[dim];
for(int i=0;i<dim;i++)
{
A[i]=new float[dim];
controlla_puntatore(A[i]);
}
return A;
}
float tolleranza()
{
float toll;
cout<<"Inserire la tolleranza concessa:" << endl;
do
{
cout<<"x=";
cin>>toll;
if(toll<=0) cout<<" Il valore inserito non e' accettabile...Riprova"<<endl;
}while(toll<=0);
return toll;
}
int leggi_dimensione()
{
int n;
cout<<"Inserire la dimensione dei vettori e della matrice:" << endl;
do
{
cout<<"Il valore deve essere 0<n<=10:" <<endl;
cin>>n;
cout<<endl;
if(n<=0||n>10) cout<<"I valori inseriti non rientrano nel range...Riprovare."<<endl;
}while(n<=0||n>10);
return n;
}
void leggi_vet(float* v,int dim)
{
cout<<endl;
cout<<" Inserire le componenti del vettore: " << endl;
for(int i=0;i<dim;i++)
{
cout<<"x["<<i+1<<"]=";
cin>>v[i];
}
return;
}
void matrice(float** A,int dim)
{
for(int i=0;i<dim;i++)
for(int j=0;j<dim;j++)
{
if(i==j) A[i][j]=1;
else A[i][j]=0.1;
}
return;
}
float* mat_vet(float** A,float* b,int dim)
{
float* prod;
prod=alloca_vet(dim);
vettore_nullo(prod,dim);
for(int i=0;i<dim;i++)
for(int j=0;j<dim;j++)
prod[i]=prod[i]+A[i][j]*b[j];
return prod;
}
float norma(float* a,int dim)
{
float vnorma=0;
for(int i=0;i<dim;i++){
const float modulo=fabs(a[i]);
if(modulo>vnorma) vnorma=modulo;
}
return vnorma;
}
float* somma(float* a, float* b, int n)
{
float* sum;
sum=alloca_vet(n);
for(int i=0;i<n;i++)
sum[i]=a[i]+b[i];
return sum;
}
void stampa(float* a,int dim)
{
for(int i=0;i<dim;i++)
cout<<a[i]<< endl;
return;
}
int metodo(float** A,float* x0,float* y0,int n,float eps)
{
const int nmax=100;
int cont=0;
float err;
float* xold;
xold=alloca_vet(n);
xold=uguaglianza_vettori(x0,n);
float* yold;
yold=alloca_vet(n);
yold=uguaglianza_vettori(y0,n);
float* yprod;
yprod=alloca_vet(n);
float* xprod;
xprod=alloca_vet(n);
do
{
xprod=mat_vet(A,xold,n);
x0=differenza_vettori(xprod,yold,n);
yprod=mat_vet(A,yold,n);
y0=differenza_vettori(yprod,xold,n);
err=norma(somma(y0,x0,n),n);
xold=uguaglianza_vettori(x0,n);
yold=uguaglianza_vettori(y0,n);
cont++;
}while(err>=eps&&cont<nmax);
return cont;
}

Elettrotecnica e non solo (admin)
Un gatto tra gli elettroni (IsidoroKZ)
Esperienza e simulazioni (g.schgor)
Moleskine di un idraulico (RenzoDF)
Il Blog di ElectroYou (webmaster)
Idee microcontrollate (TardoFreak)
PICcoli grandi PICMicro (Paolino)
Il blog elettrico di carloc (carloc)
DirtEYblooog (dirtydeeds)
Di tutto... un po' (jordan20)
AK47 (lillo)
Esperienze elettroniche (marco438)
Telecomunicazioni musicali (clavicordo)
Automazione ed Elettronica (gustavo)
Direttive per la sicurezza (ErnestoCappelletti)
EYnfo dall'Alaska (mir)
Apriamo il quadro! (attilio)
H7-25 (asdf)
Passione Elettrica (massimob)
Elettroni a spasso (guidob)
Bloguerra (guerra)

?
.
:
e così via finché 
, ha 
, due vettori reali a
) nel modo seguente:

(norma infinito)
o se 
