已知22个点的经纬度,存在一个点到这22个点的距离之和最小,用Matlab求这个点的经纬度和最小的距离
问题描述:
如何定义函数?
能否利用费马点,如果可以,如何编写代码
如何画出这22个点和费马点在经纬图的点
答
可以参考早年我写的博客:
clc
clear
Data = [ 65.4000 28.3000
62.9000 34.9000
39.5000 49.9000
43.3000 49.3000
28.5000 32.9000
75.3000 41.0000
52.8000 30.2000
57.5000 37.3000
67.9000 26.9000
79.2000 23.1000
21.3000 38.1000
62.8000 24.1000
54.5000 50.8000
75.2000 26.4000
70.7000 27.7000
71.1000 51.6000
63.5000 24.5000
69.3000 38.8000
42.0000 43.1000
57.2000 42.3000
76.8000 31.4000
76.2000 27.8000
95.2000 34.1000
93.0000 33.8000
38.9000 65.3000
43.5000 49.7000
66.0000 45.8000
64.3000 52.9000
55.4000 56.4000
73.2000 27.8000
18.5000 45.5000
24.0000 39.6000
27.0000 55.6000
38.0000 72.4000
67.2000 65.3000
94.0000 17.5000
50.2000 43.8000
40.1000 66.0000 ];
fun = @(x) sum( sqrt ( ( x(1)-Data(:,1) ).^2 + ( x(2)-Data(:,2) ).^2 ) ); % 以距离和为目标函数
x0(1) = mean(Data(:,1)); % 以横坐标平均值为横坐标初始值
x0(2) = mean(Data(:,2)); % 以横坐标平均值为横坐标初始值
x1 = fminsearch(fun,x0); % 优化函数fun,找出最小值
plot(Data(:,1),Data(:,2),'o') % 画出30个离散点
hold on
plot(x1(1),x1(2),'r*','LineWidth',5) % 画出最优点
y1 = fun(x1); % 求解最优点距离平方和
for ii = 1:length(Data)
line([x1(1) Data(ii,1)],[x1(2) Data(ii,2)],'color','k')
end
text(x1(1),x1(2),['最短距离和为:' num2str(y1)] ) % 输出最优值提示
legend('数据点','最优点','最优点与给定点连线') % 标注
juli = sqrt ( ( x1(1)-Data(:,1) ).^2 + ( x1(2)-Data(:,2) ).^2 );
disp(' X: Y: 距离: ')
A = [Data,juli];
disp(A)