1. Trang chủ
  2. » Giáo Dục - Đào Tạo

Tài liệu về Phân tích ma trận

6 2,4K 18
Tài liệu đã được kiểm tra trùng lặp

Đang tải... (xem toàn văn)

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Tiêu đề phân tích ma trận
Trường học trường đại học
Chuyên ngành toán học
Thể loại bài giảng
Định dạng
Số trang 6
Dung lượng 74,5 KB

Nội dung

Tài liệu về Phân tích ma trận

Trang 1

§5 PHÂN TÍCH MA TRẬN

1 Phương pháp Crout: Khi giải hệ phương trình tuyến tính nếu ta gặp một

ma trận tam giác thì việc giải hệ sẽ rất dễ dàng Vì vậy chúng ta tìm cách phân tích ma trận A thành tích của hai ma trận L và R sao cho : A = L.R Để phân tích được, ma trận A phải có các giá trị trụ khác 0 Các ma trận L và R

là các ma trận tam giác dưới (L) và tam giác trên (R).Các hệ số lkk = 1 Ma trận L và R bậc 3 có dạng :

33 32 31

23 22 21

13 12 11

a a a

a a a

a a a

A

1 l l

0 1 l

0 0 1 L

321 31

33

23 22

13 12 11

r 0 0

r r 0

r r r

Chúng ta nhắc lại quy tắc nhân hai ma trận A.B :

33 32 31

23 22 21

13 12 11

a a a

a a a

a a a

33 32 31

23 22 21

13 12 11

c b b

b b b

b b b

33 32 31

23 22 21

13 12 11

c c c

c c c

c c c

với c11= a11b11 + a12b21 + a13b31

c12= a11b12 + a12b22 + a13b32

c13= a11b13 + a12b23 + a13b33

c21= a21b11 + a22b21 + a23b31

Tổng quát :

 n

1

k ik kj

ij a b

c

Dùng quy tắc này cho hai ma trận L và R và cho đồng nhất các hệ số của chúng với ma trận A ta có :

1 l

l

0 1 l

0 0 1

321 31

33

23 22

13 12 11

r 0 0

r r 0

r r r

33 32 31

23 22 21

13 12 11

a a a

a a a

a a a

a11 = 1 r11 + 0.0 + 0.0 = r11 ;

a12 = r12 ; a13 = r13

a21 = l21r11 ;

a22 = l21r12 + r22 ; a23 = l31r11

a31 = l31r11 ; a32 = l31r12 ;

a33 = l31r13 + l32r23 + r33

Một cách tổng quát ta có :

với j > i : lij = rji = 0

với i = 1 : r1j = a1j (j = 1 tới n)

lj1 = aj1/r11 (j = 1 tới n)

với i = 2 tới n

1 i

1

k ik kj ij

Trang 2

1 i

1 k ki jk ji

ji

r

r l a

l

Chương trình phân tích ma trận thành 2 ma trận như sau :

Chương trình 3-7

#include <conio.h>

#include <stdio.h>

#include <math.h>

#include <stdlib.h>

#define max 6

void main()

{

float a[max][max],r[max][max],l[max][max];

int i,j,k,n;

float tr,tl;

clrscr();

printf("Cho bac cua ma tran n = ");

scanf("%d",&n);

printf("Cho cac phan tu cua ma tran can phan tich a\n");

for (i=1;i<=n;i++)

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

{ printf("a[%d][%d] = ",i,j);

scanf("%f",&a[i][j]);

} for (i=1;i<=n;i++)

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

{ l[i][j]=0.0;

r[i][j]=0.0;

} for (i=1;i<=n;i++)

{

r[1][i]=a[1][i];

l[i][i]=1.0;

l[i][1]=a[i][1]/a[1][1];

Trang 3

}

for (k=2;k<=n;k++)

{

for (j=k;j<=n;j++) {

tr=0.0;

for (i=1;i<=k;i++) tr=tr+l[k][i]*r[i][j];

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

}

if (k!=n) {

for (i=1;i<=n;i++) {

tl=0.0;

for (j=1;j<=k-1;j++) tl=tl+l[i][j]*r[j][k];

l[i][k]=(a[i][k]-tl)/r[k][k];

} }

else printf("\n");

}

printf("Ma tran l :\n");

for (i=1;i<=n;i++)

{

for (j=1;j<=n;j++) printf("%15.5f",l[i][j]);

printf("\n");

}

printf("Ma tran r :\n");

for (i=1;i<=n;i++)

{

for (j=1;j<=n;j++) printf("%15.5f",r[i][j]);

printf("\n");

}

getch();

}

Trang 4

Dùng chương trình này phân tích ma trận ta được :

4 6 0 0

4 5 2 0

2 1

2 R 1

6 5 3

0 1 5 1

0 0 1 L 3

5 7

1 1 3

2 1 2

A

2 Phương pháp phân tích Cholesky : Phương pháp Cholesky dùng để

phân tích một ma trận đối xứng sao cho A = RTR với R là một ma trận tam giác trên Cách phân tích cũng tương tự như phương pháp Crout Ta xét các ma trận A và R bậc 3 như sau :

33 32 31

23 22 21

13 12 11

a a a

a a a

a a a

33

23 22

13 12 11

r 0 0

r r 0

r r r R

Tích hai ma trận RT và R là :

33

23 22

13 12 11 T

33

23 22

13 12 11

r 0 0

r r 0

r r r r

0 0

r r 0

r r r

33 32 31

23 22 21

13 12 11

a a a

a a a

a a a

Ta tính được :

r112 = a11

r11r12 = a12

r11r13 = a13

r11r12 = a21

r122 + r22r12 = a22

r222 + r12r13 = a23

r11r13 = a31

r13r12+ r23r21 = a32

r332 + r22r23 + r132 = a23

Tổng quát ta có :

11

ij ij 11 11

a

a s

; a

n i 1 s a

r

1 i 1 k

2 ki ii

j i r

r r a

r

ii

1 i

1 k kj ki ij

rij = 0 (i > j ) Dưới đây là chương trình:

Chương trình 3-8

Trang 5

#include <conio.h>

#include <stdio.h>

#include <math.h>

#include <stdlib.h>

#define max 6

void main()

{

float a[max][max],r[max][max],b[max][max];

int i,j,k,n,l;

clrscr();

printf("Cho bac cua ma tran n : ");

scanf("%d",&n);

printf("Cho cac phan tu cua ma tran can phan tich a :\n");

for (i=1;i<=n;i++)

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

{ printf("a[%d][%d] = ",i,j);

scanf("%f",&a[i][j]);

} for (i=1;i<=n;i++)

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

r[i][j]=0.0;

for (i=1;i<=n;i++)

{

if (a[i][i]<0.0) {

printf("Ma tran khong duong");

getch();

exit(1);

} else {

r[i][i]=sqrt(a[i][i]);

for (j=1+i;j<=n;j++) r[i][j]=a[i][j]/r[i][i];

for (k=i+1;k<=n;k++) for (l=k;l<=n;l++)

a[k][l]=a[k][l]-r[i][k]*r[i][l];

Trang 6

} } printf("\n");

printf("Ma tran chuyen vi cua r\n");

for (i=1;i<=n;i++)

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

b[j][i]=r[i][j];

for (i=1;i<=n;i++)

{

for (j=1;j<=n;j++) printf("%15.5f",b[i][j]);

printf("\n");

}

printf("\n");

printf("Ma tran r\n");

for (i=1;i<=n;i++)

{

for (j=1;j<=n;j++) printf("%15.5f",r[i][j]);

printf("\n");

}

getch();

}

Dùng chương trình này để phân tích ma trận

9 7

6 4

6

7

9 5

7

6 9

6 8

4 5

6 5

7

6 7

8 7

1 0

ta có :

732052

1 0

0 0

0

0 707107

0 0

0 0

414214

1 121320

2 414214

1 0

0

631456

0 316228

0 264911

1 316228

0 0

897367

1 213594

2 529822

2 213594

2 162278

3

R

Ngày đăng: 01/10/2012, 15:33

TỪ KHÓA LIÊN QUAN

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

w