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.

pdf31 trang | Chuyên mục: MATLAB | Chia sẻ: tuando | Lượt xem: 954 | Lượt tải: 0download
Tóm tắt nội dung Giáo trình Matlab cơ bản - Chương 3: Nội suy và xấp xỉ hàm, để xem tài liệu hoàn chỉnh bạn click vào nút "TẢI VỀ" ở trê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:

  • pdfgiao_trinh_matlab_co_ban_chuong_3_noi_suy_va_xap_xi_ham.pdf
Tài liệu liên quan