Компания ALT Linux
Опубликован: 07.03.2015 | Доступ: свободный | Студентов: 2183 / 522 | Длительность: 24:14:00
Лекция 6:

Статические и динамические матрицы

Задача 6.12. Найти определитель квадратной матрицы A(N,N).

Блок-схема алгоритма вычисления обратной матрицы

Рис. 6.15. Блок-схема алгоритма вычисления обратной матрицы

Пусть задана матрица (6.2), необходимо вычислить её определитель. Для этого матрицу необходимо преобразовать к треугольному виду (6.3), а затем воспользоваться свойством, известным из курса линейной алгебры, которое гласит, что определитель треугольной матрицы равен произведению её диагональных элементов: \det A=\prod\limits_{i=0}^{n-1}a_{ii}.

Преобразование матрицы (6.2) к виду (6.3) можно осуществить с помощью прямого хода метода Гаусса. Алгоритм вычисления определителя матрицы, изображённый в виде блок-схемы на рис. 6.16, представляет собой алгоритм прямого хода метода Гаусса, в процессе выполнения которого проводится перестановка строк матрицы. Эта операция приводит к смене знака определителя. В блок- схеме момент смены знака отражён в блоках 8–9. В блоке 8 определяется, будут ли строки меняться местами, и если ответ утвердительный, то в блоке 9 происходит смена знака определителя. В блоках 15–16 выполняется непосредственное вычисление определителя путём перемножения диагональных элементов преобразованной матрицы.

На листинге приведён текст программы решения задачи 6.12 с комментариями.

#include <iostream>
#include <math.h>
using namespace std;
//Функция вычисления определителя.
double determinant ( double ** matrica_a, int n )
//Формальные параметры: matrica_a — исходная матрица, n — размер матрицы,
//функция возвращает значение определителя (тип double.)
{
	int i, j, k, r;
	double c,M, max, s, det =1;
	//a — копия исходной матрицы.
	double **a;
	//Выделение памяти для матрицы a .
	a=new double * [ n ];
	for ( i =0; i<n; i++)
		a [ i ]=new double [ n ];
	//В a записываем копию исходной матрицы.
	for ( i =0; i<n; i++)
		for ( j =0; j<n; j++)
			a [ i ] [ j ]=matrica_a [ i ] [ j ];
	//Прямой ход метода Гаусса.
	for ( k=0;k<n; k++)
	{
		max=fabs ( a [ k ] [ k ] );
		r=k;
		for ( i=k+1; i<n; i++)
			if ( fabs ( a [ i ] [ k ] )>max)
			{
				max=fabs ( a [ i ] [ k ] );
				r= i;
			}
		//Если строки менялись местами, то смена знака определителя.
		if ( r !=k ) det=-det;
		for ( j =0; j<n; j++)
		{
			c=a [ k ] [ j ];
			a [ k ] [ j ]=a [ r ] [ j ];
			a [ r ] [ j ]= c;
		}
		for ( i=k+1; i<n; i++)
			for (M=a [ i ] [ k ] / a [ k ] [ k ], j=k; j<n; j++)
				a [ i ] [ j ]-=M*a [ k ] [ j ];
	}
	//Вычисление определителя.
	for ( i =0; i<n; i++)
		det*=a [ i ] [ i ];
	//Возврат определителя в качестве результата функции
	for ( i =0; i<n; i++)
		delete [ ] a [ i ];
	delete [ ] a;
	return det;
}
int main ( )
{
	int result, i, j,N;
	double **a, b;
	cout<<" N = ";
	cin>>N;
	a=new double _ [N ];
	for ( i =0; i<N; i++)
		a [ i ]=new double [N ];
	//Ввод значений исходной матрицы.
	cout<<"Ввод матрицы A "<<endl;
	for ( i =0; i<N; i++)
		for ( j =0; j<N; j++)
			cin>>a [ i ] [ j ];
	//Обращение к функции вычисления определителя.
	cout<<"определитель= "<<determinant ( a,N)<<endl;
}
Блок-схема алгоритма вычисления определителя

Рис. 6.16. Блок-схема алгоритма вычисления определителя

В этой главе читатель познакомился с обработкой статических и динамических матриц в C++, а также с использованием функций для решения задач обработки динамических матриц.

Сергей Радыгин
Сергей Радыгин

Символы кириллицы выводит некорректно. Как сделать чтобы выводился читабельный текст на русском языке?

Тип приложения - не Qt,

Qt Creator 4.5.0 основан на Qt 5.10.0. Win7.

 

Юрий Герко
Юрий Герко

Кому удалось собрать пример из раздела 13.2 Компоновка (Layouts)? Если создавать проект по изложенному алгоритму, автоматически не создается  файл mainwindow.cpp. Если создавать этот файл вручную и добавлять в проект, сборка не получается - компилятор сообщает об отсутствии класса MainWindow. Как правильно выполнить пример?