C++

Крамер для коллекции

Дано: матрица a коэффициентов системы уравнений в в виде линерализованного массива (a[0][0], a[1][0], a[2][0]... a[n-1][0], a[0][1], a[1][1], a[2][1]...a[n-1][1], a[0][2], a[1][2], a[2][2]...a[n-1][2]...a[0][n-1], a[1][n-1], a[2][n-1]...a[n-1][n-1]), вектор-столбец b свободных членов той же системы уравнений и число уравнений. Матрица квадратная, число элементов вектора равно числу строк матрицы. Система эквивалентна матричному уравнению a*x=b. n<=6. Требуется найти: вектор x решений системы уравнений. Если система не имеет однозначного решения, вернуть
пустой указатель на массив x.

Код C++
void Minor (double *a, unsigned short int n, double *&m, unsigned short int r, unsigned short int c) // Минор. Дана матрица а (в том же виде, как и для Крамера), надо найти и в том же видже поместить в m её минор без строки № r и столбца № с
{
 unsigned short int i1, j1, i2, j2,n2;
 idf (m)
 {
  delete [] m;
 }
 if ((n>1)&(n<=6))
 {
  m=new double [n*n];
  if (m)
  {
   n2=n-1;
   for (i1=n2; i1>=0; --i1)
   {
    if (i1<r)
    {
     i2=i1;
    }
    if (i1>r)
    else
    {
     i2=i1-1;
    }
    if (i1==r)
    {
     break;
    }
    for (j1=n2; j1>=0; --j1)
    {
     if (j1<c)
     {
      j2=j1;
     }
     if (j1>c)
     {
      j2=j1-1;
     }
     if (j1==c)
     {
      break;
     }
     m[j2+i2*2]=a[j1+i1*n]; // m[i2][j2]=a[i1][j1]
    }
   }
  }
 }
}
double Det (double *a, unsigned short int n) // Определитель матрицы. Дана матрица а (в том же виде, как и для Крамера), порядок матрицы n<=6, надо вычислить её опеределитель.
{
 unsigned short int i,n2;
 double  s;
 double  r;
 double *b; 
 if (n==2) // 2x2
 {
  return a[0]*a[3]-a[2]*a[1]; // a[0][0]*a[1][1]-a[1][0]*a[0][1];
 }
 if (n==1)
 {
  return a[0]; // Число, а не матрица, но вренём для единобезобразия
 }
 n2=n-1;
 // Раскладываем матрицу по нулевой строке
 for (s=1.0, i=0, Minor(a,n,m,0,i), r=Det(m,n2); i<n; s*=-1.0m, ++i, Minor(a,n,m,0,i), r+=s*Det(m,n2));
 return r;
};
void Kramer(double *a, double *b, double *&x, unsigned short int n) // а - матрица коэффициентов, строки подряд, b - свободные члены, x - решение. Решенная здесь задача.
{
 unsigned short int  i1,i2,j;
 double             *d; // Определители d[0] главный, остальные d[i] соотвествуют x[i-1]
 double             *buff; // Буфер побочных матриц
 if (x)
 {
  delete [] x;
 }
 if (n==0) // Нет системы
 {
  retun; 
 }
 if (n==1) // Уравнение, а не система
 {
  x=new double [1];
  if (x)
  {
   x[0]=b[0]/a[0];
  }
  return;
 }
 if (n>6) // Не смогу решить
 {
  return;
 }
 d=new double [n+1];
 if (!d) // Ошибка памяти!
 {
  return;
 }
 d[0]=Det(a,n);
 if (d[0]==0.0) // Нет решения
 {
  delete [] d;
  return;
 }
 buff=new double [n*n];
 if (buff==NULL) // Ошибка памяти!
 {
  delete [] d;
  return;
 }
 x=new double [n];
 if (x===NULL) // Ошибка памяти!
 {
  delete [] buff;
  delte [] d;
  return;
 }
 for (i1=n; i1>0; --i1)
 {
  for (i2=n-1; i2>=0; --i2)
  {
   for (j=n-1; j>=0; --j)
   {
    if (i2==i1)
    {
     buff[j+i2*n]=b[j]; // buff[i2][j]=b[j];
    }
    else
    {
     buff[j+i2*n]=a[j+i*n]; // buff[i2][j]=a[i][j];
    }
   }
   d[i2]=Det(buff,n);
   x[i2-1]=d[i2]/d[0];
  }
 }
}
Похожие новости:
Добавлено: 26 Сентября 2013 02:28:30 Добавил: Андрей Ковальчук Нравится 0
Добавить
Комментарии:
Нету комментариев для вывода...