Дано: матрица 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];
}
}
}