Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Центр помощи > [C++] Программа решения СЛАУ методом Жордана-Гаусса


Автор: Reminaru 28.5.2013, 20:21
Ребят, необходимо написать программу для решения СЛАУ методом Жордана-Гассу с выбором ведущего элемента.

Автор: n199a 28.5.2013, 20:30
Код

#include <stdio.h>
#include <conio.h>
#include <math.h>
#include <iostream.h>

main()
{
  clrscr();


  float a[11][11], b[11], x[11], t;
  int i, j, k, m, n;

  n=3;
  a[1][1]= 5.6; a[1][2]= 2.7; a[1][3]=-1.7; b[1]= 1.9;
  a[2][1]= 3.4; a[2][2]=-3.6; a[2][3]=-6.7; b[2]=-2.4;
  a[3][1]= 0.8; a[3][2]= 1.3; a[3][3]= 3.7; b[3]= 1.2;

  cout << "\n\n";
  for (i=1; i<=n; i++)
  {
    for (j=1; j<=n; j++)
      cout << a[i][j] << "  ";
    cout << b[i] << "\n";
  }



   double eps=.000001;
   double max;
   int max_i;
   double lead, a_div_lead;

   for(k=1; k<=n; k++)
   {

      max=0;
      max_i=-1;

      for(int i=k; i<=n; i++)
      {
     if(fabs(a[i][k])>max)
     {
        max=fabs(a[i][k]);
        max_i=i;
     }
      }


      if(max_i==-1 || fabs(a[max_i][k])<eps)
      {
        cout << "\n\n" << "Error: det=0" << "\n\n";
        break;
      }



      lead=a[k][k];

      for(j=k; j<=n; j++)
        a[k][j]/=lead;
      b[k]/=lead;

      for(i=1; i<=n; i++)
      {
        a_div_lead=a[i][k]/a[k][k];

        if(i!=k)
        {
          for(j=k; j<=n; j++)
            a[i][j]-=a[k][j]*a_div_lead;
          b[i]-=b[k]*a_div_lead;
        }
      }
  }

  cout << "\n\n";
  for (i=1; i<=n; i++)
  {
    for (j=1; j<=n; j++)
      cout << a[i][j] << "  ";
    cout << b[i] << "\n";
  }


  getch();
}

Автор: Reminaru 29.5.2013, 12:56
это просто метод Жордана-Гаусса, без ведущего вроде бы элемента

Автор: n199a 30.5.2013, 00:12
Код

public static Row Gauss(Matrix MMG)
{
    int[] mask = new int[MMG.rowCount];
    for (int i = 0; i < MMG.rowCount; i++)
        mask[i] = i;
 
    for (int i = 0; i < MMG.rowCount; i++)
    {
        int Y = i;
        double X = MMG[i,i];
 
        for (int j = i+1; j < MMG.colCount - 1; j++)
            if (Math.Abs(X) < Math.Abs(MMG[i, j]))
            {
                X = MMG[i, j];
                Y = j;
            }
 
        if (X == 0)
        {
            Row x = new Row(MMG.rowCount);
            for (int ii = 0; ii < MMG.rowCount; ii++)
                x[ii] = double.NaN;
            return x;
        }
 
        if (i != Y)
        {
            MMG.ExchangeColumns(i, Y);
            int tmp = mask[i];
            mask[i] = mask[Y];
            mask[Y] = tmp;
        }
 
        MMG[i] = MMG[i] / X;
 
        for (int j = i + 1; j < MMG.rowCount; j++)
            MMG[j] = MMG[j] - MMG[j, i] * MMG[i];
    }
 
    for (int i = MMG.rowCount - 1; i >= 0; i--)
    {
        for (int j = i - 1; j >= 0; j--)
            MMG[j] = MMG[j] - MMG[j, i] * MMG[i];
    }

    Row res = new Row(MMG.rowCount);
    for (int i = 0; i < MMG.rowCount; i++)
        res[mask[i]] = MMG[i, MMG.colCount - 1];
    return res;
}

Автор: bsa 30.5.2013, 11:02
Для домашних заданий, курсовых, существует "Центр Помощи".

Тема перенесена! 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)