Facciamo così, posto tutto il codice anche se è un po' lunghetto.
Sono convinto che il problema è nella function chiamata nel main, perchè èlì che si blocca, ma non riesco a capire dove!!
#include<stdio.h>
#include<stdlib.h>
void gausspiv(float **A, float *b, int n);
void backsub(float **A, float *b, int n, float *x);
main()
{float **A, *b, *x;
int n; /*dimensione del sistema */
int k; /* indice della prima riga da scambiare */
int i, j;/*variabili locali: servono per i cicli for*/
printf("Inserire la dimensione del sistema n=");
scanf("%d", &n);
/*dichiarazione dinamica della matrice e del vettore termini noti */
A=(float **)calloc(n,sizeof(float *));
for(i=0;i<n;i++)
A[i]=(float *)calloc(n,sizeof(float));
b=(float *)calloc(n,sizeof(float));
x=(float *)calloc(n,sizeof(float));
printf("Inserire gli elementi della matrice\n");
for(i=0; i<n; i++)
for(j=0; j<n; j++)
{printf("A[%d][%d]=", i, j);
scanf("%f", &A[i][j]);};
printf("Inserire gli elementi del vettore termini noti\n");
for(i=0; i<n; i++)
{printf("b[%d]=", i);
scanf("%f", &b[i]);
};
printf("ciao\n");
gausspiv(A, b, n);
backsub(A, b, n, x);
printf("La matrice e il vettore termini noti modificati con\nla strategia del pivoting parziale hanno componenti\n");
for(i=0;i<n;i++)
for(j=0;j<n;j++)
printf("A[%d][%d]=%f \n", i, j, A[i][j]);
for(i=0;i<n;i++)
printf("b[%d]=%f \n", i, b[i]);
printf("La soluzione del sistema modificato secondo la strategia del pivoting è data dal vettore:\n");
for(i=0;i<n;i++)
printf("x[%d]=%f \n", i, x[i]);
}
function 1
void backsub(float **A, float *b, int n, float *x)
{
int i,j;
x[n-1]=b[n-1]/A[n-1][n-1];
for(i=n-2; i>=0; i--)
{
x[i]=b[i];
for(j=i+1; j<n; j++)
x[i]=x[i]-A[i][j]*x[j];
x[i]=x[i]/A[i][i]; /* fa parte del ciclo for di indice i */
}
return;
}
function 2
void piv(float **A, float *b, int n, int k);
void gausspiv(float **A, float *b, int n)
{int i, j, k;
for(k=0;k<n-1;i++)
{
piv(A, b, n, k); /*chiamo la funzione piv sulla riga k-esima */ /*chiamo la function piv nella function gausspiv */
for(i=k+1;i<n;i++)
{
A[i][k]=A[i][k]/A[k][k]; /*creazione di un coefficiente per l'eliminazione */
for(j=k;j<n;j++)
A[i][j]=A[i][j]-A[i][k]*A[k][j]; /*riduzione dei coefficienti */
b[i]=b[i]-A[i][k]*b[k]; /*riduzione dei termini noti */
};
};
return;
}
function 3
#include<math.h>
void piv(float **A, float *b, int n, int k)
{
float t; /*variabile d'appoggio (locale) per scambiare la riga k-esima con la riga r-esima*/
int i, j, r; /*i e j servono per i cicli, r è l'indice della riga con cui effettuare lo scambio */
float max; /*max è il massimo elemento in modulo della colonna k-esima */
max=(fabs(A[k][k]));
r=k;
for(i=k+1;i<n;i++)
{
if(fabs(A[i][k])>max)
{
max=fabs(A[i][k]);
r=i;
};
};
if(r!=k) /*alla fine del ciclo for r=i e potrebbe essere quindi diverso da k */
{
for(j=k;j<n;j++) /*scambio la riga k-esima con la riga r-esima*/
{
t=A[r][j];
A[r][j]=A[k][j];
A[k][j]=t;
};
t=b[r];
b[r]=b[k];
b[k]=t;
};
return;
}
Ovviamente sto parlando dell'algoritmo di Gauss con la strategia del pivoting parziale