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

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 40 - 54)

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

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 Newton lùi (nếu cgần với xn).

Ví dụ 3.3.2. Từ 6 mốc nội suy đã cho ở ví dụ 3.3.1. Hãy tính giá trị gần đúng của

f(x) tại x= 6.8.

Vì x = 6.8 gần cuối bảng nên ta sử dụng đa thức nội suy Newton lùi để tính giá trị gần đúng củaf(6.8).

Sau khi ta chạy m-file và tìm đa thức nội suy Newton lùi như ví dụ 3.3.1, để tính giá trị gần đúng củaf(8), ở cửa sổ lệnh ta nhập:

» P(6.8) ans =

3450/247

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 Newton 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 “NSNT”, nội dung như sau:

function [u]=NSNT(x,y,z)

% x = [x1,x2,...,xn] mảng chứa các mốc nội suy x

% y = [y1,y2,...,yn] mảng chứa các giá trị y tương ứng của x % z = [z1,z2,...] mảng chứa các giá trị cần nội suy x1 <= z <= xn n=length(x); d=zeros(n); d(:,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 xt=1; yi=d(1,1); for j =1: n-1 xt=xt.*(z-x(j)); yi=yi+d(1,j+1)*xt; end p=yi’; z = [z(:),u(:)]’;

disp (’Ket qua noi suy:’)

disp (’ Xi Yi’)

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

3.4 Ứng dụng đa thức nội suy để nội suy một số

giá trị trong bảng số liệu

Trong thực tế, khi chúng ta đo đạc hay thu thập số liệu có thể sẽ gặp một số vấn đề như: số liệu không đo được, số liệu bị mất đi,... Một trong những cách khắc phục vấn đề đó là chúng ta sử dụng phép nội suy đề bù lại những số liệu đã mất hoặc không đo đạc được. Ở phần này chúng ta sử dụng bảng tính Excel kết hợp với lập trình MATLAB để thực hiện.

3.4.1 Nhập số liệu thu thập được

Giả sử bảng số liệu ta thu thập được là các giá trị của hai biến phụ thuộc x và y. Sau quá trình đo đạc hay thu thập, ta nhập các giá trị vào bảng Excel như sau:

ˆ Cột đầu tiên là các giá trịx (x1, x2, . . . , xn),

ˆ Cột thứ hai là các giá trị y tương ứng của x,

Vậy ta cần tìm giá trị ở các ô màu đỏ.

3.4.2 Ứng dụng đa thức nội suy để tìm giá trị trong bảng số

liệu

Để tìm được giá trị của các ô màu đỏ (các giá trị cần nội suy), ta sử dụng bảng số liệu đã nhập ở Excel kết hợp với lập trình MATLAB. Ta thực hiện theo các bước sau:

Bước 1: Lấy dữ liệu ở cột y đã nhập cho qua cột thứ 3 bên cạnh. Sau đó ở các ô

màu đỏ ta thay giá trị là 0 bằng lệnh IFERROR. Và lưu lại file Excel, ví dụ ta lưu file Excel với tên "Dulieu1.xlsx". (Hình 3.4)

Hình 3.4:Bảng số liệu thu thập được.

Bước 2: Ta sử dụng lập trình MATLAB để thực hiện việc nội suy. Chúng ta tạo

m-file và lưu dưới tên "NS_DuLieu1.m". Nội dung của m-file này như sau:

% Chương trình nội suy dữ liệu bằng phương pháp nội suy Lagrange a=xlsread(’Dulieu1.xlsx’); % Đọc dữ liệu ở file "Dulieu1.xlsx" đã lưu k=0;m=0; for i=1:length(a) if a(i,3)∼=0 k=k+1; x(k,1)=a(i,1); y(k,1)=a(i,3); else m=m+1; z(m,1)=a(i,1); end end

m=0;

for i=1:length(a)

if a(i,3)==0 % nội suy các ô có giá trị là 0 ở file Excel m=m+1;

a(i,3)=u(m); end

end

disp ’ket qua noi suy’,a(:,3)

save (’KQ NS DL1.txt’,’a’,’-ascii’,’-tabs’) % lưu kết quả dưới dạng file "KQ NS DL1.txt"

Chạy m- file trên ta nhận được kết quả nội suy được lưu ở file "KQ NS DL1.txt" trong cùng thư mục.

Ví dụ 3.4.1. [11] Cho bảng dữ liệu mực nước ở Vũng Tàu trong 24h như hình 3.5 . Hãy tìm giá trị nội suy ở các ô còn trống.

Hình 3.5: Dữ liệu mực nước ở Vũng Tàu trong 24h

Bước 1: Sao chép các giá trị ở cột y qua cột thứ 3 bên cạnh và ở các ô trống ta thay giá trị là 0 bằng lệnh IFERROR. Sau đó lưu lại file Excel với tên "Dulieu1.xlsx". (Hình 3.7a)

Bước 2: Chạy m-file "NS_DL1.m". Khi đó MATLAB sẽ xuất kết quả ở file "KQ NS DL1.txt" trong cùng thư mục với m-file trên.

Bước 3: Mở file "KQ NS DL1.txt" dưới dạng bảng tính Excel. Chuyển các số liệu ở các cột dưới dạng số. Ta có thể vẽ đồ thị với các dữ liệu sau khi nội suy để quan sát kết quả. (Hình 3.7b)

(a) Sử dụng lệnh IFERROR (b) Kết quả nội suy dữ liệu Hình 3.6: Thực hiện ví dụ 3.4.1

Ví dụ trên đã thực hiện nội suy dữ liệu bằng phương pháp Lagrange. Ngoài ra, chúng ta cũng có thể thực hiện việc nội suy dữ liệu bằng phương pháp Newton. Bằng cách tạo m-file với tên "NS_DL2.m" và thực hiện tương tự như trên. Nội dung của

m-file này như sau:

% Chương trình nội suy dữ liệu bằng phương pháp nội suy Newton

a=xlsread(’Dulieu1.xlsx’); % Đọc dữ liệu ở file "Dulieu1.xlsx" đã lưu k=0;m=0; for i=1:length(a) if a(i,3)∼=0 k=k+1; x(k,1)=a(i,1); y(1,k)=a(i,3); else m=m+1; z(m,1)=a(i,1); end end

[u]=NSNT(x,y,z); % hàm [u] này đã được tạo ở mục 3.3.2 m=0;

for i=1:length(a)

if a(i,3)==0 % nội suy các ô có giá trị là 0 ở file Excel m=m+1;

a(i,3)=u(m); end

end

disp ’ket qua noi suy’,a(:,3)

save (’KQ NS DL2.txt’,’a’,’-ascii’,’-tabs’) % lưu kết quả dưới dạng file KQ NS DL2.txt

3.5 Ứng dụng đa thức nội suy để tìm nghiệm xấp xỉ của phương trình

Bài toán: Cho hàm số f(x) dưới dạng:

x x0 x1 x2 ... xn y y0 y1 y2 ... yn

Tìm nghiệmx của phương trình:f(x) =y. (*)

Thông thường để tìm nghiệm xấp xỉ cho phương trình (*), trước hết ta tìm đa thức nội suy Pn(x) cho f(x) và giải phương trình Pn(x) = y. Khi đó nghiệm của phương trìnhPn(x) = ycó thể xem là nghiệm xấp xỉ của phương trình (*). Trong nhiều trường hợp, đặc biệt là khi n lớn, việc giải phương trình Pn(x) = y cũng là một công việc không hề đơn giản. Trong phần này, chúng ta nghiên cứu một phương pháp khác để tìm nghiệm xấp xỉ cho phương trình (*), cụ thể chúng ta sẽ sử dụng phép nội suy ngược. Khi sử dụng phép nội suy ngược, chúng ta sẽ tìm được nghiệm xấp xỉ của phương trình ban đầu mà không cần giải bất kì phương trình trung gian nào. Đây chính là một trong những ưu điểm của phương pháp sử dụng phép nội suy ngược.

Phương pháp được mô tả như sau:

Bước 1: Từ bảng số liệu của f ta có bảng số liệu cho f−1 (hàm ngược của f).

yi y0 y1 y2 ... yn f−1(yi) x0 x1 x2 ... xn

Bước 2: Tìm đa thức nội suy bậc không quán cho f−1.

fn(y)≈f−1(y).

Khi đó nghiệm của phương trình (*) được xấp xỉ bởi:

x=f−1(y)≈fn(y).

Từ lược đồ trên, ta thấy để tìm được nghiệm xấp xỉ cho phương trình (*) và bài toán nội suy ở bước 2 có nghiệm thì hàm f cần thỏa mãn 2 điều kiện sau:

ˆ f có hàm ngược,

ˆ y0, y1, . . . , yn phân biệt → (*) có nghiệm duy nhất.

Để tìm đa thức nội suy thì từ bảng số liệu của f ta suy ra bảng số liệu cho f−1

(hàm ngược của f ) và bằng phương pháp nội suy Newton hoặc phương pháp nội suy Lagrange ta tìm đa thức nội suy.

Ví dụ 3.5.1. Cho hàm số f dưới dạng bảng giá trị:

x 3 4 5 6 y 1 3 1 4 1 5 1 6 Tìm x sao cho f(x) = 0.23.

Cách 1: Đầu tiên ta tìm đa thức nội suy P3(x) cho f(x). Cụ thể ở đây ta tìm đa thức nội suy Lagrange cho f(x). Chạym-file "NS_Lagrange" và nhập các giá trịx, y

tương ứng ta thu được kết quả:

P3(x) = −1 360x 3+ 1 20x 2+−119 360 x+ 19 20.

Khi đó nghiệm của phương trìnhP3(x) = 0.23có thể xem là nghiệm xấp xỉ của phương trình f(x) = 0.23. Ta có: P3(x) = −1 360x 3+ 1 20x 2+−119 360 x+ 19 20 = 0.23 ⇒ −1 360x 3+ 1 20x 2+−119 360 x+ 18 25 = 0

Để tìm nghiệm của phương trình trên ta sử dụng hàm roots, ở cửa sổ lệnh, ta nhập:

»roots([-1/360 1/20 -119/360 18/25])

Kết quả: x≈4.34178.

Cách 2: Từ bảng số liệu của f ta có bảng số liệu cho f−1 (hàm ngược của f):

y 13 14 15 16 f−1(y) 3 4 5 6

Chạy m-file "NS_Lagrange" và tính giá trị gần đúng của f−1(0.23), ta thu được kết quả:

f−1(0.23) = 2948

679 ≈4.34168

KẾT LUẬN

Khoá luận tốt nghiệp "Một số phương pháp tìm đa thức nội suy và ứng dụng" đã thực hiện được những nội dung sau:

1. Hệ thống lại một số kiến thức cơ bản về đa thức và hàm số liên quan đến lý thuyết nội suy.

2. Trình bày lý thuyết các phương pháp tìm đa thức nội suy, cụ thể là đa thức nội suy Lagrange và đa thức nội suy Newton. Trong mỗi phương pháp đều đưa ra các ví dụ minh hoạ cụ thể.

3. Giới thiệu lập trình MATLAB và đưa ra các chương trình giúp cho việc tìm đa thức nội suy được thực hiện một cách nhanh chóng và dễ dàng hơn. Đồng thời, khoá luận cũng trình bày một số ứng dụng của đa thức nội suy như: nội suy dữ liệu và tìm nghiệm xấp xỉ của phương trình.

Mặc dù có nhiều cố gắng, nỗ lực trong việc tìm tòi và nghiên cứu nhưng kiến thức bản thân còn hạn chế nên khoá luận không thể tránh khỏi những thiếu sót. Em rất mong nhận được sự đóng góp quý báu từ các thầy cô giáo và các bạn sinh viên.

TÀI LIỆU THAM KHẢO Tài liệu Tiếng Việt

[1] Nguyễn Đình Trí (Chủ biên), Tạ Văn Đĩnh, Nguyễn Hồ Quỳnh,Toán học cao cấp 1, Nhà xuất bản Giáo Dục, 2006.

[2] Hoàng Xuân Sính,Đại số đại cương. Nhà xuất bản Giáo Dục, 2016. [3] Nguyễn Minh Chương, Giải tích số, Nhà xuất bản Giáo dục, 2009. [4] Tạ Văn Đĩnh, Phương pháp tính. Nhà xuất bản Giáo Dục, 1999.

[5] Hoàng Xuân Huấn, Các phương pháp số, Nhà xuất bản Đại học Quốc gia Hà Nội, 2004.

[6] Tôn Nữ Lê Diệu Thảo, Luận văn thạc sĩ Khoa học "Phần mềm toán học MAPLE và ứng dụng nghiên cứu đa thức nội suy", Đại học Đà Nẵng, 2015.

[7] TS. Phan Đăng Cầu, Ths. Phan Thị Hà, Bài giảng phương pháp số, Học viện công nghệ bưu chính viễn thông Hà Nội, 2006.

Tài liệu Tiếng Anh

[8] J. Douglas Faires & Richard L. Burden,Numerical Methods , Third Edition, 2002. [9] G.R.Lindfield & J.E.T.Penny,Numerical Methods Using MATLAB, Third Edition,

2012.

Tài liệu trên Internet

[10] www.slideshare.net/thanhchuongnl/chuong04 [11] www.youtube.com/watch?v=rtyKKJIU2lc [12] www.mathworks.com

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 40 - 54)

Tải bản đầy đủ (PDF)

(54 trang)