Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
с++ / Книги / 067695_8BAE5_lekcii_po_c.pdf
Скачиваний:
104
Добавлен:
19.04.2015
Размер:
3.93 Mб
Скачать

delete [] a[i];

delete [] a; delete [] b; delete [] x; }

7.2.Вычисление обратной матрицы методом Гаусса

ЗАДАЧА 7.2. Найти обратную матрицу к квадратной матрицы A(N,N).

 

a00

a01 ...

a0n1

 

A=

a10

a11 ...

a1n1

(7.5)

a20

a21 ...

a2n1

 

an10

...

an1n1

 

Найти матрицу A–1:

an11 ...

 

 

 

 

 

 

y00

y01 ...

y0n1

 

A-1=

y10

y11 ...

y1n1

(7.6)

 

yn10

...

yn1n1

 

 

yn11 ...

 

Матрица (7.6) будет обратной к матрице (7.5), если выполняется соотношение

A A−1=E ,

где Е – это единичная матрица, или подробнее:

 

a00

a01 ...

a0n1

 

y00

y01 ...

y0n1

 

1

0

...

0

 

 

 

 

 

 

a10

a11 ...

a1n1

 

 

y10

y11 ...

y1n1

 

 

0

1

...

0

 

a20

a21 ...

a2n1

 

× y20

y21 ...

y2n1

 

= 0

0

...

1

 

 

...

 

 

 

 

...

 

 

 

0

...

 

1

an10

an11 ...

an1n1

 

yn10

yn11 ...

yn1n1

 

0

...

Умножение матрицы (7.5) на нулевой столбец матрицы (7.6) даст нулевой столбец единичной матрицы:

a00 y00 a01 y10 ... a0n1 yn10=1 a10 y00 a11 y10 ... a1n1 yn10=0

...

an10 y00 an11 y10 ... an1n1 yn10=0

Система, полученная в результате умножения матрицы (7.5) на i-й столбец матрицы (7.6), будет выглядеть так:

a00 y0i a01 y1i ... a0n1 yn1i =0 a10 y0i a11 y1i ... a1n1 yn1i=0

...

ai0 y0i ai1 y1i ... a¿1 yn1i=1

...

an10 y0i an11 y1i ... an1n1 yn1i=0

28

А n-я система будет иметь вид:

a00

y0n1 a01

y1n1 ... a0n1 yn1n1=0

 

a10

y0n1 a11

y1n1 ... a1n1 yn1n1=0

.

 

 

...

 

 

 

an10 y0n1 an11 y1n1 ... an1n1 yn1n1=1

Алгоритм нахождения обратной матрицы представлен в виде блок-схемы на рис. 7.5. Блоки 2–5 отражают формирование столбца единичной матрицы. Если условие 3 выполняется и элемент находится на главной диагонали, то он равен единице, все остальные элементы нулевые. В блоке 6 происходит вызов подпрограммы для решения системы уравнений методом Гаусса. В качестве параметров в эту подпрограмму передается исходная матрица А, сформированный в пунктах 2–5 вектор свободных коэффициентов В, размерность системы n. Вектор X будет решением i-ой системы уравнений и, следовательно, i- ым столбцом искомой матрицы Y.

1

 

 

i=0; i<n; i++

 

 

1

 

2

 

 

j=0; j<n; j++

 

3

j=i

-

 

 

+

5

4

 

Bj = 1

Bj = 0

 

 

6

GAUSS(A,n,B,X)

7 j=0; j<n; j++

8

Yji = Xj

Рис 7.5. Блок-схема нахождения обратной матрицы

int SLAU(double **matrica_a, int n, double *massiv_b, double *x)

{

int i,j,k,r;

double c,M,max,s, **a, *b; a=new double *[n];

for(i=0;i<n;i++) a[i]=new double[n];

29

b=new double [n]; for(i=0;i<n;i++)

for(j=0;j<n;j++) a[i][j]=matrica_a[i][j];

for(i=0;i<n;i++) b[i]=massiv_b[i];

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;}

for(j=0;j<n;j++)

{c=a[k][j];

a[k][j]=a[r][j];

a[r][j]=c; }

c=b[k]; b[k]=b[r]; b[r]=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]; b[i]-=M*b[k];

}

}

if (a[n-1][n-1]==0) if(b[n-1]==0) return -1; else return -2;

else {for(i=n-1;i>=0;i--)

{for(s=0,j=i+1;j<n;j++)

s+=a[i][j]*x[j]; x[i]=(b[i]-s)/a[i][i];

}return 0; } for(i=0;i<n;i++) delete [] a[i]; delete [] a;

delete [] b;

}

int INVERSE(double **a, int n, double **y)

{int i,j,res; double *b, *x; b=new double [n]; x=new double [n]; for(i=0;i<n;i++) {for(j=0;j<n;j++)

30

if (j==i)

b[j]=1; else

b[j]=0;

res=SLAU(a,n,b,x);

 

if (res!=0) break;

 

 

elsefor(j=0;j<n;j++)

 

}

 

y[j][i]=x[j];

 

 

 

delete [] x;

 

 

 

delete [] b;

 

return -1;

 

if (res!=0)

 

 

else

return 0;}

 

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]; b=new double *[N]; for(i=0;i<N;i++)

b[i]=new double[N]; cout<<"Input Matrix A"<<endl; for(i=0;i<N;i++)

for(j=0;j<N;j++)

cin>>a[i][j];

result=INVERSE(a,N,b); if (result==0)

{cout<<"Inverse matrix"<<endl; for(i=0;i<N;cout<<endl,i++)

for(j=0;j<N;j++)

cout<<b[i][j]<<"\t";

}

else cout<<"No Inverse matrix"<<endl; for(i=0;i<N;i++)

delete [] a[i]; delete [] a; for(i=0;i<N;i++)

delete [] b[i]; delete [] b;

}

7.3. Вычисление определителя методом Гаусса

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

Для верхнетреугольной матрицы определитель вычисляется как

n−1

произведение элементов , лежащих на главной диагонали det A=aii .

i=0

31

Поэтому матрицу вначале преобразуем к верхнетреугольному виду, а затем

найдем произведение элементов на главной диагонали.

Преобразование матрицы (7.2) к виду (7.3) можно осуществить с помощью

прямого хода метода Гаусса. Алгоритм вычисления определителя матрицы,

изображенный в виде блок-схемы на рис. 7.6, представляет собой алгоритм

прямого хода метода Гаусса, в процессе выполнения которого проводится

перестановка строк матрицы.

 

 

 

1

 

 

 

 

Determinant(a,n)

 

 

 

 

 

 

15

 

 

2 det=1

 

i=0; i<n; i++

 

 

 

 

16

17

 

3

 

det*=a[i][i]

 

 

 

Конец

 

k=0; k<n; k++

 

 

 

 

4

 

 

 

 

max=|a[k][k]|

 

 

 

 

r=k

 

 

 

 

5 i=k+1,n

 

 

12

 

8

r!=k

 

i=k+1; i<n;i++

 

6

 

 

13

-

|a[i][k]|>max

+

 

 

M=a[i][k],j=k;j<n;j++

 

 

 

 

9

-

14

 

+

det=-det

a[i][j]-=M a[k][j]

 

 

 

 

 

7

 

 

 

 

max:=|a[i][k]|

 

 

 

 

r:=i

 

 

 

 

10

 

 

 

 

j=0; j<n; j++

 

 

 

 

11

 

 

 

 

c=a[k][j]

 

 

 

 

a[k][j]=a[r][j]

 

 

 

 

a[r][j]=c

 

 

 

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

32

Если строки в матрице поменять местами, то определитель матрицы меняет знак на противоположный. В блок-схеме момент смены знака отражен в блоках 8–9. В блоке 8 определяется, будут ли строки меняться местами, и если ответ утвердительный, то в блоке 9 происходит смена знака определителя. В блоках 15– 16 выполняется непосредственное вычисление определителя путем

перемножения диагональных элементов преобразованной матрицы. double determinant(double **matrica_a, int n)

{int i,j,k,r; double c,M,max,s,det=1, **a; a=new double *[n];

for(i=0;i<n;i++) a[i]=new double[n]; 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)

r=i;

}

{

max=fabs(a[i][k]);

if (r!=k) det=-det;

 

 

for(j=0;j<n;j++)

 

a[r][j]=c; }

{c=a[k][j]; a[k][j]=a[r][j];

 

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]; return det;

}

 

int main()

 

{

 

int result,i,j,N;

 

double **a, b;

cin>>N;

cout<<"N=";

a=new double *[N];

a[i]=new double[N];

for(i=0;i<N;i++)

cout<<"Input Matrix A"<<endl; for(i=0;i<N;i++)

for(j=0;j<N;j++)

cin>>a[i][j];

cout<<"determinant="<<determinant(a,N)<<endl;

for(i=0;i<N;i++) delete [] a[i];

delete [] a;}

33

Соседние файлы в папке Книги