/*Programma C++ strutturato in funzioni che acquisisce da tastiera un numero intero n tale che 0<n<=50,genera in modo casuale la matrice A appartenente ad R^(nxn)
con elementi appartenenti all'intervallo dell'asse reale [-1,1],costruisce il vettore b contenente elemento per elemento la somma delle componenti della
corrispondente riga di A,risolve il sistema lineare Ax=b con il metodo di eliminazione di Gauss con riordinamento pivotale,e stampa sul video le componenti del
vettore soluzione x (che dovrebbe avere tutte componenti uguali a 1)*/
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<time.h> //per inizializzare a zero il generatore di numeri casuali
#define MAXDIM 50 //massimo ordine della matrice A e del vettore colonna b
typedef double matrice[MAXDIM][MAXDIM];
typedef double vettore[MAXDIM];
void letturaecontrollodimensione(int&);
void costruzionematrice(matrice,int);
void stampamatrice(matrice,int);
void costruzionevettore(vettore,matrice,int);
void stampavettore(vettore,int);
void riduzionegauss(matrice,vettore,int);
int ricercapivot(matrice,int,int);
void modulo(matrice,matrice,int);
int main(){
printf("Programma C++ che legge un numero 0<n<=50,genera casualmente la matrice A di ordine n con elementi reali casuali compresi in [-1,1],costruisce il vettore b in cui ogni elemento e' somma delle componenti della corrispondente riga di A,risolve il sistema lineare Ax=b col metodo di Gauss con riordinamento pivotale e stampa le componenti del vettore soluzione x\n");
int n;
matrice A={0};
costruzionematrice(A,n);
printf("La matrice A[%d][%d] con elementi reali casuali appartenenti a [-1,1] e':\n",n,n);
stampamatrice(A,n);
vettore b={0};
costruzionevettore(b,A,n);
printf("\n\nIl vettore b[%d] i cui elementi sono le somme delle componenti di ogni riga della matrice A[%d][%d] e':\n\n",n,n,n);
stampavettore(b,n);
return 0;
}
//Lettura dimensione della matrice A e del vettore dei termini noti b e controllo che sia compresa tra 0(escluso)e 50(incluso):
void letturaecontrollodimensione(int &d){
do {printf("Inserire un numero intero 0<n<=50:\n"); scanf("%d",&d);} while(d<0||d>MAXDIM);
return;
}
//Costruzione della matrice con numeri random reali appartenenti all'intervallo [-1,1]:
void costruzionematrice(matrice a,int d){
for(int i=0;i<d;i++){
for(int j=0;j<d;j++)
{a[i][j]=(rand()%3-1);
}
}
return;
}
//Stampa della matrice sopra definita:
void stampamatrice(matrice a,int d){
for(int i=0;i<d;i++){printf("\n");
for(int j=0;j<d;j++){
printf("%lf\t",a[i][j]);
}
}
return;
}
//Costruzione del vettore in cui ogni elemento è la somma delle componenti della corrispondente riga della matrice A:
void costruzionevettore(vettore b,matrice a,int d){
for(int i=0;i<d;i++)
{
for(int j=0;j<d;j++)
{
b[i]+=a[i][j];
}
}
return;
}
//Stampa di un vettore:
void stampavettore(vettore b,int d){
for(int i=0;i<d;i++)
{printf("%lf\t",b[i]);}
return;
}
//Metodo della riduzione di Gauss(con riordinamento pivotale)applicato al sistema lineare Ax=b,per risolverlo:
/*void riduzionegauss(matrice a,vettore b,int d)
{
double m[MAXDIM][MAXDIM-1];/*matrice in cui si inseriscono i coefficienti moltiplicatori m[i][k]:ha N-1 colonne(si moltiplica per questi coefficienti a partire dalla
seconda riga della matrice originaria e dalla seconda componente del vettore dei termini noti,e poi via via le altre)
for(int k=0;k<d-1;k++) ordine della riduzione delle righe:in particolare,partendo dalla riga successiva alla prima(che è la riga 0)si eseguono operazioni sulle
rimanenti righe,per d-1 volte(e arrivando quindi all'ordine (d-2) compreso)
{int k_pivot=ricercapivot(a,);
for(int i=k+1;i<d;i++) //si parte considerando la "sottomatrice" della matrice di partenza(per far annullare gli elementi sotto la k-esima colonna)
{m[i][k]=a[i][k]/a[k][k]; //calcolo del moltiplicatore di ogni k-esima riga(della matrice di partenza e di ogni sottomatrice che si creerà dopo)
for(int j=k+1;j<d;j++)
{
a[i][j]=a[i][j]-m[i][k]*a[k][j];/*calcolo dell'elemento a[i][j] della matrice ridotta, al passo k-esimo:gli elementi sotto la prima colonna di ogni
sottomatrice dovranno annullarsi*/
// }
//v[i]=v[i]-m[i][k]*v[k]; //calcolo dell'elemento v[i] della colonna dei termini noti ridotta, al passo k-esimo
// }
// }
//return;
//}
//Modulo di ogni elemento della matrice(serve per calcolare i moduli degli elementi ad ogni passo della riduzione,per scambiare eventualmente le righe coi pivot):
void modulo(matrice a,matrice assoluta,int d)
{
for(int i=0;i<d;i++)
for(int j=0;j<d;j++)
{if (a[i][j]<0) assoluta[i][j]=-1*a[i][j];
else assoluta[i][j]=a[i][j];
}
return;
}
//Ricerca dei pivot:
int ricercapivot(matrice a,int d,int k)
{ double assoluta[d][d];
modulo(a,assoluta,d);
double mk,max;
int indice_pivot=k;
for(int i=k+1;i<d;i++){
max=modulo(a[k][k],d);
mk=modulo(a[i][k],d);
if(mk>max)
{max=mk;
indice_pivot=i;
}
}
return indice_pivot;
}
/*
//Funzione scambio di due righe di una matrice:
void scambia(int &x,int &y){
}
*/