Giáo trình Matlab cơ bản - Chương 3: Nội suy và xấp xỉ hàm
Trong thực tế nhiều khi ta cần tính giá trị của hàm y = f(x) tại một giá trị
x trong một đoạn [a, b] nào đó mà chỉ biết một số nhất định các giá trị của
hàm tại một số điểm cho trước. Các giá trị này được cung cấp qua thực
nghiệm hay tính toán. Vì vậy nảy sinh vấn đề toán học là trên đoạn a ≤ x ≤ b
cho một loạt các điểm xi ( i = 0, 1, 2.) và tại các điểm xi này giá trị của hàm là
yi = f(xi) đã biết và ta cần tìm y = f(x) dựa trên các giá trị đã biết đó. Lúc đó ta
cần tìm đa thức :
Pn(x) = aoxn + a1xn‐1 + +an‐1x + an
sao cho Pn(xi) = f(xi) = yi. Đa thức Pn(x) được gọi là đa thức nội suy của hàm
y=f(x). Ta chọn đa thức để nội suy hàm y = f(x) vì đa thức là loại hàm đơn
giản, luôn có đạo hàm và nguyên hàm. Việc tính giá trị của nó theo thuật toán
Horner cũng đơn giản.
g một tín hiệu tương tự, tuỳ thuộc vào
kích thước DFT, chu kì lấy mẫu, khoảng lấy mẫu và đệm zero. So sánh phố
khi giảm chu kì lấy mẫu T từ 0.1s đến 0.05s
232
3. Nội suy bằng các dùng biến đổi Fourrier rời rạc: Ta dùng DFS/DFT để nội
suy dãy x[n] nhận được từ kết quả lấy mẫu tín hiệu ở khoảng cách cách đều.
Thủ tục gồm hai bước: lấy N điểm FFT X(k) của x[n] và dùng công thức:
j2 kt /NT
|k| N/ 2
N / 2 1
j2 kt /NT
k 1
1xˆ(t) X(k)e
N
1 X(0) 2 Real X(k)e X(N/ 2)cos( /T)
N
π
<
− π
=
=
⎧ ⎫⎡ ⎤= + + π⎨ ⎬⎣ ⎦⎩ ⎭
∑
∑
%
(5)
Ta xây dựng hàm nội suy interpdfs():
function [xi,Xi] = interpdfs(T, x, Ws, ti)
%T : chu li lay mau
%x : thu tu roi rac hoa
%Ws: tan so dung chuan (1.0 = pi[rad])
%ti: khoang thoi gian noi suy
if nargin < 4
ti = 5;
end
if nargin 1
Ws = 1;
end
N = length(x);
if length(ti) == 1
ti = 0:T/ti:(N‐1)*T; %khoang con duoc chia cho ti
end
ks = ceil(Ws*N/2);
Xi = fft(x);
Xi(ks + 2:N ‐ ks) = zeros(1,N ‐ 2*ks ‐ 1); %pho da loc
xi = zeros(1,length(ti));
for k = 2:N/2
xi = xi+Xi(k)*exp(j*2*pi*(k ‐ 1)*ti/N/T);
end
xi = real(2*xi+Xi(1)+Xi(N/2+1)*cos(pi*ti/T))/N; %pt.(.5)
Để nội suy ta dùng chương trình ctfourier.m:
clear, clf
233
w1 = pi;
w2 = .5*pi; %hai tan so
N = 32;
n = [0:N ‐ 1];
T = 0.1;
t = n*T;
x = sin(w1*t)+0.5*sin(w2*t)+(rand(1,N) ‐ 0.5); %0.2*sin(20*t);
ti = [0:T/5:(N ‐ 1)*T];
subplot(411), plot(t,x,ʹk.ʹ) %so lieu ban dau
title(ʹSo lieu ban dau va ket qua noi suyʹ)
[xi,Xi] = interpdfs(T,x,1,ti);
hold on, plot(ti,xi,ʹrʹ) %tai tao tin hieu
k = [0:N ‐ 1];
subplot(412), stem(k,abs(Xi),ʹk.ʹ) %pho ban dau
title(ʹPho ban dauʹ)
[xi,Xi] = interpdfs(T,x,1/2,ti);
subplot(413), stem(k,abs(Xi),ʹr.ʹ) %pho da loc
title(ʹPho da locʹ)
subplot(414), plot(t,x,ʹk.ʹ, ti,xi,ʹrʹ) %tin hieu da loc
title(ʹTin hieu da locʹ)
§9. XẤP XỈ HÀM BẰNG PHƯƠNG PHÁP BÌNH PHƯƠNG BÉ NHẤT
1. Khái niệm chung: Trong các mục trước ta đã nội suy giá trị của hàm. Bài
toán đó là cho một hàm dưới dạng bảng số và phải tìm giá trị của hàm tại một
giá trị của đối số không nằm trong bảng.
Trong thực tế, bên cạnh bài toán nội suy ta còn gặp một dạng bài toán
khác. Đó là tìm công thức thực nghiệm của một hàm.
Nội dung bài toán là từ một loạt các điểm cho trước (có thể là các giá trị
của một phép đo nào đó) ta phải tìm một hàm xấp xỉ các giá trị đã cho. Ta sẽ
dùng phương pháp bình phương tối thiểu để giải bài toán.
Giả sử có mẫu quan sát (xi, yi) của hàm y = f(x). Ta chọn hàm f(x) có
dạng:
f(x) = a0f0(x) + a1f1(x) + a2f2(x)... (1)
Trong đó các hàm f0(x), f1(x), f2(x) v.v. là (m+1) hàm độc lập tuyến tính mà ta
có thể chọn tuỳ ý và các hệ số ai là tham số chưa biết mà ta phải xác định dựa
234
vào hệ hàm đã chọn và các điểm quan sát. Sai số giữa trị đo được và trị tính
theo (1) là :
ei = yi ‐ f(xi) (2)
Sai số này có thể âm hay dương tuỳ từng giá trị của yi. Khi dùng phương
pháp bình phương bé nhất ta xét bình phương của sai số tại một điểm:
[ ]2 2i i ie y f(x )= − (3)
Với n điểm tổng bình phương của sai số sẽ là :
[ ]{ }n n 22i i 0 0 i 1 1 i m m i
i 1 i 1
S e y a f (x ) a f (x ) a f (x )
= =
= = − + + ⋅ ⋅ ⋅ +∑ ∑
Rõ ràng S là hàm của các giá trị cần tìm ai và chúng ta sẽ chọn các ai sao
cho S đạt giá trị min, nghĩa là các đạo hàm
ia
S
∂
∂ phải bằng không.
Ta sẽ xét các trường hợp cụ thể.
2. Hàm xấp xỉ có dạng đa thức: Trong trường hợp tổng quát ta chọn hệ hàm
xấp xỉ là một đa thức, nghĩa là:
f(x) = a0 + a1x + a2x2 +∙∙∙+ amxm
Vậy hàm S là :
( )22 mi 0 1 2 mS y a a x a x a x= − + + + ⋅⋅⋅ +
Theo điều kiện đạo hàm 0
a
S
i
=∂
∂ ta nhận được hệ phương trình:
⎪⎪
⎪⎪
⎪⎪
⎪
⎩
⎪⎪
⎪⎪
⎪⎪
⎪
⎨
⎧
=+⋅⋅⋅++
⋅⋅⋅
=+⋅⋅⋅++
=+⋅⋅⋅++
=+⋅⋅⋅++
=+⋅⋅⋅++
∑∑∑ ∑
∑∑∑ ∑
∑∑∑ ∑
∑∑∑ ∑
∑∑ ∑
=== =
−
−
=== =
+
−
+
=== =
+
−
+
=== =
−
+
== =
−
−
n
1i
i
m
i
n
1i
m
i0
n
1i
n
1i
1m2
i1m
m2
im
n
1i
i
3
i
n
1i
3
i0
n
1i
n
1i
2m
i1m
3m
im
n
1i
i
2
i
n
1i
2
i0
n
1i
n
1i
1m
i1m
2m
im
n
1i
ii
n
1i
i0
n
1i
n
1i
m
i1m
1m
im
n
1i
i0
n
1i
n
1i
1m
i1m
m
im
yxxaxaxa
yxxaxaxa
yxxaxaxa
yxxaxaxa
ynaxaxa
Đây là một hệ phương trình tuyến tính. Giải nó ta nhận được các gía trị ai.
Ta xây dựng hàm polynomfit() thực hiện thuật toán trên:
235
function x = polyfits(xData, yData, m)
%Dung de tinh he so cua da thuc xap xi
% Cu phap: x = polyfits(xData, yData, m)
m = m+1;
A = zeros(m);
b = zeros(m, 1);
s = zeros(2*m‐1, 1);
for i = 1:length(xData)
temp = yData(i);
for j = 1:m
b(j) = b(j) + temp;
temp = temp*xData(i);
end
temp = 1;
for j = 1:2*m‐1
s(j) = s(j) + temp;
temp = temp*xData(i);
end
end
for i = 1:m
for j = 1:m
A(i, j) = s(i+j‐1);
end
end
x = A\b;
% Sap xep lai he so tu so mu cao nhat
x = flipdim(x, 1);
Để xấp xỉ một dãy số liệu bằng hàm đa thức ta dùng chương trình
ctpolynomfit.m:
clear all, clc
xData = [0 1 2 3 4];
yData = [1 8 24 63 124];
x = polyfits(xData, yData, 3);
y = 0:0.1:4;
236
z = polyval(xʹ, y);
hold on
plot(y, z,ʹ‐bʹ, xData, yData, ʹroʹ);
3.Hàm dạng Aecx: Khi các số liệu thể hiện một sự biến đổi đơn điệu ta dùng
hàm xấp xỉ là y = Aecx. Lấy logarit hai vế ta có :
lny = lnA + cxlne
Theo điều kiện đạo hàm 0
a
S
i
=∂
∂ ta có hệ phương trình :
⎪⎪⎩
⎪⎪⎨
⎧
=+
=+
∑ ∑∑
∑ ∑
= ==
= =
n
1i
n
1i
ii
n
1i
i
2
i
n
1i
n
1i
ii
ylnxxAlnxc
ylnAlnnxc
Giải hệ phương trình này ta có các hệ số A và c.
Ta xây dựng hàm expfit() để xấp xỉ
function [c,A] = expfit(x, y)
a = sum(x);
b = size(x,2);
c = sum(log(y));
d = sum(x.^2);
e = sum(x.*log(y));
d1 = a*a ‐ d*b;
d2 = c*a ‐ e*b;
d3 = a*e ‐ c*d;
c = d2/d1;
A = exp(d3/d1);
Ta dùng chương trình ctexpfit.m để xấp xỉ dãy số liệu đã cho
clear all, clc
x = [1.2 2.8 4.3 5.4 6.8 7.9];
y = [7.5 16.1 38.9 67 146.6 266.2];
[c, A] = expfit(x, y);
t = 0:0.1:8;
z = A*exp(c*t);
plot(t, z, ʹ‐bʹ, x, y, ʹroʹ);
237
4. Hàm dạng Axq: Khi các số liệu thể hiện một sự biến đổi đơn điệu ta cũng
có thể dùng hàm xấp xỉ là y = Axq. Lấy logarit hai vế ta có:
lny = lnA + qlnx
Theo điều kiện đạo hàm triệt tiêu ta có hệ phương trình :
⎪⎪⎩
⎪⎪⎨
⎧
=+
=+
∑ ∑∑
∑ ∑
= ==
= =
n
1i
n
1i
ii
n
1i
ii
2
n
1i
n
1i
ii
ylnxlnxlnAlnxlnq
ylnAlnnxlnq
Giải hệ phương trình này ta có các hệ số
A và q.
Ta xây dựng hàm powerfit() để xấp xỉ:
function [q, A] = powerfit(x, y)
a = sum(log(x));
b = size(x, 2);
c = sum(log(y));
d = sum(log(x).^2);
e = sum(log(x).*log(y));
d1 = a*a ‐ d*b;
d2 = c*a ‐ e*b;
d3 = a*e ‐ c*d;
q = d2/d1;
A = exp(d3/d1);
Ta dùng chương trình ctpowerfit.m để xấp xỉ dãy số liệu đã cho:
clc
x = [ 1 2 3 4 5];
y = [1.5 15.1 52.5 130.5 253];
[q,A] = powerfit(x, y)
t = 0.1:0.1:5;
z = exp(log(A)+q*log(t));
plot(t, z, ʹ‐bʹ, x, y, ʹroʹ);
5. Hàm lượng giác: Khi quan hệ y = f(x) có dạng tuần hoàn ta dùng hàm xấp
xỉ là tổ hợp tuyến tính của các hàm sin và cosin dạng:
238
∑ ∑
= =
ω+ω+= n
1i
n
1i
ii0 )xisin(b)xicos(aa)x(f
Để đơn giản trước hết ta xét hàm chỉ có một số hạng sin‐cos, nghĩa là :
xsinbxcosaa)x(f 110 ω+ω+=
Hàm S sẽ có dạng :
n 2
i 0 1 1
i 1
S y (a a cos x b sin x)
=
= − + ω + ω⎡ ⎤⎣ ⎦∑
Theo điều kiện đạo hàm triệt tiêu ta có hệ phương trình đối với các hệ số
dạng:
i i 0 i
2
i i i i 1 i i
2
i i i i 1 i i
n cos x sin x a y
cos x cos x cos x sin x a y cos x
sin x cos x sin x sin x b y sin x
⎡ ⎤ ⎡ ⎤ω ω ⎡ ⎤⎢ ⎥ ⎢ ⎥⎢ ⎥ω ω ω ω = ω⎢ ⎥ ⎢ ⎥⎢ ⎥⎢ ⎥ ⎢ ⎥⎢ ⎥ω ω ω ω ω⎣ ⎦⎣ ⎦ ⎣ ⎦
∑ ∑ ∑∑ ∑ ∑ ∑∑ ∑ ∑ ∑
Do:
i isin x cos x0 0
n n
ω ω= =∑ ∑
2 2
i i
i i
sin x cos x1 1
n 2 n 2
cos x sin x
0
n
ω ω= =
ω ω =
∑ ∑
∑
nên hệ phương trình có dạng đơn giản :
0 i
1 i i
1 i i
n 0 0 a y
0 n 2 0 a y cos x
0 0 n 2 b y sin x
⎡ ⎤⎡ ⎤ ⎡ ⎤ ⎢ ⎥⎢ ⎥ ⎢ ⎥ = ω⎢ ⎥⎢ ⎥ ⎢ ⎥ ⎢ ⎥⎢ ⎥ ⎢ ⎥ ω⎣ ⎦ ⎣ ⎦ ⎣ ⎦
∑∑∑
Giải hệ ta có :
i0 1 i i 1 i i
y 2 2a a y cos x b y sin x
n n n
= = ω = ω∑ ∑ ∑
Trong trường hợp tổng quát, một cách tương tự ta có:
∑∑∑ ω=ω== xisinyn
2bxicosy
n
2a
n
ya ii0
Ta xây dựng hàm sinfit() để xấp xỉ:
function [a, b, c, omega] = sinfit(x, y, T)
%T la chu ki
omega = 2*pi/T;
n = size(x,2);
239
a = sum(y)/n;
b = (2/n)*sum(y.*cos(omega*x));
c = (2/n)*sum(y.*sin(omega*x));
Ta dùng chương trình ctsinfit.m để tính:
c ear all, clc
x = [0 0.15 0.3 0.45 0.6 0.75 0.9 1.05 1.2 1.3];
y = [2.2 1.595 1.031 0.722 0.786 1.2 1.81 2.369 2.678 2.614];
T = 1.5;
[a, b, c, omega] = sinfit(x, y, T)
t = 0.:0.01:1.5;
z = a + b*cos(omega*t) + c*sin(omega*t);
plot(t, z,ʹ‐bʹ, x, y, ʹroʹ);
6. Hàm hữu tỉ: Khi quan hệ y = f(x) có dạng đường cong bão hoà hay dạng
arctan, tan v.v ta dùng hàm xấp xỉ là hàm hữu tỉ dạng đơn giản:
xb
axy +=
Lấy nghịch đảo của nó ta có :
a
1
x
1
a
b
y
1 +=
Đặt 1/y = Y, 1/x = X, b/a = B và 1/a = A phương trình trên sẽ có dạng:
Y = A + BX
và là một đa thức bậc một. Do vậy ta có hệ phương trình đối với các hệ số A
và B là:
⎪⎪⎩
⎪⎪⎨
⎧
=+
=+
∑ ∑∑
∑ ∑
= ==
= =
n
1i
n
1i ii
2
i
n
1i i
n
1i
n
1i ii
yx
1
x
1B
x
1A
y
1
x
1BnA
và từ đó tính được a và b.
Ta xây dựng hàm racfit() để xấp xỉ:
function [a, b] = racfit(x, y)
a1 = size(x, 2);
b1 = sum(1./x);
c1 = sum(1./y);
240
d1 = sum(1./x.^2);
e1 = sum((1./x).*(1./y));
del = a1*d1 ‐ b1*b1;
del1 = c1*d1 ‐ e1*b1;
del2 = a1*e1 ‐ b1*c1;
A = del1/del;
B = del2/del;
a = 1/A;
b = B/A;
Để xấp xỉ ta dùng chương trình ctracfit.m:
clear all, clc
x = [1 2 3 4 5];
y = [0.3333333 0.5 0.6 0.66666 0.7142857];
[a, b] = racfit(x, y)
t = 0.:0.01:5;
z = a*t./(b+t)
plot(t, z,ʹ‐bʹ, x, y, ʹroʹ);
File đính kèm:
giao_trinh_matlab_co_ban_chuong_3_noi_suy_va_xap_xi_ham.pdf

