Báo cáo Phương Pháp tính thầy Phùng Trọng Thực Đai Học BK HCM chi tiết nhất có hình vẽ bằng matlab....................................................................................................... xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Trang 1Đề 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 X ,Y1 1
, X ,Y2 2 , , X ,Y6 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?
Trả lời:
Thuật toán và source code
- Trong mặt phẳng xOy cho 6 điểm X ,Y1 1
, X ,Y2 2 , , X ,Y6 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 2 2
k k k
A Bx y
B
�
- Bài toán quy về việc tìm cực tiểu của hàm hai biến g A,B Tọa độ điểm dừng được xác định từ hệ
0 0
g' A g' B
�
�
�
- Việc xác định g' A và g' B không quá khó, ta sử dụng công thức:
6 2 2
k k k
A Bx y
g A,B
B
�
- 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
Trang 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);
- Sau khi có tọa độ các điểm dừng, ta thế vào
6
2
k k k
A Bx y
B
�
tìm cực tiểu 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);
Trang 3- Xuất kết quả:
fprintf('Y = %.4f + %.4fX\n',A,B);
Source code
%ppt
clc; clear;
syms AByk xk xk2yk2xkyk;
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);
Trang 4f2 = 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
chương trình có có hàm mục tiêu là 2
k k
g A,B A Bx y đơ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
Trang 5 1 2 2
k k
A Bx y
g A,B
B
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)
Trang 6X = [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]