На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Модераторы: Qraizer, Hsilgos
  
> Метод Гаусса, Крамера, Матричный... вопросы
    Помогите, друг попросил написать,а я не мыслю в высшей математике, я уже нашёл кучу функций как реализовывать эти методы(кроме Матричного), но там нету комментов и я многого не понимаю... мне желательно с комментами, или если можете прокоментируйте функции ниже:

    Для нахождения определителя
    ExpandedWrap disabled
      double Matrix::det(double **p, int n)
      {
        if(n==1) return **p;  
        double d=0;
       
        double **add = new double*[n-1];  
          for(int i=0; i<n-1; i++) add[i] = new double[n-1];  
       
        for(int i=0; int m=n>i; i++) {
          for(int y=1; y<n; y++) {
            for(int x=0; x<n; x++) {
              if(x==i) continue;
              if(x<i) add[x][y-1] = p[x][y];
              else add[x-1][y-1] = p[x][y];
       
            }
          }
       
          if(i%2)
              d -= p[i][0]*det(add, n-1);
          else
              d += p[i][0]*det(add, n-1);
        }
        return d;
      }



    Метод Гаусса реализованный в классе
    ExpandedWrap disabled
      void Matrix::GaussProc()
      {
          int i,j,k;
          double l;
       
          for(k=0;k<M-1;k++)
          {
              Memo->Lines->Add("Перестановка столбца "+IntToStr(k+1));
              //PrintMatrix();
              Permutation(k);
              PrintMatrix();
              for(i=k+1;i<M;i++)
              {
                  l=Data[i][k]/Data[k][k];
       
                  for(j=k;j<N;j++)
                  {
                      Data[i][j]=Data[i][j]-Data[k][j]*l;
                  }
              }
          }
       
      }
       
       
      void Matrix::ExtractX(Matrix &X)
      {
          X.SetSize(M,1);
          for(int i=M-1,j;i>=0;i--)
          {
              X.Data[i][0]=Data[i][N-1];
       
              for(j=M-1;j>i;j--)
              {
                  X.Data[i][0]-=(Data[i][j]*X.Data[j][0]);
              }
       
              X.Data[i][0]/=Data[i][i];
          }
      }
       
       
      void Matrix::Permutation(int k)
      {
          int i,Max=k;
          for(i=k+1;i<M;i++)
          {
              if(fabs(Data[i][k])>fabs(Data[Max][k]))Max=i;
          }
       
          if(Max!=k)
          {
              double *Tmp=Data[Max];
              Data[Max]=Data[k];
              Data[k]=Tmp;
              sgn=-sgn;
          }
      }


    Буду очень сильно благодарен, было бы неплохо функцию по нахождению определителя не рекурсивным методом(с комментами)
      Цитата Shedy @
      Буду очень сильно благодарен, было бы неплохо функцию по нахождению определителя не рекурсивным методом(с комментами)

      По сути применяешь к матрице алгоритм Гауса, точнее прямой алгоритм т.е. приводишь матрицу к верхнетреугольному виду (все элементы ниже главной диагонали - нули) и определитель равен произведению элементов на главной диагонали.
      0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
      0 пользователей:


      Рейтинг@Mail.ru
      [ Script execution time: 0,0209 ]   [ 16 queries used ]   [ Generated: 23.04.24, 21:49 GMT ]