Составители:
// Инвариант: минор матрицы в столбцах 0..j-1
// уже приведен к ступенчатому виду, и строка
// с индексом i-1 содержит ненулевой эл-т
// в столбце с номером, меньшим чем j
// Ищем максимальный элемент в j-м столбце,
// начиная с i-й строки
r = 0.0;
for (k = i; k < m; ++k) {
if (fabs(a[k*n + j]) > r) {
l = k; // Запомним номер строки
r = fabs(*(a+k*n + j)); // и макс. эл-т
}
}
if (r <= eps) {
// Все элементы j-го
столбца по абсолютной
// величине не превосходят eps.
// Обнулим столбец, начиная с i-й строки
for (k = i; k < m; ++k) {
*(a+k*n + j) = 0.0;
}
++j; // Увеличим индекс столбца
continue; // Переходим к следующей итерации
}
if (l != i) {
// Меняем местами i-ю и l-ю строки
for (k = j; k < n; ++k) {
r = a[i*n + k];
*(a+i*n + k) = *(a+l*n + k);
*(a+l*n + k) = (-r); // Меняем знак строки
}
}
// Утверждение: fabs(*(a+i*n + k)) > eps
// Обнуляем j-й столбец, начиная со строки i+1,
// применяя элем. преобразования второго рода
for (k = i+1; k < m; ++k) {
r = (-(*(a+k*n + j)) / *(a+i*n + j));
// К k-й
строке прибавляем i-ю, умноженную на r
*(a+k*n + j) = 0.0;
for (l = j+1; l < n; ++l) {
*(a+k*n + l) += r * (*(a+i*n + l));
}
}
++i; ++j; // Переходим к следующему минору
}
return i; // Возвращаем число ненулевых строк
}
Приведем два примера работы этой программы. В первом случае вводится вырожденная матрица размера 4 ×
4:
Введите размеры матрицы n, m: 4 4
Введите элементы матрицы:
1 2 3 4
4 3 2 1
5 6 7 8
8 7 6 5
Страницы
- « первая
- ‹ предыдущая
- …
- 48
- 49
- 50
- 51
- 52
- …
- следующая ›
- последняя »
