Đề bài: Sử dụng một phần mềm máy tính trợ giúp người dùng nhập vào toạ độ 6
điểm 1 1 , 2 2 ,..., 6 6 trong mặt phẳng và xuất ra giá trị A và B sao
cho tổng bình phương khoảng cách từ 6 điểm này đến đường thẳng Y = A + BX là
nhỏ nhất. Yêu cầu này có gì khác phương pháp bình phương nhỏ nhất học trong
chương trình?
X ,Y
X ,Y
X ,Y
Trả lời:
Thuật toán và source code
X ,Y X ,Y
X ,Y
- Trong mặt phẳng xOy cho 6 điểm 1 1 , 2 2 ,..., 6 6 và đường
thẳng Y = A + BX. Bài toán tìm A,B sao cho tổng bình phương khoảng cách
từ 6 điểm này đến đường thẳng Y = A + BX là nhỏ nhất đưa và về việc tìm
cực tiểu của phiến hàm
6
A Bxk yk
g A,B �
k 1
2
1 B2
� min
- Bài toán quy về việc tìm cực tiểu của hàm hai biến
dừng được xác định từ hệ
g A,B . Tọa độ điểm
�
�g' A 0
�
�g' B 0
-
Việc xác định
g' A
và
g' B
không quá khó, ta sử dụng công thức:
6
A Bxk yk
g A,B �
k 1
1 B2
- Ta chạy vòng lặp từ 1 đến 6 để tính tổng trên:
fAB = 0;
f = (yk - A - B*xk)^2/(1+B^2);
for i=1:length(x)
fAB = fAB + subs(f,{xk yk},{x(i) y(i)});
end
2
- Ta tính
g' A
và
g' B
f1 = diff(fAB,A);
f2 = diff(fAB,B);
- Dùng lệnh solve để tìm tọa độ các điểm dừng
ng = solve(f1,f2,A,B);
6
A Bxk yk
�
- Sau khi có tọa độ các điểm dừng, ta thế vào k 1
gmin = inf;
for i = 1:length(ng.A)
fab = subs(f,{A B},{ng.A(i) ng.B(i)});
sum = 0;
for j = 1:length(x)
sum = sum + subs(fab,{xk yk},{x(j) y(j)});
end
if gmin > sum
gmin = sum;
Amin = ng.A(i);
Bmin = ng.B(i);
end
end
- Vẽ hình để kiểm chứng kết quả
hold on
for i=1:length(x)
plot(x(i),y(i),'-*r','Markersize',10);
end
X = linspace(min(x)-1,max(x)+1,10);
1 B2
2
tìm cực tiểu.
plot(X,A+B*X,'b');
- Xuất kết quả:
fprintf('Y = %.4f + %.4fX\n',A,B);
Source code
%ppt
clc; clear;
syms A B yk xk xk2 yk2 xkyk;
disp('Nhap vao toa do 6 diem');
disp('Nhap hoanh do co dang: x = [x1 x2 x3 x4 x5 x6]')
x = input('x = ');
disp('Nhap tung do co dang: y = [y1 y2 y3 y4 y5 y6]')
y = input('y = ');
% x1 = input('Nhap x1: ');
% y1 = input('Nhap y1: ');
% x2 = input('Nhap x2: ');
% y2 = input('Nhap y2: ');
% x3 = input('Nhap x3: ');
% y3 = input('Nhap y3: ');
% x4 = input('Nhap x4: ');
% y4 = input('Nhap y4: ');
% x5 = input('Nhap x5: ');
% y5 = input('Nhap y5: ');
% x6 = input('Nhap x6: ');
% y6 = input('Nhap y6: ');
% x = [x1 x2 x3 x4 x5 x6];
% y = [y1 y2 y3 y4 y5 y6];
fAB = 0;
f = (yk - A - B*xk)^2/(1+B^2);
for i=1:length(x)
fAB = fAB + subs(f,{xk yk},{x(i) y(i)});
end
f1 = diff(fAB,A);
f2 = diff(fAB,B);
ng = solve(f1,f2,A,B);
gmin = inf;
for i = 1:length(ng.A)
fab = subs(f,{A B},{ng.A(i) ng.B(i)});
sum = 0;
for j = 1:length(x)
sum = sum + subs(fab,{xk yk},{x(j) y(j)});
end
if gmin > sum
gmin = sum;
Amin = ng.A(i);
Bmin = ng.B(i);
end
end
A = double(Amin);
B = double(Bmin);
hold on
for i=1:length(x)
plot(x(i),y(i),'-*r','Markersize',10);
end
X = linspace(min(x)-1,max(x)+1,10);
plot(X,A+B*X,'b');
fprintf('Y = %.4f + %.4fX\n',A,B);
Trả lời câu hỏi: Yêu cầu này có gì khác phương pháp bình phương nhỏ nhất học
trong chương trình?
Phương pháp trình bày ở trên và phương pháp bình phương nhỏ nhất đều có mục
đích tìm cực tiểu của hàm mục tiêu .Đối với hàm số f (x) = A + Bx được học trong
g A,B A Bxk yk
2
chương trình có có hàm mục tiêu là
đơn giản hơn so với
hàm mục tiêu của phương pháp trình bày ở trên , cụ thể hàm mục tiêu có dạng
g A,B
A Bxk yk
2
1 B2
.Việc
này dẫn đến tìm A,B khó hơn , sinh ra thêm một
điểm dừng.
Ví dụ :
1)
X = [1.3
1.8 1.9
2.5 2.8 3.3]
Y = [1.6
1.9 2.5
2.7 3.5 3.9]
2)
X = [2.5 2.8 3.4 3.66 4.5 4.8]
Y = [1.8 2.68 3.5 3.7 4.98 5.2]