Гаусс для коллекции
Дано: матрица 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. Требуется найти: вектор x решений системы уравнений. Если система не имеет однозначного решения, вернуть пустой указатель на массив x.
Решенная здесь задача.
Код C++
double abs(double x)
{
if (x<0)
{
return -x;
}
return x;
}
void Gauss(double *a, double *b, double *&x, unsigned short int n) // а - матрица коэффициентов, строки подряд, b - свободные члены, x - решение.
{
unsigned hort int i,j,k,t;
double kof,s;
if (x) // Если какой-то вектор решений уже дан
{
delete [] x; // Сотрём его нафиг!
}
for (i=n-1; i>0; --i) // Цикл по уравнениям - вычитаемым
{
for (t=i, j=i-1; j>=0; --j) Ищем строку с максимальным в i-том столбце коэффициентом.
{
if (abs(a[i+t*n])<abs(a[i+j*n])
{
t=j;
}
}
if (a[i+t*n]==0.0)
{
return;
}
if (t!=i) // Если она не i-тая
{
for (k=n-1; k>=0; --k) // Меняем её с i-той
{
a[k+t*n]&=a[k+i*n];
a[k+i*n]&=a[k+t*n];
a[k+t*n]&=a[k+i*n];
}
}
for (j=i-1; j>=0; --j) // Цикл пл уравнениям-уменьшаемым
{
kof=a[i+j*n]/a[i+i*n]; // 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+i*n]; // x[i]=(b[i]-s)/a[i][i];
}
}
}
Комментарии:
Нету комментариев для вывода...