我使用矩阵nxn的总旋转来编程高斯消除,但是当我解决系统时,它出现了很多错误(如果解决方案是5.23,它会写我4.88,因为例)。数字是近似的,但不正确。我认为错误在高斯消除代码中,而不是在系统的解决方案中(向后和向前替换)。无论如何,我会发布它,也许我错了,错误在那里:
void eliminaciogaussianapivotatgetotal(int n, double a[][max], double m[][max], double p[][max], double q[][max])
{
int i,j,k,c,f;
double l,t,auxi;
for(k=0;k<(n-1);k++)
{
f=k;
c=k;
for (i=k;i<n;i++)
{
for (j=k;j<n;j++)
{
if (fabs(a[i][j])>a[f][c])
{
f=i;
c=j;
}
}
}
printf("%d,%d\n",f,c);
for (j=0;j<n;j++) //Canvia la fila de la matriu introduïda
{
l=0.;
l=a[k][j];
a[k][j]=a[f][j];
a[f][j]=l;
}
for (j=0;j<n;j++) //Canvia la fila de la matriu P
{
t=0;
t=p[k][j];
p[k][j]=p[f][j];
p[f][j]=t;
}
for (i=0; i<n; i++)//Canvia la columna de la matriu introduïda
{
l=0;
l=a[i][k];
a[i][k]=a[i][c];
a[i][c]=l;
}
for (i=0; i<n; i++)//Canvia la columna de la matriu Q
{
t=0;
t=q[i][k];
q[i][k]=q[i][c];
q[i][c]=t;
}
if (fabs(a[k][k])<=tol)//Algun pivot pel camí és 0.
{
printf("____________________________________________________\n");
printf("ERROR: S'ha trobat un pivot massa petit o 0.\n");
exit(0);
}
for(i=k+1;i<n;i++)
{
auxi=0;
auxi=(a[i][k]/a[k][k]);
for (j=k; j<n; j++)
{
a[i][j]=a[i][j]-(auxi*a[k][j]);
}
m[i][k]=auxi;
}
if (k>0)
{
for (j=0;j<n;j++) //Canvia la fila de la matriu introduïda
{
l=0;
l=m[k][j];
m[k][j]=m[f][j];
m[f][j]=l;
}
for (i=0;i<n;i++) //Canvia la fila de la matriu introduïda
{
l=0;
l=m[i][k];
m[i][k]=m[i][c];
m[i][c]=l;
}
}
}
// if(fabs(a[n-1][n-1])<=tol) //El sistema no és CD (no té solució o en té infinites).
// {
// printf("____________________________________________________\n");
// printf("ERROR: La matriu no és invertible => El sistema no té solució única!\n");
// exit(0);
// }
}
这里是向前和向前的替代:
void resoluciosistematriangularinferior(int n, double a[][max], double b[], double x[])
{
int i, j;
double sum;
x[0]=b[0]/a[0][0];
for (i=1; i<n; i++)
{
sum=0;
for(j=0; j<i; j++)
{
sum=sum+((a[i][j])*(x[j]));
}
x[i]=1/a[i][i]*(b[i]-sum);
}
}
void resoluciosistematriangularsuperior(int n, double a[][max], double b[], double x[])
{
int i, j;
double sum;
x[n-1]=b[n-1]/a[n-1][n-1];
for (i=(n-2); i>=0; i--)
{
sum=0;
for(j=i+1; j<n; j++)
{
sum=sum+((a[i][j])*(x[j]));
}
x[i]=1/a[i][i]*(b[i]-sum);
}
}
所有矩阵都声明为nameofmatrix [max] [max],其中max是预处理器上的150的定义。谢谢你的帮助,我不知道该怎么做。