Các thao tác trên ma trận và véctơ

Một phần của tài liệu Một số phương pháp tìm đa thức nội suy và ứng dụng (Trang 31)

3 LẬP TRÌNH TÍNH ĐA THỨC NỘI SUY VÀ ỨNG DỤNG

3.1.1 Các thao tác trên ma trận và véctơ

Ở cửa sổ làm việc chính của MATLAB (Command Window), ta thực hiện toàn bộ việc nhập dữ liệu và xuất kết quả tính toán. Dấu nhắc “>>” báo hiệu chương trình sẵn sàng cho việc nhập dữ liệu. Ta kết thúc việc nhập dữ liệu bằng cách nhấn phím Enter. MATLAB sẽ thực thi dòng lệnh mà ta nhập vào và trả kết quả trongCommand

Window. Các số liệu đưa vào môi trường làm việc của MATLAB được lưu lại suốt phiên làm việc cho đến khi gặp lệnh clear all.

Nhập ma trận: Khi nhập ma trận từ bàn phím ta phải tuân theo các quy định sau:

ˆ Ngăn cách các phần tử của ma trận bằng dấu “,” hay dấu cách.

ˆ Dùng dấu “;” để kết thúc một hàng.

ˆ Bao các phần tử của ma trận bằng cặp dấu ngoặc vuông []. Để nhập các ma trận sau: A = 1 2 4 3 −2 5 1 5 3 , B = 1 4 −2 1 , C = 1 4 7 Ta nhập lệnh: >> A= [1 2 3; 3 −2 4; 1 5 3] >> B= [1 4 2 1] >> C = [1; 4; 7]

Xác định kích thước của ma trận: Để xác định kích thước của một ma trận ta dùng lệnh length (trả về kích thước lớn nhất) hay size (số hàng số cột). Ví dụ:

>>size(A) ans= 3 3 >>length(A) ans= 3

Khi ta không chỉ biến chứa kết quả thì MATLAB dùng biến mặc định làans. Ma trận chuyển vị: Để tìm ma trận chuyển vị của ma trậnA, ta nhập lệnh:

>> A0 ans=

1 3 1

2 −2 5

3 4 3

Toán tử ":":Toán tử “:” là một toán tử quan trọng của MATLAB. Nó xuất hiện ở nhiều dạng khác nhau. Biểu thức:

>>1 : 10

ans=

là một véctơ chứa 10số nguyên từ 1đến 10. Còn lệnh:

>>20 : −2 : 4

ans=

20 18 16 14 12 10 8 6 4 tạo một dãy số giảm từ20 đến 4, cách đều nhau 2đơn vị. Thêm nữa, lệnh:

>>0 : 0.1 : 10 tạo một dãy số từ0 đến 10, cách đều nhau 0.1.

Ngoài ra, MATLAB cung cấp các phép toán về hàng và cột của một ma trận. Biểu thức: >> A(:,3) ans= 3 4 5 tham chiếu tới cột thứ ba của ma trận A. Và:

>> A(3,:)

ans=

1 5 3 tham chiếu tới hàng thứ ba của ma trậnA. Còn lệnh:

>> B=A :,[ 1 3 2 ] B = 1 3 2 3 4 −2 1 3 5 tạo ma trậnB từ ma trận A bằng cách đổi thứ tự các cột từ [1 2 3 4] thành [1 3 2 4]. Các toán tử logic và quan hệ:Các phép toán logic và quan hệ trong MATLAB được liệt kê ở Bảng 3.1.

Tạo ma trận bằng hàm có sẵn: MATLAB cho phép chúng ta tạo ra các hàm ma trận bằng các lệnh sau: Ma trận nghịch đảo của ma trậnA: >> inv(A) ans= −1.7333 0.6000 0.9333 −0.3333 0.0000 0.3333 1.1333 −0.2000 −0.5333

Lệnh Giải thích

<(>) Bé hơn hoặc lớn hơn

<= (>=) Bé hơn (lớn hơn) hoặc bằng

== Bằng

∼= Không bằng

| Toán tử logic “or” ∼ Toán tử logic “not” Bảng 3.1: Các phép toán logic và quan hệ

Định thức của ma trận A: >> det(A) ans= 15 Hạng của ma trận A: >> rank(A) ans= 3 Ma trận đơn vị cấp 3: >> eye(3) ans= 1 0 0 0 1 0 0 0 1 Ma trận không kích thước m×n: >> zeros(n, m) 3.1.2 Các lệnh dùng lập trình

Vòng lặp "for": Vòng lặp “for” dùng khi biết trước số lần lặp. Cú pháp như sau: For <chỉ số> = <giá trị đầu> : <mức tăng> : <giá trị cuối>

Ví dụ:

for i= 1 : 10

x(i) =sin(pi/i); end

Ở ví dụ trên,i là chỉ số, giá trị bắt đầu từ 1 đến 10, chương trình sẽ thực hiện tính lần lượt giá trị củax khi i= 1, tiếp theo i = 2,. . . cứ như vậy cho đến trường hợp i= 10 thì vòng lặp “for” kết thúc. Ngoài ra vòng lặp “for” có thể lồng vào như sau:

fori= 1 : 10

for j = 10 : −1 : 1

A(i, j) = (i+j)2; end

end

Vòng lặp "while":Vòng lặp “while” dùng khi không biết trước số lần lặp. Cú pháp như sau:

while <biểu thức điều kiện> <các câu lệnh> end Ví dụ: >> a= 0;b = 1; while(1 +b)>1 a=a/2; b=b+ 1; end

Cấu trúc “if – else – end”: Trong nhiều trường hợp chúng ta cần những câu lệnh được thực hiện theo một điều kiện nào đó. Cũng như các ngôn ngữ lập trình khác, MATLAB cung cấp cấu trúc “if – else – end”, cú pháp của cấu trúc này như sau:

if <biểu thức điều kiện >

<nhóm các câu lệnh nếu điều kiện cho là đúng> else

<nhóm các câu lệnh nếu điều kiện cho là sai > end

Khi có ba hoặc nhiều điều kiện thay đổi, cấu trúc sẽ trở thành: if <biểu thức điều kiện 1>

<nhóm các câu lệnh nếu điều kiện cho là đúng> elseif <biểu thức điều kiện 2>

elseif <biểu thức điều kiện 3>

<nhóm các câu lệnh nếu điều kiện 3 cho là đúng> else

<nhóm các câu lệnh nếu tất cả các điều kiện đã cho là sai > end

Lệnh "break":Lệnh “break” được dùng để thoát khỏi vòng lặp nó đang thực hiện. Khi lệnh “break” xuất hiện thì trong một vòng lặp “for” hoặc “while” hoặc trong các vòng lặp lồng vào nhau thì nó chỉ thoát ra khỏi một vòng lặp chứa nó.

3.1.3 M-files và các hàm sử dụng trong MATLAB

Ở những phần trên ta thực hiện lệnh tại dấu nhắc “>>” trong cửa sổ lệnh của MATLAB. Trong trường hợp số lệnh tăng lên, hoặc khi muốn thay đổi giá trị của một hoặc nhiều biến và thức hiện lại một số lệnh với giá trị mới,. . . Thay vì cứ nhập lại các lệnh tại dấu nhắc thì MATLAB cung cấp một công cụ cho phép chúng ta viết một chương trình gồm nhiều tổ hợp lệnh khác nhau bằng một file văn bản. File này gọi đơn giản làm-file và được lưu dưới dạng là “.m”.

Để tạo ra một m-file, ta chọn New trong bảng chọn file và chọn m-file. Khi đó MATLAB sẽ hiển thị màn hình soạn thảo và chúng ta sẽ nhập các lệnh cần tạo. Ví dụ, chúng ta tạo ra m-file với nội dung như sau:

A 1 2 3; 4 5 6 ;B = 7 5 1; 2 3 4 ;

C =A+B D=A∗B

Sau đó chúng ta chọn Save từ bảng chọn file với tên “vidu.m” để lưu giữ file này. Tại cửa sổ lệnh ta nhập “vidu” và nhấn “Enter” thì các lệnh trong file trên sẽ được thực hiện. m-file còn cho chúng ta chỉnh sửa lại nội dung của file bằng cách mở lại file sau đó thay đổi nội dung cần chỉnh sửa và lưu lại file. Các lệnh được lưu có thể sử dụng về sau. Khi ta đánh lệnh vào cửa sổ lệnh thì lệnh sẽ được thi hành và kết quả sẽ hiện lên màn hình ngay. Nếu ta không muốn cho kết quả hiện lên màn hình thì sau lệnh đó ta đặt thêm dấu “;”.

Tạo hàm trong MATLAB:Viết hàm m-file trong MATLAB được bắt đầu bằng từ “function”, sau đó lần lượt nhập các tham số đầu ra, dấu bằng và tên hàm. Một số dòng cần được chú thích thì phần chú thích phải đặt sau ký tự “%”. Điều quan trọng, tên hàm cần định phải trùng với tên file chứa hàm đó. Ví dụ, để định nghĩa hàm tính giá trị của biểu thức, chúng ta tạo ram-file với nội dung sau:

Function [y]=tinhgiatrihamso(x)

y=4*x^2-5*x+1; % nhập hàm số cần tính end

Sau khi nhập xong nội dung, ta lưu file với tên “tinhgiatribieuthuc.m”. Bây giờ khi ta muốn tính giá trị hàm số tạix= 5, tại cửa sổ lệnh ta nhập:

>> tinhgiatrihamso(5)

ans= 76

Để có thể điều khiển các giá trị của biến nhập vào và các biến đầu ra, ta sử dụng các lệnh sau:

Input nhập dữ liệu đầu vào Disp hiển thị nội dung đầu ra

3.1.4 Các phép tính đối với đa thức

Tìm nghiệm của đa thức:Bài toán thường gặp trong thực tế là tìm nghiệm của đa thức, nghĩa là tìm giá trị của biến để đa thức bằng không. MATLAB cung cấp những công cụ tiện ích để giải quyết nhanh chóng bài toán này, đồng thời MATLAB còn cung cấp những công cụ để tính toán đa thức. Trong MATLAB một đa thức được biểu diễn bằng một vecto hàng các hệ số với bậc giảm dần. Ví dụ đa thức: x3 −3x2+ 15x+ 6 được nhập vào như sau:

>> p=

1 −3 15 6

p=

1 −3 15 6

Để tìm nghiệm của đa thức này, ta sử dụng hàm “roots”:

>> r=roots(p)

r=

1.6847 + 3.6615i

1.6847−3.6615i

−0.3694 + 0.0000i

Trong MATLAB cả đa thức và các nghiệm của nó đều là vecto nên MATLAB ngầm quy ước rằng đa thức là vecto hàng, còn các nghiệm của đa thức là vecto cột. Ngược lại, nếu biết trước nghiệm của một đa thức, ta có thể tìm được đa thức đó với lệnh “poly”. Ví dụ:

>> P =poly(r) % với r là vecto chứa nghiệm của P

P =

1 −3 15 6

Tính giá trị của đa thức:Để tính giá trị của đa thức tại một điểm, ta dùng lệnh “polyval”. Ví dụ, để tính giá trị của đa thức P tại x=x0 ta nhập lệnh sau:

>>y=polyval(P, x0)

Nhân đa thức: Để thực hiện nhân hai đa thức (hay nhân hai ma trận) ta dùng lệnh “conv”. Ví dụ, nhân hai đa thức:

P(x) = x3−3x2+ 15x+ 6 và Q(x) = 9x2+x−8 Ta thực hiện như sau:

>> p= 1 −3 15 6 ;q= 9 1 −8 ; >> r=conv(p, q) r= 9 −26 124 93 −114 −48

Như vậy tích của hai đa thức trên là đa thức:

R(x) = 9x5−26x4+ 124x3−93x2−114x−48.

3.1.5 Vẽ đồ thị trong MATLAB

MATLAB cung cấp cho ta một loạt công cụ để vẽ đồ thị, ở phần này ta chỉ sử dụng lệnh “plot” để vẽ đồ thị các hàm số trong mặt phẳng. Một số lệnh vẽ đồ thị trong MATLAB được liệt kê trong Bảng 3.2.

Lệnh Giải thích

plot vẽ đồ thị cơ bản

title thêm nhãn vào đồ thị xlabel thêm nhãn vào trục x ylabel thêm nhãn vào trục y

hold on cho phép thêm nét vẽ vào đồ thị đã có

hold off bỏ đi cửa sổ đồ hoạ hiện tại và thay vào bằng một đồ thị mới

grid Vẽ lưới trên đồ thị

Bảng 3.2: Một số lệnh vẽ đồ thị

Ví dụ: Để vẽ đồ thị hàm số y=sin(x) chúng ta thực hiện như sau:

>> x= 0 :pi/100 : 2∗pi;

>> y=sin(x);

>> plot(x, y)

>> title(0Đồ thị hàm số y=sin(x)0) Khi đó cửa sổ đồ hoạ sẽ hiển thị như Hình 3.1a.

(a) Đồ thị hàm sốy=sin(x) (b) Đồ thị hàm sốy=sin(x)vày=cos(x)

Hình 3.1: Vẽ đồ thị hàm số trong MATLAB

Bây giờ để vẽ đồ thị hàm sin(x)và cos(x)trên cùng hệ trục toạ độ chúng ta thêm lệnh:

>> z =sin(x);

>> plot(x, y,‘b0, x, z,‘r0)

>> title(0Đồ thị hàm số y=sin(x) và y=cos(x)0) Khi đó cửa sổ đồ hoạ sẽ hiển thị như Hình 3.1b.

Để đặc tả màu và các kiểu đường vẽ, MATLAB cung cấp các tham số như Bảng 3.3.

Màu Dạng đường thẳng Dạng điểm đánh dấu

Màu đỏ: r Nét liền: - Dấu sao: * Màu xanh lá cây: g Nét đứt: – Vòng tròn: o Màu xanh da trời: b Nét chấm: : Điểm: .

Màu đen: k Nét chấm gạch: -. Chữ thập: x

3.2 Lập trình trong MATLAB tính đa thức nội suyLagrange Lagrange

3.2.1 Lập trình tính đa thức nội suy Lagrange

Tạo mộtm-file và lưu dưới tên "NS_Lagrange.m". Nội dung củam-file "NS_Lagrange.m" như sau:

x=input(’Nhap cac moc noi suy x:’);

y=input(’Nhap cac gia tri y tuong ung cua x:’); n=length(x); L=zeros(n,n); format rat for i=1:n V=1; for j=1:n if i∼=j V=conv(V,poly(x(j)))/(x(i)-x(j)); end end L(i,:)=V*y(i); end L; P=sum(L); F=flip(P);

disp(’Da thuc noi suy can tim la: ’) for k=n:-1:1

fprintf(’+(%.6fx.^% d)’,F(k),k-1) end

%Vẽ đồ thị của hàm nội suy plot(x,y,’o’) hold on grid on X=x(1):0.1:x(n); Y=polyval(P,X); plot(X,Y,’r’)

Ví dụ 3.2.1. Cho hàm số y=f(x) thoả mãn:

x −3 −1 2 4 5 6 8

y=f(x) 2 −2 4 3 1 0 5

Tìm đa thức nội suy của f(x).

Chạy m-file trên và nhập lần lượt các giá trịx vày ta tìm được đa thức nội suy và đồ thị như hình 3.2.

» NS_Lagrange

Nhap cac moc noi suy x: [-3 -1 2 4 5 6 8]

Nhap cac gia tri y tuong ung cua x: [2 -2 4 3 1 0 5] Da thuc noi suy can tim la:

+(-0.000627x^6)+(0.009544x^5)+(-0.010973x^4)+(-0.297158x^3)+(0.562706x^2) +(2.291823x^1)+(-0.546898x^0)

3.2.2 Lập trình tính giá trị gần đúng của hàm số tại một số điểm bằng đa thức nội suy Lagrange

Để tính giá trị gần đúng f(c) bằng đa thức nội suy Lagrange ta có thể sử dụng lại kết quả đã có ở phần trên và dùng lệnh polyval để tính giá trị của đa thức nội suy tại c.

Ví dụ 3.2.2. Tính giá trị của đa thức nội suy ởví dụ 3.2.1tại các giá trịx= 9; 15; 12.

Ở ví dụ 3.2.1ta đã tìm được đa thức nội suy P(x)có dạng:

» P =

Columns 1 through 6

-33/52606 68/7125 -67/6106 -1673/5630 341/606 1822/795 Column 7

-379/693

Từ đó để tính giá trị củaP(x)tại các giá trị x= 9; 15; 12, ta sử dụng lệnh polyval. Ở cửa sổ lệnh ta tiếp tục nhập lệnh sau:

» polyval(P,[9 15 12]) ans =

1429/198 -1296 -13003/99

Ngoài ra, để tính giá trị gần đúng tại một số điểm của hàm số bằng đa thức nội suy Lagrange ta có thể viết một chương trình mới chỉ dùng để tính giá trị của các điểm cần nội suy. Tạo m-file với tên “NSLAGRANGE”, nội dung như sau:

function [u]=NSLAGRANGE(x,y,z) n=length(x); for k=1:length(z) L=0; for i = 1:n l=y(i); for j=1:n if i∼=j l=l*(z(k)-x(j))/(x(i)-x(j)); end end L=L+l; end kq(k)=L; end u = kq’; z = [z(:),u(:)]’;

disp(’Ket qua noi suy la:’)

disp(’ Xi Yi’)

fprintf(’%12.6f%12.6f’,z) end

3.3 Lập trình trong MATLAB tính đa thức nội suy Newton

3.3.1 Lập trình tính đa thức nội suy Newton

Để tìmđa thức nội suy Newton tiếnta tạo mộtm-file và lưu dưới tên "NS_Newtontien.m". Nội dung của m-file "NS_Newtontien.m" như sau:

x=input(’Nhap cac moc noi suy x:’);

y=input(’Nhap cac gia tri y tuong ung cua x:’); n=length(x); d=zeros(n); d(i,1)=y(:); format rat for j=2:n for i=1:n-j+1 d(i,j)=(d(i+1,j-1)-d(i,j-1))/(x(i+j-1)-x(i)); end end g=[x(1:n)’,d(:,:)];

disp (’BANG TY SAI PHAN:’)

disp (’ Xi Yi’) disp (g) p=num2str(d(1,1)); xx=x*-1; for j=2:n dau=”; if d(1,j)>=0 dau=’+’; end xt=”; for i=1:j-1 dau2=”; if xx(i)>0 dau2=’+’; elseif xx(i)==0 dau2=’-’; end xt=strcat(xt,’.*(x’,dau2,num2str(xx(i)),’)’); end p=strcat(p,dau,num2str(d(1,j)),xt); end

disp (’Da thuc noi suy Newton tien la:’) disp (p);

hold on

X=x(1):0.01:x(n); P=inline(p); Y=P(X);

plot(X,Y,’r’)

Để tìm đa thức nội suy Newton lùi, chúng ta tạo một m-file và lưu dưới tên "NS_Newtonlui.m". Nội dung củam-file "NS_Newtonlui.m" như sau:

x=input(’Nhap cac moc noi suy x:’);

y=input(’Nhap cac gia tri y tuong ung cua x:’); n=length(x); d=zeros(n); d(:,1)=y(:); format rat for j=2:n for i=n:-1:j d(i,j)=(d(i,j-1)-d(i-1,j-1))/(x(i)-x(i-j+1)); end end g=[x(1:n)’,d(:,:)];

disp (’BANG TY SAI PHAN:’)

disp (’ Xi Yi’) disp (g) p=num2str(d(n,1)); xx=x*-1; xx=flip(uu); for j=2:n dau=”; if d(n,j)>=0 dau=’+’; end xt=”; for i=1:j-1 dau2=”; if xx(i)>0 dau2=’+’; elseif xx(i)==0 dau2=’-’; end xt=strcat(xt,’.*(x’,dau2,num2str(xx(i)),’)’); end p=strcat(p,dau,num2str(d(1,j)),xt); end

disp (’Da thuc noi suy Newton tien la:’) disp (p);

plot(x,y,’o’) hold on X=x(1):0.1:x(n); P=inline(p); Y=P(X); plot(X,Y,’r’)

Ví dụ 3.3.1. Tìm đa thức nội suy Newton của hàm số y=f(x) với các mốc nội suy được cho bởi bảng giá trị sau:

x 2 3 4 5 6 7

y 10 15 12 9 11 14

Để tìm đa thức nội suy Newton tiến, ta chạy m-file "NS_Newtontien.m" sau đó nhập lần lượt các giá trị x và y ta tìm được đa thức nội suy và đồ thị như hình 3.3.

» NS_Newtontien

Nhap cac moc noi suy x:[2 3 4 5 6 7]

Nhap cac gia tri y tuong ung cua x:[10 15 12 9 11 14] BANG TY SAI PHAN:

Xi Yi 2 10 5 -4 4/3 -1/8 -1/20 3 15 -3 0 5/6 -3/8 0 4 12 -3 5/2 -2/3 0 0 5 9 2 1/2 0 0 0 6 11 3 0 0 0 0 7 14 0 0 0 0 0

Da thuc noi suy Newton tien la:

10+5.*(x-2)-4.*(x-2).*(x-3)+1.3333.*(x-2).*(x-3).*(x-4)

-0.125.*(x-2).*(x-3).*(x-4).*(x-5)-0.05.*(x-2).*(x-3).*(x-4).*(x-5).*(x-6)

Để tìm đa thức nội suy Newton lùi, ta cũng làm tương tự và nhận được kết quả sau:

» NS_Newtonlui

Nhap cac moc noi suy x:[2 3 4 5 6 7]

Nhap cac gia tri y tuong ung cua x:[10 15 12 9 11 14] BANG TY SAI PHAN:

Xi Yi 2 10 0 0 0 0 0 3 15 5 0 0 0 0 4 12 -3 -4 0 0 0 5 9 -3 0 4/3 0 0 6 11 2 5/2 5/6 -1/8 0 7 14 3 1/2 -2/3 -3/8 -1/20 Da thuc noi suy Newton lui la:

14+3.*(x-7)+0.5.*(x-7).*(x-6)-0.66667.*(x-7).*(x-6).*(x-5)

Hình 3.3:Đồ thị hàm nội suy ở ví dụ 3.3.1

3.3.2 Lập trình tính giá trị gần đúng của hàm số tại một số

điểm bằng đa thức nội suy Newton

Để tính giá trị gần đúng f(c) bằng đa thức nội suy Newton, ta thay giá trị c vào đa thức nội suy Newton tiến (nếu c gần với x0) và thay giá trị c vào đa thức nội suy

Một phần của tài liệu Một số phương pháp tìm đa thức nội suy và ứng dụng (Trang 31)