Основы программирования



              

Пример: приведение матрицы к ступенчатому виду методом Гаусса - часть 5


i = 0; j = 0; while (i < m && j < n) { // Инвариант: минор матрицы в столбцах 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:

Введите размеры матрицы m, n: 4 4 Введите элементы матрицы: 1 2 3 4 4 3 2 1 5 6 7 8 8 7 6 5 Введите точность вычислений eps: 0.00001 Ступенчатый вид матрицы: 8.000 7.000 6.000 5.000 0.000 1.625 3.250 4.875 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 Ранг матрицы = 2 Определитель матрицы = 0.000

Во втором случае вводится матрица размера 3 ? 4 максимального ранга:

Введите размеры матрицы m, n: 3 4 Введите элементы матрицы: 1 0 2 1 2 1 0 -1 1 0 1 0 Введите точность вычислений eps: 0.00001 Ступенчатый вид матрицы: 2.000 1.000 0.000 -1.000 0.000 0.500 -2.000 -1.500 0.000 0.000 -1.000 -1.000 Ранг матрицы = 3




Содержание  Назад  Вперед