Меню
Главная
Случайная статья
Настройки
|
Метод Гаусса — Жордана (метод полного исключения неизвестных) — метод, который используется для решения квадратных систем линейных алгебраических уравнений, нахождения обратной матрицы, нахождения координат вектора в заданном базисе или отыскания ранга матрицы. Метод является модификацией метода Гаусса. Назван в честь К. Ф. Гаусса и немецкого геодезиста и математика Вильгельма Йордана[1].
Содержание
Алгоритм- Выбирают первый слева столбец матрицы, в котором есть хоть одно отличное от нуля значение.
- Если самое верхнее число в этом столбце ноль, то меняют всю первую строку матрицы с другой строкой матрицы, где в этой колонке нет нуля.
- Все элементы первой строки делят на верхний элемент выбранного столбца.
- Из оставшихся строк вычитают первую строку, умноженную на первый элемент соответствующей строки, с целью получить первым элементом каждой строки (кроме первой) ноль.
- Далее проводят такую же процедуру с матрицей, получающейся из исходной матрицы после вычёркивания первой строки и первого столбца.
- После повторения этой процедуры раз получают верхнюю треугольную матрицу
- Вычитают из предпоследней строки последнюю строку, умноженную на соответствующий коэффициент, с тем, чтобы в предпоследней строке осталась только 1 на главной диагонали.
- Повторяют предыдущий шаг для последующих строк. В итоге получают единичную матрицу и решение на месте свободного вектора (с ним необходимо проводить все те же преобразования).
Расширенный алгоритм для нахождения обратной матрицы
Пусть дано:
Прямой ход (алгоритм образования нулей под главной диагональю)- Разделим первую строку матрицы А на получим: , j — столбец матрицы А.
- Повторяем действия для матрицы I, по формуле: , s — столбец матрицы I
- Получим:
- Будем образовывать 0 в первом столбце :
- Повторяем действия для матрицы І, по формулам :
- Получим:
- продолжаем выполнять аналогичные операции, используя формулы :
- при условии, что
- Повторяем действия для матрицы І, по формулам :
- при условии, что
- Получим :
Обратный ход (алгоритм образования нулей над главной диагональю)
Используем формулу: , при условии, что
Повторяем действия для матрицы І, по формуле : , при условии, что
Окончательно получаем :
Пример
Для решения следующей системы уравнений:
Запишем её в виде матрицы 34, где последний столбец является свободным членом:
Проведём следующие действия:
- К строке 2 добавим: 4 Строку 1.
- К строке 3 добавим: 9 Строку 1.
Получим:
- К строке 3 добавим: 3 Строку 2.
- Строку 2 делим на 2
- К строке 1 добавим: 1 Строку 3.
- К строке 2 добавим: 3/2 Строку 3.
- К строке 1 добавим: 1 Строку 2.
В правом столбце получаем решение:
- .
Реализация алгоритма на языке программирования C#namespace Gauss_Jordan_Method
{
class Maths
{
/// <summary>
/// Метод Гаусса-Жордана (Обратная матрица)
/// </summary>
/// <param name="Matrix">Начальная матрица</param>
/// <returns></returns>
public static double[,] GaussJordan(double[,] Matrix)
{
int n = Matrix.GetLength(0); //Размерность начальной матрицы
double[,] xirtaM = new double[n, n]; //Единичная матрица (искомая обратная матрица)
for (int i = 0; i < n; i++)
xirtaM[i, i] = 1;
double[,] Matrix_Big = new double[n, 2*n]; //Общая матрица, получаемая скреплением Начальной матрицы и единичной
for (int i = 0; i < n; i++)
for (int j = 0; j < n; j++)
{
Matrix_Big[i, j] = Matrix[i, j];
Matrix_Big[i, j + n] = xirtaM[i, j];
}
//Прямой ход (Зануление нижнего левого угла)
for (int k = 0; k < n; k++) //k-номер строки
{
for (int i = 0; i < 2*n; i++) //i-номер столбца
Matrix_Big[k, i] = Matrix_Big[k, i] / Matrix[k, k]; //Деление k-строки на первый член !=0 для преобразования его в единицу
for (int i = k + 1; i < n; i++) //i-номер следующей строки после k
{
double K = Matrix_Big[i, k] / Matrix_Big[k, k]; //Коэффициент
for (int j = 0; j < 2*n; j++) //j-номер столбца следующей строки после k
Matrix_Big[i, j] = Matrix_Big[i, j] - Matrix_Big[k, j] * K; //Зануление элементов матрицы ниже первого члена, преобразованного в единицу
}
for (int i = 0; i < n; i++) //Обновление, внесение изменений в начальную матрицу
for (int j = 0; j < n; j++)
Matrix[i, j] = Matrix_Big[i, j];
}
//Обратный ход (Зануление верхнего правого угла)
for (int k = n - 1; k > -1; k--) //k-номер строки
{
for (int i = 2*n - 1; i > -1; i--) //i-номер столбца
Matrix_Big[k, i] = Matrix_Big[k, i] / Matrix[k, k];
for (int i = k - 1; i > -1; i--) //i-номер следующей строки после k
{
double K = Matrix_Big[i, k] / Matrix_Big[k, k];
for (int j = 2*n - 1; j > -1; j--) //j-номер столбца следующей строки после k
Matrix_Big[i, j] = Matrix_Big[i, j] - Matrix_Big[k, j] * K;
}
}
//Отделяем от общей матрицы
for (int i = 0; i < n; i++)
for (int j = 0; j < n; j++)
xirtaM[i, j] = Matrix_Big[i, j + n];
return xirtaM;
}
}
}
Примечания
- Транскрипция фамилии Йордан как «Жордан» является ошибочной, но она общепринята и встречается в большинстве русскоязычных источников.
Литература
Ссылки
|
|