16/09/2015
5
Nguyen Quang Hoang
Department of Applied Mechanics
Nội suy bằng đa thức
17
Lệnh polyfit(x,y,n) cho ta một đa thức bậc n mà đồ thị của nó là đường
gần với đường tạo ra khi nối các điểm cho bởi bộ số liệu, còn nội suy đa
thức cũng cho ta một đường cong nhưng đi qua các điểm số liệu đó. Có
nhiều phương pháp để tạo ra đa thức đi qua các điểm cho như phương
pháp nội suy theo công thức Lagrange, phương pháp Newton, phương
pháp
Neville,
phương pháp nội suy với đường spline bậc 3, .... Chi tiết
về các phương pháp này có thể xem trong các tài liệu về giải tích số và
phương pháp số.
Trong
phần này chỉ trình bày việc sử dụng các lệnh
interp
của Matlab
để thực hiện tìm các giá trị nội suy từ các số liệu sẵn có. Bài toán đặt ra
là cho
biết các giá trị tương ứng của hai đại lượng x và y như trong bảng
số liệu
x
x1
x2
x3
…
xn
y
y1
y2
y3
…
yn
Nguyen Quang Hoang
Department of Applied Mechanics
Nội suy bằng đa thức
18
Hãy tìm giá trị của biến y* ứng với giá trị nào đó của biến x* với x1<= x*
<= xn. Bài toán này trong Matlab được giải quyết dễ dàng với lệnh
interp. Cách gọi lệnh này như sau:
y_star = interp1(x,y,x_star)
Nếu x là véctơ gồm các phần tử nguyên từ 1 đến n (x = 1:n), với n =
length(y), thì ta có thể gọi lệnh
y_star = interp1(y,x_star)
Để nói rõ hơn phương pháp nào được sử dụng trong việc nội suy này ta
sử dụng cú pháp
y_star = interp1(x, y, x_star, method)
với method được chọn là một trong các phương pháp sau
'nearest' -
nội suy theo lân cận gần nhất
'linear' -
nội suy tuyến tính
'spline' -
nội suy sử dụng đường spline bậc 3
'pchip' -
nội suy bậc 3 từng đoạn
'cubic' -
tương tự như 'pchip'
Nguyen Quang Hoang
Department of Applied Mechanics
Nội suy bằng đa thức
19
Nếu giá trị x* nằm ngoài khoảng [x1, xn], khi đó ta gọi phép tính giá trị y*
= y(x*) là phép tính ngoại suy và sử dụng lệnh với cú pháp:
y_star = interp1(x, y, x_star, method, 'extrap')
Sau đây xét ví dụ:
>> x = 1:20; y = sin(x);
>> x_star = 1.5;
>> y_star = interp1(x,y, x_star)
y_star = 0.8754
>> y_star = interp1(x,y, x_star, 'linear')
y_star = 0.8754
>> y_star = interp1(x,y, x_star, 'cubic')
y_star = 0.9008
>> y_star = interp1(x,y, x_star, 'nearest')
y_star = 0.9093
>> y_star = interp1(x,y, x_star, 'spline')
y_star = 1.0200
Nguyen Quang Hoang
Department of Applied Mechanics
Nội suy bằng đa thức
20
Như thế các phương pháp nội suy khác nhau sẽ cho ta các kết quả khác
nhau. Để thấy rõ hơn kết quả của các phương pháp nội suy, ta xét ví dụ
sau
x = 0:8; y = sin(x); plot(x,y,'-ko'), hold on
xi = 0:0.1:8;
yi1 = interp1(x,y, xi, 'linear');
yi2 = interp1(x,y, xi, 'cubic');
yi3 = interp1(x,y, xi, 'spline');
plot(xi,yi1,'-k','linewidth',1.5)
plot(xi,yi2,'-r','linewidth',1.5)
plot(xi,yi3,'-b','linewidth',1.5), grid on
xlabel('x'), ylabel('y'), axis([0 8, -1.1 1.1])
legend('points','linear','cubic','spline')