15.1 Mịn hoá đ−ờng cong−ờng cong−ờng cong−ờng cong
Phương pháp mịn hoá đường cong liên quan đến việc trả lời hai câu hỏi cơ bản, đó là đ-
−ờng cong thế nào thì phù hợp với dữ liệu nhất và câu hỏi thứ hai là phải sử dụng loại đ−ờng cong nào. ‘Phù hợp nhất‘ có thể hiểu theo nhiều cách và do đó có nhiều đường cong, vì
vậy chúng ta phải bắt đầu từ đâu?. Nếu ‘phù hợp nhất‘ là giảm nhỏ đến mức tối thiểu tổng sai số quân ph−ơng tại mỗi điểm biểu diễn dữ liệu, so với giá trị t−ơng ứng trên đ−ờng cong thì đ−ờng cong phù hợp nhất sẽ là một đ−ờng thẳng về mặt toán mà nói ph−ơng pháp này
được gọi là phương pháp xấp xỉ đa thức. Nếu như khái niệm này còn khó hiểu đối với bạn thì
xin hãy xem lại hình 15.1 khoảng cách theo chiều dọc giữa đ−ờng cong dữ liệu và các điểm biểu diễn dữ liệu gọi là sai số của điểm đó, bình phương khoảng cách này lên và cộng tất cả
chúng lại ta đợc tổng bình phương sai số. Đường cong chấm chấm là đường cong làm cho bình ph−ơng sai số là nhỏ nhất và đ−ợc gọi là đ−ờng cong phù hợp nhất. Từ ‘quân ph−ơng bé nhất‘ là cách nói tắt của cụm từ ‘Tổng bình phơng sai số bé nhất‘.
H×nh 15.1 H×nh 15.1 H×nh 15.1 H×nh 15.1
Trong MATLAB hàm polyfitpolyfitpolyfitpolyfit sẽ giải quyết vấn đề xấp xỉ đường cong quân phương bé nhất. Để minh hoạ cho việc sử dụng hàm này, chúng ta hãy bắt đầu bằng các dữ liệu đã có ở trong hình vẽ.
>> x = [0 .1 .2 .3 .4 .5 .6 .7 .8 .9 1];
>> y =[-.447 1.978 3.28 6.16 7.08 7.34 7.66 9.56 9.48 9.30 11.2];
Để sử dụng hàm polyfitpolyfitpolyfitpolyfit, chúng ta phải truyền cho nó dữ liệu trên và bậc của đa thức mà chúng ta muốn phù hợp với dữ liệu, nếu chúng ta chọn bậc n là 1 thì đ−ờng cong xấp xỉ gần nhất sẽ là đ−ờng thẳng. Ph−ơng pháp này đ−ợc gọi là ph−ơng pháp xấp xỉ tuyến tính. Mặt khác nếu chúng ta chon n=2 thì chúng ta sẽ tìm đ−ợc một tam thức bậc hai. Ví dụ:
>> n = 2;
>> p = polyfit(x,y,n) p =
-9.8108 20.1293 -0.0317
Kết quả của polyfitpolyfitpolyfitpolyfit là một vector biểu diễn hệ số của một đa thức bậc hai. ở đây đa thức đó là
y= -9.8108x2+20.1293x-0.0317. Để so sánh mức độ xấp xỉ của đa thức với các điểm dữ liệu chúng ta hãy vẽ hai đ−ờng:
>> xi = linspace(0,1,100);
Dòng này để tạo ra dữ liệu trục x để chuẩn bị vẽ đa thức
>> z = polyval(p,xi)
Dòng này gọi hàm polyvalpolyvalpolyvalpolyval của MATLAB để tính giá trị của đa thức p tại các điểm xi
>> plot(x,y,'-o',xi,z,':')
Vẽ các điểm có toạ độ là x và y, đánh dấu các điểm này bằng chữ ‘o‘ sau đó nối các điểm này bằng các đoạn thẳng. Ngoài ra nó còn vẽ dữ liệu của đa thức xi và z dùng đ−ờng chấm chÊm.
>> xlabel('x'),ylabel('y=f(x)')
>> title('Second Oder Curver Fitting')
Tạo nhãn cho đường cong vừa vẽ. Kết quả của các lệnh trên đây là một đồ thị đã được giới thiệu ở trên.
Việc chọn bậc của đa thức không phải là ngẫu nhiên, nếu có hai điểm thì xác định một đ-
−ờng thẳng, tức là một đa thức bậc nhất, ba điểm thì xác định một parabol bậc hai. Cứ nh−
vậy, để xác định một đường cong bậc n, cần có n+1 điểm. Vì vậy, ở trong ví dụ trước có 11
điểm dữ liệu, chúng ta có thể chọn bậc của đa thức là từ 1 đến 10. Tuy nhiên, do tính chất số học của các đa thức bậc cao rất phức tạp nên bạn không nên chọn bậc của đa thức lớn hơn mức cần thiết. Ngoài ra khi bậc của đa thức tăng lên thì sự xấp xỉ càng kém hơn, vì vậy các đa thức bậc cao có thể bị đạo hàm nhiều lần trước khi đạo hàm của chúng bằng không.
Ví dụ cho một đa thức bậc 10:
>> pp = polyfit(x,y,10) pp =
1.0e+006 *
Columns 1 through 7
-0.4644 2.2965 -4.8773 5.8233 -4.2948 2.0211 -0.6032 Columns 8 through 11
0.1090 -0.0106 0.0004 -0.0000
>> format short e % change display format
>> pp.' % display polynomial coefficients as a column ans =
-4.6436e+005 2.2965e+006 -4.8773e+006 5.8233e+006 -4.2948e+006 2.0211e+006 -6.0322e+005 1.0896e+005 -1.0626e+004 4.3599e+002 -4.4700e-001
Lưu ý kích thước của vector hệ số đa thức trong trường hợp này so với đường cong bậc hai trước đây, đồng thời cũng lu ý sự khác nhau giữa số hạng nhỏ nhất và số hạng lớn nhất trong đa thức vào khoảng 107. Hãy thử vẽ đ−ờng cong này và so sánh với dữ liệu gốc và với
®−êng cong bËc hai.
>> zz = polyval(pp,xi); % evalute 10th order polynomial
>> plot(x,y,'o',xi,z,‘:‘,xi,zz) % plot data
>> xlabel('x'),ylabel('y=f(x)')
>> title('2nd and 10th Order Curver Fitting')
H×nh 15.2 H×nh 15.2 H×nh 15.2 H×nh 15.2
Trên hình 15.2, dữ liệu gốc được đánh dấu o, đường cong bậc hai được vẽ bằng nét chấm chấm, còn đường cong bậc 10 được vẽ bằng nét đậm. Để ý đến nét gợn sóng xuất hiện giữa các điểm dữ liệu bên phía trái và bên phía phải của đ−ờng cong bậc 10. Dựa vào
đồ thị này thì rõ ràng rằng cái chiết lý càng nhiều càng tốt không thể áp dụng đ−ợc ở đây.