метод гаусса для прямоугольных матриц
много гуглил на эту тему, нашел код для решения матриц размера n на n+1 а что делать если матрица размера к примеру 3 на 10?
double* G(double a[][y], double r[],fstream &Write)
{
double arr[x][y];
double res[x];
for (int i = 0; i < x; i++)
res[i] = r[i];
for (int i = 0; i < x; i++)
{
for (int j = 0; j < x; j++)
{
arr[i][j] = a[i][j];
}
}
double* mas, max;
int k, index;
const double eps = 0.00001; // точность
mas = new double[x];
k = 0;
while (k < x)
{
// Поиск строки с максимальным a[i][k]
max = abs(arr[k][k]);
index = k;
for (int i = k + 1; i < x; i++)
{
if (abs(arr[i][k]) > max)
{
max = abs(arr[i][k]);
index = i;
}
}
// Перестановка строк
if (max < eps)
{
// нет ненулевых диагональных элементов
cout << "Решение получить невозможно из-за нулевого столбца ";
cout << index+1 << " матрицы A" << endl;
Write << "Решение получить невозможно из-за нулевого столбца ";
Write << index + 1 << " матрицы A" << endl;
return 0;
}
for (int j = 0; j < x; j++)
{
double temp = arr[k][j];
arr[k][j] = arr[index][j];
arr[index][j] = temp;
}
double temp = res[k];
res[k] = res[index];
res[index] = temp;
// Нормализация уравнений
for (int i = k; i < x; i++)
{
double temp = arr[i][k];
if (abs(temp) < eps) continue; // для нулевого коэффициента пропустить
for (int j = 0; j < x; j++)
arr[i][j] = arr[i][j] / temp;
res[i] = res[i] / temp;
if (i == k) continue; // уравнение не вычитать само из себя
for (int j = 0; j < x; j++)
arr[i][j] = arr[i][j] - arr[k][j];
res[i] = res[i] - res[k];
}
k++;
}
// обратная подстановка
for (k = x - 1; k >= 0; k--)
{
mas[k] = res[k];
for (int i = 0; i < k; i++)
res[i] = res[i] - arr[i][k] * mas[k];
}
return mas;
}
Ответы (1 шт):
Эта проблема не имеет математического решения.
Число строк в матрице представляет собой число имеющихся у вас уравнений. Количество столбцов - это количество переменных.
Вам нужно иметь по крайней мере столько же уравнений, сколько у вас есть переменных (при условии, что уравнения не являются линейными комбинациями друг друга).
пример:
1 . x + 1 . y = 10
1 . x + 0 . y = 5
У нас есть 2 уравнения и 2 переменные, и система уравнений может быть решена.
пример:
1 . x + 1 . y = 10
Это имеет бесконечные решения (0, 10 и 1, 9 и 0.001, 9.999 и т. д)
Если у вас больше уравнений, чем переменных (при условии, что у вас нет противоречивых уравнений), вы можете получить приближенное решение. Для этого я бы рекомендовал вам посмотреть метод наименьших квадратов.