Метод Гаусса

Тема в разделе "C/C++/C#", создана пользователем SpaceSH, 3 апр 2010.

Статус темы:
Закрыта.
  1. SpaceSH

    SpaceSH Гость

    Компилятор Dev-C++
    Прога находит верные корни, но проблема в том что выводит их в порядке не для исходной матрицы,а для преобразованной. Помогите исправить,чтобы массив корней в верной последовательности заполнялся :please:
    Мой ответ: 1.07, -1.14, 0.71, 1.02, -0.48, 0.55, 1.1
    Верный: 1.03, 0.55, -1.14, -0.49, 1.07, 1.1, 0.71


    Код (Text):
    #include <iostream>
    #include <cmath>


    using namespace std;

    void Gauss(double *a, double *b, double *x,int n) // а - матрица коэффициентов, строки подряд, b - свободные члены, x - решение.
    {
    int i,j,k,t;
    double kof,s;
    double temp;
    for (i=n-1; i>0; --i) // Цикл по уравнениям - вычитаемым
    {
    for (t=i, j=i-1; j>=0; --j) //Ищем строку с максимальным в i-том столбце коэффициентом.
    {
    if (fabs(a[i*n+t])<fabs(a[i*n+j]))
    {
    t=j;
    }
    }
    if (a[i*n+t]==0.0)
    {
    return;
    }
    if (t!=i) // Если она не i-тая
    {
    for (k=n-1; k>=0; --k) // Меняем её с i-той
    {
    temp=a[k*n+t];
    a[k*n+t]=a[k*n+i];
    a[k*n+i]=temp;
    }
    }
    for (j=i-1; j>=0; --j) // Цикл пo уравнениям-уменьшаемым
    {
    kof=a[i+j*n]/a[i*n+i]; // kof=a[j][i]/a[i][i];
    for (a[i+j*n]=0.0, b[j]-=b[i]*kof, k=i-1; k>=0; --k) // Цикл по столбцам
    {
    a[k+j*n]-=a[k+i*n]*kof; // a[k][j]-=a[k][i]*kof
    }
    }
    }
    x=new double [n];
    if (x)
    {
    for (i=0; i<n; ++i)
    {
    for (s=0.0, j=i-1; j>=0; --j)
    {
    s+=a[j+i*n]*x[j]; //s+=a[j][i]*x[j]
    }
    x[i]=(b[i]-s)/a[i*n+i]; // x[i]=(b[i]-s)/a[i][i];
    //cout << x[i] << "\n";
    }
    }
    cout << "\n";
    for(int i=0; i<n; i++)
    {
    for(int j=0; j<n; j++)
    {
    cout << a[i*n+j] << " ";
    }
    cout << b[i] << endl;
    }    
    for (i=0; i<n; ++i)
    cout << "x " << x[i] << endl;
    }


    main()
    {

    int n = 7;
    double gauss2[] ={1,5,3,7,6,3,9};
    double M[]={0, 0, 1,0, 2,0, 0,0, 3, 0, -1, 0, 0,4, 0, 0, 5, 0,1,5,3,7,6,3,9, 4,0, 0,4, 0, 6,0, 2, 6, 0, 0, 5, 0,1, 0, 0, 1,5,3,7,6,3,9,0, 0, 0 };

    double *y = new double[n];

    /* for(int i=0; i<n; i++)
    {
    for(int j=0; j<n; j++)
    {
    //cin >> M[i+j*n];
    M[i+j*n] = rand()/100;
    //cout << "gauss1["<< i << "][" << j << "]=";
    //cin >> gauss1[i][j];
    }
    }
    */
    for(int i=0; i<n; i++)
    {
    for(int j=0; j<n; j++)
    {
    cout << M[i*n+j] << " ";
    }
    cout << gauss2[i] << endl;
    }    
    Gauss(M,gauss2,y,n);
    cin.get();
    }
    (Мне подсказали, что надо учитывать порядок перестановок строк и столбцов(???) в матрице "a" и потом как-то востановить верный порядок корней, но как это реализовать??? и работает ли такой способ вообще может есть более эффективный?)
    Заранее Спасибо
     
  2. Xakep

    Xakep Гость

    попробуй поменять местами i и j
    Ну можно использовать пиксельный шейдер, но это нужно использовать OGL или DX
     
  3. SpaceSH

    SpaceSH Гость

    Если менять местами i и j то он будет фигню всякую выводить, т.к получится что Метод Гаусса будет работать по столбцам, а не по строкам
    И причем тут пиксельный шейдер :please: ? у меня ведь не графика...
     
  4. Xakep

    Xakep Гость

    понятно =) просто посмотрел на тему, и подумал что тебе нужно изображение заблюрить )))
     
Загрузка...
Похожие Темы - Метод Гаусса
  1. kobrin13
    Ответов:
    0
    Просмотров:
    1.271
  2. Krex
    Ответов:
    0
    Просмотров:
    1.474
  3. Krex
    Ответов:
    1
    Просмотров:
    1.574
  4. DeuS7
    Ответов:
    0
    Просмотров:
    77
  5. rrrFer
    Ответов:
    0
    Просмотров:
    291
Статус темы:
Закрыта.

Поделиться этой страницей