Метод Гаусса, перемещение строк

Рейтинг: 0Ответов: 1Опубликовано: 05.05.2015

Никак не могу сделать так, чтоб когда ведущий элемент в матрице был равен 0, то надо поменять строки местами (текущую со следующей).

Скину только саму функцию, все раскидано по заголовочным, посмотрите, пожалуйста, где ошибка!

Вся проблема в том,что строки не меняются местами. Заранее спасибо

double *gauss(int n,double **a,double *b)
{
    double d;
    double e;
    double c[4][4];
    double z[4];
    double s,*tmp;
    int i,j,k;

    double *x=(double *)malloc(n*sizeof(double));
    for(i=0;i<n;++i)
    { 
        for(j=0;j<n;++j)
        {
            c[i][j]=a[i][j];
            z[i]=b[i];
        }
    }
    for(i=0;i<n;++i)
    {
        d=a[i][i];
        if (d==0)
        {
            for(j=i+1;j<n;++j)
            {
                if(a[j][i]!=0)
                {
                    tmp=a[i];
                    a[i]=a[j];
                    a[j]=tmp;
                }
            }   
        }
        for(j=0;j<n;++j)
        {
            a[i][j]=a[i][j]/d;
        }
        b[i]=b[i]/d;
        for(k=i+1;k<n;++k)
        {
            e=a[k][i]/a[i][i];
            for(j=i;j<n;j++)
            {
                a[k][j]=a[k][j]-a[i][j]*e;
            }
            b[k]=b[k]-b[i]*e;
        }
        output_matrix(a,n);
    }

    for(i=n-1;i>=0;i--)
    {
        x[i]=b[i];
        for(j=i+1;j<n;++j)
        {
            x[i]=x[i]-x[j]*a[i][j];
        }
    }

    for(i=0;i<n;i++)
    {  
        s=0.0;
        for(j=0;j<n;j++)
        { 
            s+=x[j]*c[i][j];
        }
        printf("\n"); 
        printf("s=%lf=%lf",s,z[i]);
    }
    printf("\nChecking converged\n");
    return x;
    free (x);
}

Ответы

▲ 1Принят

Код вполне правильный, однако здесь надо добавить break:

if (d==0)
{
    for(j=i+1;j<n;++j)
    {
        if(a[j][i]!=0)
        {
            tmp=a[i];
            a[i]=a[j];
            a[j]=tmp;
            // сюда надо добавить break, иначе после первой замены пойдём дальше
        }
    }   
}

А ещё в случае i = n-1 замены не произойдёт. Можно попробовать сделать так:

if (d==0)
{
    for(j=i+1;j%n!=i;++j)
    {
        if(a[j%n][i]!=0)
        {
            tmp=a[i];
            a[i]=a[j%n];
            a[j%n]=tmp;
            break;
        }
    }   
}