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

Ma trận và mảng trong matlab

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

Đ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

Tiêu đề Ma trận và Mảng trong MATLAB
Tác giả Nguyễn Thị Hồng Thúy
Thể loại Giáo trình
Định dạng
Số trang 22
Dung lượng 253,3 KB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

Các tạo và các lệnh sử dụng Ma trận và mảng trong Matlab, dạy bạn sử dụng thành thạo cách dùng lệnh tạo mảng và ma trận trong Matlab

Trang 1

Chương 2

MA TRẬN VÀ MẢNG TRONG MATLAB

Tất cả mọi sự tính toán đều có một điểm chung là có sử dụng đến các đại lượng

vô hướng gọi là scalars Phép toán có liên quan đến scalars là các phép toán cơ bản, nhưng một lúc nào đó phép toán phải lập lại nhiều lần khi tính trên nhiều số

Ðể giải quyết vấn đề này MATLAB đưa ra các khái niệm và thao tác tính toán trên mảng và ma trận

x = first : last : tạo vectơ hàng x bắt đầu tại first, phần tử sau bằng phần tử trước

cộng với 1, kết thúc là phần tử có giá trị bằng hoặc nhỏ hơn last

x = first : increment : last : tạo vectơ hàng x bắt đầu tại first, giá trị cộng là

increment, kết thúc là phần tử có giá trị bằng hoặc nhỏ hơn last

x = linspace (first,last,n): tạo vectơ hàng x bắt đầu tại first, kết thúc là last, có n

phần tử

x = logspace (first,last,n): tạo vectơ hàng không gian logarithm x bắt đầu tại

10first, kết thúc tại 10last, có n phần tử

Trang 2

Ðể tạo vectơ cột, ta dùng dấu chấm phẩy để phân cách các phần tử Ngoài ra, ta

cũng có thể dùng các hàm linspace, logspace, hay từ các vectơ hàng, sau đó

2.2 Ma trận

2.2.1 Nhập một ma trận trong MATLAB

2.2.1.1 Nhập một ma trận từ một danh sách tường minh:

Một ma trận trong MATLAB được định nghĩa như một mảng nhiều chiều và theo nguyên tắc sau:

Mỗi phần tử trên từng dòng của ma trận được cách nhau bởi dấu phẩy hoặc khoảng trống

Mỗi hàng được phân cách bởi một dấu chấm phẩy

Bao quanh ma trận bởi một cặp ngoặc vuông

654

321

2.1.1.2 Tạo ma trận từ những hàm có sẵn trong MATLAB:

MATLAB có một thư viện các hàm cho phép tạo ma trận Sau đây là một số hàm:

zeros(n,m): tạo một ma trận kích thước n x m, với các phần tử đều bằng không eye(n): tạo một ma trận đơn vị kích thước n x n

ones(n,m): tạo ma trận kích thước n x m, với các phần tử đều bằng một

Trang 3

rand(n,m): tạo ma trận kích thước n x m, với các phần tử có giá trị ngẫu nhiên từ

0 -1

diag(V): nếu V là một vectơ sẽ tạo ra ma trận đường chéo, với các phần tử của

vectơ V nằm trên đường chéo

Lệnh Load trong MATLAB dùng để đọc file chứa ma trận tạo ra từ những lệnh

MATLAB trước đó Lệnh này còn dùng để đọc text file chứa những dữ liệu số Text file phải được tổ chức như một bảng số mà các phần tử được cách nhau bởi các khoảng trống, mỗi hàng của ma trận chiếm mỗi hàng của text file Số phần tử của mỗi hàng phải bằng nhau

Trang 5

diag(X,k): nếu X là một ma trận thì kết quả là một vectơ cột hình thành

từ những phần tử của đường chéo thứ k

diag(X): trả về một vectơ là đường chéo chính của ma trận

diag(diag(X)): trả về một ma trận đường chéo

Ví dụ:

>> v=[1 2 3];

>> diag(v,1) ans =

Trang 6

7 8 9

>> tong_cot=sum(a) tong_cot =

12 15 18

>> tong_hang=sum(a,2) tong_hang =

Ðể định nghĩa ma trận symbolic, hai lệnh sym và syms thường được sử dụng:

sym(‘a’): trả về kết quả là một biến symbolic tên là a

Ðối với một số ma trận đặc biệt ta có một số kết quả sau:

Trang 7

2.2.2.8 Các toán hạng ma trận

Trong MATLAB tồn tại các toán hạng sau:

A + B Cộng ma trận A và B A và B phải có cùng kích thước, ngoại trừ một trong

hai là một giá trị vô hướng

A – B Trừ ma trận A và B A và B phải có cùng kích thước, ngoại trừ một trong hai

là một giá trị vô hướng

A * B Nhân ma trận A và B Số cột của ma trận A phải bằng số hàng của ma trận B,

ngoại trừ một trong hai là một giá trị vô hướng

A * B

Nhân từng phần tử của ma trận A với từng phần tử của ma trận B Kết quả là một ma trận A và B phải có cùng kích thước, ngoại trừ một trong hai là một giá trị vô hướng

A \ B Chia trái ma trận X = A\B tương đương với việc giải hệ phương trình tuyến

tính A*X = B

A \ B Chia trái mảng A \ B tương đương với B(i,j)/A(i,j) A và B phải có cùng kích

thước, ngoại trừ một trong hai là một giá trị vô hướng

A / B Chia phải ma trận X = A/B tương đương với việc giải hệ phương trình tuyến

tính B*X = A

A / B Chia phải mảng A / B tương đương với A(i,j)/B(i,j) A và B phải có cùng

kích thước, ngoại trừ một trong hai là một giá trị vô hướng

A ^ B Lũy thừa ma trận Lỗi sẽ phát sinh nếu A và B đều là ma trận

A ^ B Lũy thừa mảng Kết quả là một ma trận mà các số hạng là A(i,j)^B(i,j) A và

B phải có cùng kích thước, ngoại trừ một trong hai là một giá trị vô hướng

2.3 Gải hệ phương trình tuyến tính

Một hệ phương trình tuyến tính có dạng tổng quát sau:

a11x1 + a12x2 + a1nxn = b1

a21x1 + a22x2 + a2nxn = b2

am1x1 + am2x2 + amnxn = bm Với: A = [aij]m x n là ma trận hệ số

A* = [A b]m x (n +1) là ma trận đầy đủ

Một số phương pháp để giải hệ này:

- Nghịch đảo ma trận

- Phương pháp khử Gauss

- Phương pháp khử Gauss - Jordan

- Phương pháp phân rã ma trận (LU)

Một trong những ứng dụng của MATLAB là để giải hệ phương trình đại số tuyến tính Trong MATLAB có một số hàm đã được xây dựng để sử dụng cho các phương pháp này

Trang 8

bB x

x

xX

a

a

a a

a

a a

n

2 1

nn

2n 1n

n2

22 12

n1

21 11

MKOLL

MM

2.3.1.1 Lệnh inv

inv(A): dùng để tính ma trận nghịch đảo

Ví dụ: giải hệ phương trình tuyến tính A*X = B sau:

77

4B x

x

xX 5

-1-

2- 13

1 21

1

A

3 2 1

14.0000 -3.0000 -5.0000 -3.0000 1.0000 1.0000 5.0000 -1.0000 -2.0000

>> X=A_inv*B

X =

0 2.0000 -1.0000

2.3.1.2 Lệnh pinv

pinv(A): dùng để tính giả nghịch đảo của ma trận m x n, với m ≠ n Lệnh pinv

không sử dụng được với phương pháp symboic

Ví dụ: giải hệ phương trình tuyến tính A*X = B sau:

6B

xxxxxx

X 5

02

4 8-3

6-

4 40

2-

5 100

1- 2-1

2-

2- 202

1

A

6 5 4 3 2 1

Trang 9

>> A=[1 -2 -1 5 4 4;2 -2 0 -2 -6 2;0 1 0 0 3 0;2 -2 1 4 -8 5];

>> B=[-6;-2;0;-3];

>> X=pinv(A)*B

X = -0.4031 0.8008 0.3984 -0.0157 -0.2669 -0.6126

Vì A không phải là ma trận vuông nên một thông báo lỗi sẽ hiện ra khi ta thay lệnh inv(A) bằng lệnh pinv(A)

Có thể giải lại hệ phương trình tuyến tính trên bằng phương pháp symbolic:

n là kích thước của ma trận Hilbert Ma trận Hilbert được xem là điều kiện yếu

“ill condition”, có nghĩa là định thức của ma trận có giá trị rất nhỏ

Ma trận Hilbert n xn có dạng như sau:

++

=

1/(2n)

2)1/(n

1)1/(n1/n

2)1/(n

1/51/41/3

1)1/(n

1/41/31/2

1/n

1/31/21

H

MLOLLK

MM

M

Ví dụ:

Giải phương trình H*X = B bằng hai phương pháp số, symbolic và dùng lệnh invhilb Trong đó H là một ma trận Hilbert 8 x 8 và B là vectơ cột [1 1 1 1 1 1 1 1]

Trang 10

Phương pháp số:

>> H=hilb(8)

H =

1.0000 0.5000 0.3333 0.2500 0.2000 0.1667 0.1429 0.1250 0.5000 0.3333 0.2500 0.2000 0.1667 0.1429 0.1250 0.1111 0.3333 0.2500 0.2000 0.1667 0.1429 0.1250 0.1111 0.1000 0.2500 0.2000 0.1667 0.1429 0.1250 0.1111 0.1000 0.0909 0.2000 0.1667 0.1429 0.1250 0.1111 0.1000 0.0909 0.0833 0.1667 0.1429 0.1250 0.1111 0.1000 0.0909 0.0833 0.0769 0.1429 0.1250 0.1111 0.1000 0.0909 0.0833 0.0769 0.0714 0.1250 0.1111 0.1000 0.0909 0.0833 0.0769 0.0714 0.0667

Trang 11

2.3.2 Phương pháp khử Gauss - Jordan

rref(A): trả về ma trận là bước cuối cùng trong phương pháp khử Gauss - Jordan

Trong đó A là ma trận vuông hay chữ nhật Lệnh rref cho phép sử dụng với phương pháp symbolic

Ví dụ: giải hệ phương trình tuyến tính:

xxx

x 413

0 0

1-

1-

2- 211

2- 1001

4 3 2 1

>> A=[1 -2 -2 0;0 1 -1 3; 0 1 -1 1;1 2 0 4];

Trang 12

>> B=[18;18;54;36];

>> G_J=rref([A B]) G_J =

Khi sử dụng phương pháp khử Gauss - Jordan sẽ dẫn tới một bất tiện là ta phải tiến hành lại từ đầu thủ tục Gauss - Jordan cho từng vectơ cột B Một phương pháp cho phép tiết kiệm được số lần tính toán mà đạt cùng hiệu quả là dùng phương pháp phân rã ma trận

2.3.3 Phương pháp phân rã ma trận

[L,u] = lu(A): trả về ma trận tam giác trên U, ma trận tam giác dưới L

Phân rã ma trận A thành các ma trận tam giác: A = L*U

L: ma trận tam giác dưới cỡ n x n, các phần tử đường chéo đều bằng 1

U: ma trận tam giác trên

0 L

αα

αα

αα

MKOLL

MM

12 11

0

0

0U

β

β

ββ

ββ

MLOLL

MM

Như vậy hệ phương trình được viết lại như sau:

*U

BY

*L BX

*A

Cả hai phương trình trong hệ đều dễ dàng tìm ra nghiệm vì các ma trận L và U đều ở dạng tam giác

Bằng cách thế ngược một lần nữa để tìm X Như vậy nghiệm của hệ A*X =B là:

X = U\(L\B)

Trang 13

Ví dụ: giải hệ phương trình A*X = B, trong đó:

9-B 12

5-0

2 5-01

2- 5

4-5

7- 9-6

3-

2.4 Hạng của ma trận và điều kiện có nghiệm của hệ A*X = B

Hạng của ma trận A là số hàng khác không có trong dạng rút gọn của A Kí hiệu:

r (A)

Ðiều kiện có nghiệm của hệ phương trình tuyến tính A*X = B, có n ẩn số:

- r (A) = r (A*) = n thì hệ có nghiệm duy nhất

- r (A) = r (A*) < n thì hệ có vô số nghiệm phụ thuộc n – r (A) tham số

- r (A) ≠ r (A*): không tồn tại lời giải của hệ phương trình A*X = B

Trong toolbox của MATLAB có một số lệnh liên quan đến hạng của một ma trận, không gian cơ sở của ma trận

Trang 14

1 xx

x 43

1-

1 102

1

1 xx

x 11

0 21

1

1

0

1

3 2 1

9- 1-3

5 6-

1-

2

Trang 15

colspace (A): nếu A là ma trận symbolic kích thước n x n, không suy biến Kết

quả trả về là một ma trận mà các cột là vectơ cơ sở của không gian Rn

Ví dụ:

>> colspace(sym(magic(3))) ans =

[ 1, 0, 0]

[ 0, 1, 0]

[ 0, 0, 1]

>> colspace(sym(magic(4))) ans =

[ 1, 0, 0]

[ 0, 1, 0]

[ 0, 0, 1]

[ 1, 3, -3]

Trang 16

2.5 Ðộ chính xác của lời giải

Xác định sai số của hệ phương trình tuyến tính A*X = B:

Gọi x và x e là nghiệm gần đúng và nghiệm chính xác của hệ phương trình tuyến tính A*X = B Ta có:

x x

x

b b x

δ là chuẩn của vectơ cột δb

b là chuẩn của vectơ cột b

x

δ là chuẩn của vectơ cột δx

x là chuẩn của vectơ cột x

K là điều kiện (condition) của ma trận A, kí hiệu là cond (A) Giữa K và ma trận

A có mối quan hệ:

A A

x b

b

K

δδ

δ

≤1

Sai số xấp xỉ = K*ε

Với ε là độ chính xác của máy tính Trong MATLAB có một biến đặc biệt dùng

để định nghĩa dộ chính xác này là eps

Ðộ chính xác này dùng để phân biệt hai giá trị rất gần nhau Ví dụ b và b’ khác nhau khi và chỉ khi | |b| - |b’| | ≥ ε

MATLAB cung cấp cho chúng ta hai hàm để tính điều kiện và chuẩn của ma trận

cond (A): trả về một giá trị là điều kiện của ma trận A

norm (X): trả về chuẩn của X Nếu X là vectơ sẽ trả về chiều dài của nó Nếu X

là ma trận trả về giá trị căn bậc hai của tổng bình phương các số hạng của ma trận Hàm norm không làm việc với các biến symbolic

Ví dụ: xét sự ảnh hưởng của sai số trong hệ phương trình tuyến tính H*X = B H

là ma trận hilbert n x n, với n = 6:13 và B là ma trận cột với tất cả các phần tử đều bằng 1

Lệnh của MATLAB:

for n=3:13

Trang 17

H=hilb(n); % tao ma tran hilbert HI=invhilb(n); % ma tran nghich dao cua hilbert B=ones(n,1); % tao ma tran B

x=H\B; % tinh nghiem cua he nx=norm(x); % tinh chuan cua vecto x dx=norm(x-HI*B); % tinh chuan cua vecto dx db=norm(H*x-B); % tinh chuan cua vecto db nb=norm(B); % tinh chuan cua vecto B

K=cond(H); % tinh dieu kien cua ma tran hilbert err=dx/nx; % sai so that cua he phuong trinh format short g

err1=K*eps; % sai so xap xi format short g

err2=K*db/nb; % sai so lon nhat format short g

disp([n err err1 err2]) end

Kết quả:

Cách tìm:

Với A là ma trận vuông cấp n đã cho thì vectơ cột x ≠ 0 là vectơ riêng của ma trận A khi và chỉ khi Ax = λx hay:

Trang 18

Ax - λx = 0

x = Ix (I là ma trận đơn vị có kích thước n x n)

⇒ Ax - λIx = 0

⇔ (A - λI)x = 0

Giá trị riêng λ là nghiệm của định thức: |A - λI| = 0

Nếu khai triển định thức ta sẽ được một đa thức với biến λ Ða thức này được gọi

là đa thức đặc trưng Nếu A là ma trận n x n thì đa thức này có dạng sau:

[ 10/3]

>> [V,D]=eig(A)

V = [ 2, 1]

[ 1, -2]

D = [ 10/3, 0]

[ 0, 5/3]

2.6.2 Lệnh poly

Trả về đa thức của ma trận A

Cú pháp:

poly(A): nếu A là một ma trận symbolic, thì kết quả trả về là một đa thức đặc

trưng Nếu A là một hàm ma trận số thì kết quả trả về là một mảng chứa các hệ

số của đa thức này

Ví dụ:

>> A=sym([3 2/3;2/3 2]);

>> P=poly(A)

Trang 19

2.6.3 Tính định thức, nghịch đảo và lũy thừa của ma trận thông qua ma trận

giá trị riêng và vectơ riêng

MATLAB cung cấp một số hàm để tính định thức, nghịch đảo và lũy thừa của

ma trận như det, inv, expm

Ngoài ra, căn cứ vào các tính chất của ma trận, ta có thể tính toán thông qua các biểu thức:

|A| = |D|

A-1 = VD-1VT

eA = VeDVT

An = VDnVT Với D và V là ma trận các giá trị riêng và các vectơ riêng đã được chuẩn hóa của

ma trận A Vì ma trận các giá trị riêng là ma trận đường chéo, có nghĩa là các phần tử khác không chỉ nằm trên đường chéo chính Do đó, việc thực hiện nghịch đảo ma trận, tính định thức ma trận và lấy lũy thừa ma trận được đơn giản đi rất nhiều nếu chúng ta thực hiện trên ma trận đường chéo (chỉ thực hiện trên các phần tử đường chéo)

0 0

0

λ

λλ

MLOLL

MM

1 - 2

1 1

0 0

0 0

0

λ

λλ

MLOLL

MM

MLOLL

MM

0

0 0

e

0 0

1

Trang 20

=

n n

n 2

1

0

0

0 0

0 0 λ λ λ M L O L L M M n n V Khái niệm về chuẩn hóa các vectơ riêng: vectơ chuẩn hóa xc của →x bất kỳ bằng: → → → = x x x c Trong đó: →x = →x.→x là chiều dài của vectơ x Hàm eig của MATLAB không cung cấp cho chúng ta ma trận vectơ riêng được chuẩn hóa Do đó, để sử dụng các tính chất của ma trận ở trên chúng ta cần chuẩn hóa chúng trước Ví dụ: A=[3 2/3;2/3 2];

[v,d]=eig(A)

vc=v/norm(v)

det_A=det(d)

ham_det=det(A) d1=d;

d1(1,1)=1/d(1,1); d1(2,2)=1/d(2,2); inv_A=vc*d1*vc' ham_inv=inv(A) d1(1,1)=exp(d(1,1)); d1(2,2)=exp(d(2,2)); exp_A=vc*d1*vc' ham_exp=expm(A) v = 0.4472 -0.8944 -0.8944 -0.4472 d = 1.6667 0

0 3.3333

vc =

0.4472 -0.8944

-0.8944 -0.4472

det_A =

Trang 21

Tại vị trí ban đầu: x1(0) = 0.1, x2 = 0.2

Phương trình dao động của hai khối lượng:

2 1 2 1 2

2

2

2 1 2 1 1

1

1

)(

)(

x k k x k x

m

x x k x k x

2 2 1 2 1

1

)(

)(

x k k x k x m

x k x k k x m

+

=

++

=

2 1 2 1

2 2

2

2 1 2 1

1

)(

)(

x m

k k x m

k x

m

x m

k x m

k k x

+

=

++

1

2

2

2 1

)(

x x m

k

k m k

m

k m

k k x

x

Trang 22

Hay: →=− →x

M

K x&&

Vì hệ dao động điều hòa nên:

2

M

K x

Ngày đăng: 09/01/2014, 16:50

TỪ KHÓA LIÊN QUAN

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

TÀI LIỆU LIÊN QUAN

w