Sau đây là chương trình tìm định thức của một ma trận: Chương trình 9-1 //tinh dinh thuc #include #include #include... 2.Phương pháp Mises: Thuật toán Mises tìm giá trị riêng lớn nhất c
Trang 134 33 32 31
24 23 22 21
14 13 12 11
a a a a
a a a a
a a a a
a a a a A
Lấy giá trị trụ là p1= a11.Ta chia các phần tử của hàng thứ nhất cho p1= a11 thì định thức sẽ là D/p1 (theo tính chất 1) và ma trận còn lại là:
34 33 32 31
24 23 22 21
14 13 12
a a a a
a a a a
a a a a
a a a 1
Lấy hàng 2 trừ đi hàng 1 đã nhân với a21,lấy hàng 3 trừ đi hàng 1 đã nhân với a31 và lấy hàng
4 trừ đi hàng 1 đã nhân với a41 (thay hàng bằng tổ hợp tuyến tính của các hàng còn lại) thì
34 33 32
24 23 22
14 13 12
a a a 0
a a a 0
a a a 0
a a a 1
Lấy giá trị trụ là p2 = a22′ Ta chia các phần tử của hàng thứ hai cho p2 thì định thức sẽ là D/(p1p2) và ma trận còn lại là:
34 33 32
24 23
14 13 12
a a a 0
a a a 0
a a 1 0
a a a 1
Lấy hàng 1 trừ đi hàng 2 đã nhân vớia′12,lấy hàng 3 trừ đi hàng 2 đã nhân với a′32và lấy hàng
4 trừ đi hàng 2 đã nhân với a′42thì định thức vẫn là D/p1 và ma trận là:
thì định thức vẫn là D/(p1p2) và ma trận là:
Trang 234 33
24 23
14 13
a a 0 0
a a 0 0
a a 1 0
a a 0 1
Tiếp tục lấy hàng 3 rồi hàng 4 làm trụ thì ma trận sẽ là:
0100
0010
0001
Định thức của ma trận này là D/(p1p2p3p4)= D/(a11a ′22a33′′ a44′′′ ) =1 nên định thức của ma trận A
là D = p1p2p3p4
Sau đây là chương trình tìm định thức của một ma trận:
Chương trình 9-1
//tinh dinh thuc
#include <conio.h>#include <stdio.h>#include <ctype.h>
Trang 4ok1=0;
} else k=k+1;
{ printf("\n");
ok2=0;
d=0;
} }
{ c=a[i][i];
0100
0010
0001E
Trang 5Phương pháp loại trừ để nhận được ma trận nghịch đảo A-1 được thực hiện qua nhiều giai đoạn (n),mỗi một giai đoạn gồm hai bước.Đối với giai đoạn thứ k:
- chuẩn hoá phần tử akk bằng cách nhân hàng với nghịch đảo của nó
- làm cho bằng không các phần tử phía trên và phía dưới đường chéo cho đến cột thứ
1 2 1
1 1 2 A
Ta viết lại ma trận A và ma trận đơn vị tương ứng với nó
0 1 0
0 0 1 E 2 1 1
1 2 1
1 1 2 A
Giai đoạn 1: Bước a: Nhân hàng 1 với 1/a11,nghĩa là a,1j = a1j/a11 đối với dòng thứ nhất,a,ij =
010
0021E2
11
121
21211A
0121
0021E23210
21230
21211A
Giai đoạn 2: Bước a: Lấy hàng 2 làm chuẩn,nhân hàng 2 với 2/3,để nguyên các hàng khác
03231
0021E23210
3110
21211A
Bước b: Lấy hàng 1 trừ đi hàng 2 nhân 1/2 và lấy hàng 3 trừ đi hàng 2 nhân
03231
03132E3400
3110
3101A
Giai đoạn 3: Bước a: Lấy hàng 3 làm chuẩn,nhân hàng 3 với 3/4,để nguyên các hàng khác
03231
03132E1
00
3110
3101A
Bước b: Lấy hàng 1 trừ đi hàng 3 nhân 1/3 và lấy hàng 2 trừ đi hàng 3 nhân
414341
414143E100
010
001A
Như vậy A-1 là:
Trang 64 1 4 3 4 1
4 1 4 1 4 3
A1
¸p dông ph−¬ng ph¸p nµy chóng ta cã ch−¬ng tr×nh sau:
Ch−¬ng tr×nh 9-2
#include <conio.h>#include <stdio.h>#include <math.h>#include <stdlib.h>#include
<ctype.h>void main() { int i,j,k,n,t,t1; float c,a[50][50],b[50][50]; char tl; clrscr();
printf(" **MA TRAN NGHICH DAO** \n");
printf("Cho bac cua ma tran n = ");
Trang 7else a[i][j]=0;
} i=1;
} else
}
{ c=a[i][i];
Trang 8i=i+1;
}
{ printf("\n");
} getch();
9 10 2
1 2 1
kj ik
Trang 9} printf("\n");
printf("Ma tran a ma ban da nhap\n");
Trang 10} printf("\n");
printf("Ma tran b ban da nhap\n");
Trang 11c[i][j]=0;
for (k=1;k<=l;k++) c[i][j]=c[i][j]+a[i][k]*b[k][j];
} printf("Ma tran tich c :\n");
221
11148
105
343
221
35013112
Đ 4.Giá trị riêng và vec tơ riêng của ma trận
1.Khái niệm chung: Trong nghiên lí thuyết và ứng dụng,ta gặp bài toán về ma trận cấp
n.Cho một ma trận A cấp n,giá trị λ được gọi là giá trị riêng và vectơ X được gọi là vectơ riêng của ma trận A nếu:
Vectơ riêng phải là vectơ khác không.Tương ứng với một giá trị riêng có vô số vectơ riêng.Nếu X là một véc tơ riêng tương ứng với giá trị riêng λ thì cX cũng là vec tư riênh ứng với λ.Có nhiều thuật toán tìm giá trị riêng và vectơ riêng của một ma trận.Giả sử ta có ma trận A,gọi E là ma trận đơn vị thì theo (1) ta có:
aa
a
aaa
nn 2 1
n 22
21
n 12 11
(3)
Như vậy do (2) là hệ phương trình tuyến tính thuần nhất nên điều kiện cần và đủ để λ
là giá trị riêng của ma trận trên là định thức của nó bằng không:
Phương trình (4) được gọi là phương trình đặc trưng của ma trận A.Định thức det(A - λE)
được gọi là định thức đặc trưng của ma trận A.Định thức PA(λ) của ma trận trên được gọi là
đa thức đặc trưng của ma trận vuông A
Ví dụ tìm vec tơ riêng và trị riêng của ma trận:
2
1 1
3
3 1
3
Trước hết ta tính đa thức đặc trưng của ma trận A:
Trang 123
31
3)(
ư
=λ
ư
ưưλ ư
ưλ
ư
=λ
Nghiệm của PA(λ) = 0 là λ1 = 4,λ2 = 2j và λ3 = -2j.Vì trường cơ sở là số thực nên ta chỉ lấy λ
= 4.Để tìm vec tơ riêng tương ứng với λ = 4 ta giải hệ
02
13
31
3
3 2
ξ
ìλ
ư
ưưλ ư
ưλ
ư
ta nhận được các giá trị của ξ,chúng tạo thành vec tơ riêng ứng với λ
Như vậy khi khai triển định thức ta có một đa thức bậc n có dạng:
Pn(λ) = λn - p1λn-1 - p2λn-2 - …- pn = 0 Muốn xác định các hệ số của đa thức đặc tính này ta dùng phương pháp Fadeev-Leverrier.Ta xét ma trận A:
1
n 22
21
n 12
11
aa
a
aa
a
aa
aA
Ta gọi vết của ma trận A là số:
Khi đó tham số pi của Pn(λ) được các định như sau:
p1 = vet(B1) với B1 = A
p2 = (1/2)vet(B2) với B2 = A(B1-p1E)
p3 = (1/3)vet(B3) với B3 = A(B2-p2E)
Trang 13for (i=1;i<=n;i++)
for (j=1;j<=n;j++)
{ printf("a[%d][%d] = ",i,j );
scanf("%f",&a[i][j]);
} printf("\n");
Trang 142.Phương pháp Mises: Thuật toán Mises tìm giá trị riêng lớn nhất của một ma trận A Nếu
ma trận A là thực và và mỗi trị riêng bội k có đủ k vec tơ riêng độc lập tuyến tính thì việc tính toán sẽ cho ta giá trị riêng lớn nhất
Một vectơ V bất kì có thể được viết dưới dạng:
=
=+
⋅
⋅++
1 i
i i n
n 2
2 1
Trang 15X v X A v
n 1
i ii i n 1
p n n 2 p 2 1 1 p 1 1 i p i n 1
λ+
⋅⋅
⋅+
λ+
λ+λ
p 1
n n 3
p 1
3 3 2 p 1
2 2 1 1
p 1 p
Xv
Xv
Xv
XvV
λ+
⋅⋅
⋅+
λ+
λ+λ
=
+ +
+ +
+
n
1 p 1
n n 3
1 p 1
3 3 2
1 p 1
2 2 1 1 1 p 1 1
p
Xv
Xv
Xv
XvV
λ
p khi 0
1 i
1 p
p lim A V = λ v X
∞
1 1 1 p 1 1 p
p 1 p
X v V
1 1 1 p 1 1 p
X v V
A + = λ +
1 1
p + =λ
hay: A( )ApV = λ1ApV
Như vậyApVlà véc tơ riêng của A ứng với λ1 còn giá trị riêng λ1 sẽ là:
1 p
1 p
V A lim + = λ
∞
→Trong thực tế để tránh vượt quá dung lượng bộ nhớ khi λ1 khá lớn,các vectơ Vk được chuẩn hoá sau mỗi bước bằng cách chia các phần tử của nó cho phần tử lớn nhất mk và nhận
được vectơ V’
k Như vậy các bước tính sẽ là:
- cho một vec tơ V bất kì (có thể là V = { 1,1,1, ,1}T)
1 p p
vlim
XVlim
Ví dụ: Tìm giá trị riêng lớn nhất và vec tơ riêng tương ứng của ma trận:
Trang 16720138
17302417A
3.5341 -0.5075 -3.5173 -0.5043
0.4996
#include <conio.h>#include <stdio.h>#include <math.h>#include <stdlib.h>#include
<ctype.h>#define max 50void main() { int i,j,k,n,t; char tl; float t0,t1,epsi,s;
clrscr();
printf("Phuong phap lap luy thua tim tri rieng lon nhat\n");
printf("Cho so hang va cot cua ma tran n = ");
scanf("%d",&n);
printf("Cho cac phan tu cua ma tran a : \n");
for (j=1;j<=n;j++)
Trang 17{ printf("a[%d][%d] = ",i,j);
} printf("\n");
printf("Ma tran ban da nhap\n");
Trang 18{ x1[i]=0;
} s=0;
{
printf("Da thuc hien %d buoc lap\n",k);
printf("Gia tri rieng lon nhat Vmax = %15.5f\n",t1);
printf("Vec to rieng tuong ung\n");
6 4 9
0 1 2
ta nhận được giá trị riêng là 3.0000 và vec tơ riêng là x = { -0.75 ; 0.75 ; 1 }T
Như chúng ta đã nói trước đây,phương pháp Mises (hay còn gọi là phương pháp lặp lũy thừa) chỉ cho phép tìm giá trị riêng lớn nhất và vec tơ riêng tương ứng của ma trận.Để xác định các giá trị riêng khác,ma trận A được biến đổi thành một ma trận khác A1 mà các giá trị riêng là λ2 > λ3 > > λn.Phương pháp này gọi là phương pháp xuống thang.Sau đây là phương pháp biến đổi ma trận:
Trang 19Giả sử X1 là vec tơ riêng của ma trận A tương ứng với giá trị riêng λ1 và W1 là vec tơ riêng của ma trận AT tương ứng với giá trị riêng λ1.Từ định nghĩa AX1 = λ1X1 ta viết:
Ta tạo ma trận A1 dạng:
WXXWA
1 T 1
1 1
XWXXWAXXA
1 1 1
1 T 1 1 T 1 1 1 1
1 T 1 1 1 T 1
1 1 1 1
λ
A1 chấp nhận giá trị riêng bằng không
Nếu X2 là vec tơ riêng tương ứng với giá trị riêng λ2,thì khi nhân A1 với X2 ta có:
XW
XWXAX
XWXXWAXXA
1 T 1 2 T 1 1 1 2
2 T 1 1 1 T 1
1 2 2 1
(λ1 - λ2) W1TX2 = 0 khi λ1 ≠ λ2 thì:
Cuối cùng thay (12) vào (9) ta có:
A1X2 = AX2 = λ2X2 Như vậy λ2 là giá trị riêng lớn nhất của ma trận A1 và như vậy có thể áp dụng thuật toán này để tìm các giá trị riêng còn lại của ma trận.Các bước tính toán như sau
- khi đã có λ1 và X1 ta tìm W1 là vec tơ riêng của AT ứng với giá trị riêng λ1 (ví dụ tìm
W1 bằng cách giải phương trình (AT -λ1E)W1 = 0).Từ đó tính ma trận A12 theo (7)
- tìm giá trị riêng và vec tơ riêng của A1 bằng cách lặp công suất và cứ thế tiếp tục và xuống thang (n-1) lần ta tìm đủ n giá trị riêng của ma trận A
Ví dụ: Tìm giá trị riêng và vectơ riêng của ma trận sau:
Trang 20720138
17302417A
Ta đã tìm được giá trị riêng lớn nhất λ1 = 7 và một vectơ riêng tương ứng:
54 8 20 30
43 10 13 24
23 2 8 17
8681492
1390586
00
00
434746
695293
434746
695293
120
7XW
WX
1
T
1
T 1 1
6 8
10 2
3167 18 5167 23 5417 27 0917 9
3167 8 5167 13 5417 16 0917 0
Trang 21{ printf("a[%d][%d] = ",i,j);
z=0;
Trang 22printf("Gia tri rieng : %9.6f\n",v1);
Trang 23}
}
Trang 24Do (6) đúng với mọi n nên cho n = 1 , 2 , 3 , ta có :
| x2 - x1 | ≤ q | x1 - xo |
| x3 - x2 | ≤ q | x2 - x1 |
| xn+1 - xn | ≤ q | xn - xn-1 |
Điều này có nghĩa là dãy xi+1 - xi , một cách gần đúng,là một cấp số nhân Ta cũng coi rằng dãy xn - y với y là nghiệm đúng của (1) , gần đúng nh- một cấp số nhân có công sai q Nh- vậy :
1qyx
yx
1 n 2 n
xx
xx
(10)
Thay giá trị của q vừa tính ở (10) vào biểu thức của q ở trên ta có :
1 n 1 n n
2 1 n n n
xx2x
xxx
y
+ +
Để làm ví dụ chúng ta xét ph-ơng trình :
Ta đ-a về dạng lặp :
3 ) x ln(
3xlnx
1)
x(f
Trang 25if (z>20) printf("Khong hoi tu sau hai muoi lan lap\n");
x[1]=y;
} z=z+1;
Nguyên tắc của ph-ơng pháp Bairstow là trích từ đa thức Pn(x) một tam thức Q2(x)
= x2 - sx + p mà ta có thể tính nghiệm thực hay nghiệm phức của nó một cách đơn giản bằng các ph-ơng pháp đã biết
Việc chia đa thức Pn(x) cho tam thức Q2(x) đ-a tới kết quả :
Pn(x) = Q2(x).Pn-2(x) + R1(x) với Pn(x) = aoxn+ a1xn-1+ a2xn-2+ + an
Trang 26Q2(x) = x2 - sx + p
Pn-2(x) = boxn-2+ b1xn-3+ b2xn-4+ + bn-2
R1(x) = αx + β
(nghĩa là α và β triệt tiêu).Với s và p đã cho,các hệ số b của đa thức Pn-2(x) và các hệ số
α và β đ-ợc tính bằng ph-ơng pháp truy hồi.Các công thức nhận đ-ợc khi khai triển biểu thức Pn(x) = Q2(x).Pn-2(x) + R1(x) và sắp xếp lại các số hạng cùng bậc :
p :
bn-1 = f(s,p)
bn = g(s,p) Việc tìm s* và p*đ-a đến việc giải hệ ph-ơng trình phi tuyến:
⎩⎨
⎧
=
=0)p,s(g0)p,s(
Ph-ơng trình này có thể giải dễ dàng nhờ ph-ơng pháp Newton.Thật vậy với một ph-ơng trình phi tuyến ta có công thức lặp :
xi+1 = xi - f(xi)/f'(xi) hay f'(xi)(xi+1 - xi) = -f(xi)
Với một hệ có hai ph-ơng trình,công thức lặp trở thành:
Trang 27J(Xi)(Xi+1 - Xi) = -F(Xi) với Xi = { si,pi}T và Xi+1 = { si+1,pi+1}T
)p,s(g)p,s()X(F
i i i i
i =
i
J X
fs
fpgs
gp( )=
∆p g
f
s f
gs
gp
fp
gs
a s
sb s
pb s
∂
∂bs =b sb+ o
b3 = a3 + sb2- pb1 nên
3 2
Nếu chúng ta đặt :
k k
b
s c
∂
∂ = −1
Trang 28n 3
n 2
s
fc
s
fc
s
fc
3 n n 2 n 1 n
ccc
cbc
bs
2 n n 1 n 1 n
ccc
cbcbp
- Lặp lại b-ớc 1 cho đến khi pi+1 = pi = p và si+1 = si = s
- Giải ph-ơng trình x2 - sx+ p để tìm 2 nghiệm của đa thức
- Bắt đầu quá trình trên cho đa thức Pn-2(x)
Ví dụ : Tìm nghiệm của đa thức P4(x) = x4 - 1.1x3 + 2.3x2 + 0.5x2 + 3.3
Với lần lặp ban đầu ta chọn s = -1 và p =1,nghĩa là tam thức có dạng x2 + x + 1
1.35.5
5.57.0
1.38.0
5.52.3
1.35.5
7.02.3
8.05.5
Trang 29s* = -1 + 0.11 = -0.89
p* = 1 + 0.06 = 1.06 TiÕp tôc lÆp lÇn 2 víi s1 = s* vµ p1 = p* ta cã :
88.251.4
5.57.0
88.207.0
51.403.1
88.251.4
17.003.1
07.051.4
Trang 30c[n-1]=b[n-1]+b[n]*p;
{ b[i]=b[i+2]*q+b[i+1]*p+a[i];
t=p1*p1+4*q1;
if(t<0)
{
Trang 31printf("%.8f+%.8fj\n",s,(sqrt(-t)/2));
printf("%.8f-%.8fj\n",s,(sqrt(-t)/2));
printf("\n");
} else {
Trang 32
0)x, ,x,x,x(f
0)x, ,x,x,x(f
0)x, ,x,x,x(f
2 3 2 1 n
2 3 2 1 3
2 3 2 1 2
2 3 2 1 1
hay viết gọn hơn d-ới dạng :
F(X) = 0 Trong đó : X = (x1,x2,x3, ,xn)
Với một ph-ơng trình một biến,công thức Newton là :
fx
fx
fxf
x
fx
fx
fx
fx
fx
fx
fx
( ) .
1 2
1 3
1
2 1
2 2
2 3
Ph-ơng pháp Newton tuyến tính hoá hệ và nh- vậy với mỗi b-ớc lặp cần giải một
vectơ X(x1,x2,x3, ,xn) gần với nghiệm
D-ới đây là ch-ơng trình giải hệ ph-ơng trình phi tuyến
1 3 2 3
1 2 3
Ma trận này đ-ợc ch-ơng trình đọc vào nhờ thủ tục doc.Trong thủ tục này,các hệ số a[i,5]
là các hàm fi(x).Vectơ nghiệm ban đầu đ-ợc chọn là { 0,-1,-1,1}T.Kết quả tính cho ta : x
= {0.01328676,-1.94647929,-1.12499779,8.05819031 }T với độ chính xác 0.000001.Vectơ
số d- r = { 0.00000536,-0.00000011,-0.00000001,-0.00000006}T
Trang 33if (s<=t) {
s=t;
l=i;
} }
{ s=a[k][j];
Trang 34printf("Cac phan tu duong cheo cua ma tran bang khong");
getch();
exit(1);
} else {
a[i][k]=0;
} y[n]=a[n][n+1]/a[n][n];
{ s=a[i][n+1];
} }
Trang 35printf("Khong hoi tu sau %d lan lap\n",z);