Poichè il vettore soluzioni è costruito con la somma della riga della matrice coefficienti, le x dovrebbero venire tutte uguali a 1, invece ho in output numeri che sembrano completamente casuali.
C++:
/*Programma che legge una dimensione n minore
di 51 e genera una matrice A con elementi random
tra -1 e 1, costruisce il vettore b con la somma
degli elementi delle righe di A e risolve il sistema
lineare con il metodo di Gauss con riordinamento*/
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>
#define N 55
int leggi_dato (int&);
int controllo_dato (int);
void m_random (double [N][N], int);
float random (int, int);
void somma_riga (double [N][N], int, double []);
double modulo (double);
void riordinamento_pivotale (int, double [N][N], int, int, double []);
void Gauss (int , double [N][N], double []);
void sostituzione_indietro (int, double [N][N], double [], double []);
int main(){
int n= leggi_dato (n);
double A[N][N];
m_random (A, n);
double b[N];
somma_riga (A, n, b);
for (int r=0; r<n; r++)
{for (int i=r+1; i<n; i++)
{riordinamento_pivotale (n, A, i, r, b);}}
Gauss (n, A, b);
double x[N];
sostituzione_indietro (n, A, b, x);
return 0;}
int leggi_dato (int&a)
{printf ("Inserire numero minore di 51="); scanf("%d", &a);
if (controllo_dato (a)==0) {printf ("Numero errato"); return 0;}
return a;}
int controllo_dato (int a)
{if (a>50||a<1) return 0; else return 1;}
void m_random (double a[N][N], int n){
int i, j;
int max=1, min=-1;
srand (time(0));
for (i=0; i<n; i++) {for (j=0; j<n; j++) {{a[i][j]=random (max, min);}
printf ("%.2lf\t", a[i][j]); } printf ("\n");}return;}
float random (int max, int min)
{int z=(rand()%(max-min+1))+min;
float y;
return y=z*rand()/(RAND_MAX*1.0);
}
void somma_riga (double a[N][N], int n, double w[N])
{int i, j, s;
for (i=0; i<n; i++) {w[i]=0; for (j=0; j<n; j++) w[i]=w[i]+a[i][j];}
printf ("\nVettore somma righe A="); for (int k=0; k<n; k++) printf ("%.2lf\t", w[k]);
return;}
double modulo (double a)
{if (a<0) return -a;
else return a; }
void riordinamento_pivotale (int n, double a[N][N], int i, int r, double b[N])
{if (modulo (a[r][r])< modulo (a[i][r])) {for (int h=0; h<n;h++){double temp=a[r][h];
a[r][h]=a[i][h]; a[i][h]=temp; double aux=b[h]; b[h]=b[i]; b[i]=aux;}}
return;}
void Gauss (int n, double a[N][N], double b[N])
{double m;
for (int r=0; r<n; r++)
{for (int i=r+1; i<n; i++)
{m=a[i][r]/a[r][r]; a[i][r]=0;
for(int j=r+1; j<n; j++) {a[i][j]=a[i][j]-a[r][j]*m;}
b[i]=b[i]-m*b[i];}}
printf ("\nMatrice a scala="); for (int i=0; i<n; i++) {printf ("\n");
for (int j=0; j<n; j++) printf ("\t%.2lf", a[i][j]);
printf ("\t|%.2lf", b[i]);} return;}
void sostituzione_indietro (int n, double L[N][N], double b[], double x[])
{x[n]=b[n]/L[n][n];
for (int i=n-1; i>=0; i--) {x[i]=b[i]; for (int j=i+1; j<n; j++) {x[i]=x[i]-L[i][j]*x[j];} x[i]=x[i]/L[i][i];}
for (int k=0; k<n; k++) {printf ("\nx%d=%.2lf\n", k+1, x[k]); }
}