1. Trang chủ
  2. » Công Nghệ Thông Tin

Ma trận với c c nâng cao và c++ chap 9

35 975 25

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

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 35
Dung lượng 185,79 KB

Nội dung

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 1

34 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 2

34 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 4

ok1=0;

} else k=k+1;

{ printf("\n");

ok2=0;

d=0;

} }

{ c=a[i][i];

0100

0010

0001E

Trang 5

Phươ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 6

4 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 7

else a[i][j]=0;

} i=1;

} else

}

{ c=a[i][i];

Trang 8

i=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 11

c[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 12

3

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 13

for (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 14

2.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 15

X 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 16

720138

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 19

Giả 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 20

720138

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 22

printf("Gia tri rieng : %9.6f\n",v1);

Trang 23

}

}

Trang 24

Do (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 25

if (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 26

Q2(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 27

J(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 28

n 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 29

s* = -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 30

c[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 31

printf("%.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 33

if (s<=t) {

s=t;

l=i;

} }

{ s=a[k][j];

Trang 34

printf("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 35

printf("Khong hoi tu sau %d lan lap\n",z);

Ngày đăng: 27/03/2014, 11:32

TỪ KHÓA LIÊN QUAN

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

TÀI LIỆU LIÊN QUAN

w