Hàm đa thức - Chương 3: Các vấn đề về ma trận (Phần 2)

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 :

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

 

doc7 trang | Chuyên mục: Giải Tích | Chia sẻ: tuando | Lượt xem: 477 | Lượt tải: 0download
Tóm tắt nội dung Hàm đa thức - Chương 3: Các vấn đề về ma trận (Phần 2), để xem tài liệu hoàn chỉnh bạn click vào nút "TẢI VỀ" ở trên
giá trị riêng	-1.000000	vec tơ riêng	 
0.500000
	1.000000
	-0.500000
§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 :
	Chúng ta nhắc lại quy tắc nhân hai ma trận A.B :
với 	c11= a11b11 + a12b21 + a13b31
	c12= a11b12 + a12b22 + a13b32
	c13= a11b13 + a12b23 + a13b33
	c21= a21b11 + a22b21 + a23b31
	Tổng quát :
	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ó :
	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 	
 ( j = i tới n)
	 (j = i tới n)
	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 
#include 
#include 
#include 
#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];
	 }
	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();
 }
Dùng chương trình này phân tích ma trận ta được :
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 :
Tích hai ma trận RT và R là :
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ó : 
	rij = 0 (i > j )
Dưới đây là chương trình:
Chương trình 3-8
#include 
#include 
#include 
#include 
#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];
	 }
	}
	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
ta có :

File đính kèm:

  • docham_da_thuc_chuong_3_cac_van_de_ve_ma_tran_phan_2.doc