作业帮 > 综合 > 作业

用MATLAB编程解决最短距离问题(很急,

来源:学生作业帮 编辑:作业帮 分类:综合作业 时间:2024/05/17 23:20:12
用MATLAB编程解决最短距离问题(很急,
已知四个点A,B,C,D的具体位置A(0,0),B(0,3),C(8,1),D(10,5),求两个点H1,H2的具体位置,使AH1+BH1+H1H2+H2C+H2D为最短.
这是一个简单的无约束优化问题,代码附后,求出来的点如图所示.代码中的大部分是和绘图有关的,涉及计算的部分其实很少.

function zd
A = [0, 0];
B = [0, 3];
C = [8, 1];
D = [10, 5];
x0 = [1 1 1 1];

figure(gcf)
clf
set(gcf,'DoubleBuffer','on');
plot(A(1), A(2), 'o');
hold on
plot(B(1), B(2), 'o');
plot(C(1), C(2), 'o');
plot(D(1), D(2), 'o');
text(A(1), A(2), '  A', 'Horiz', 'left')
text(B(1), B(2), '  B', 'Horiz', 'left')
text(C(1), C(2), '  C', 'Horiz', 'left')
text(D(1), D(2), 'D  ', 'Horiz', 'right')
h.H1 = plot(x0(1), x0(2), 'rp');
h.H2 = plot(x0(3), x0(4), 'rp');
h.AH1 = plot([A(1) x0(1)], [A(2) x0(2)], 'g');
h.BH1 = plot([B(1) x0(1)], [B(2) x0(2)], 'g');
h.H1H2 = plot([x0(1) x0(3)], [x0(2) x0(4)], 'g');
h.H2C = plot([C(1) x0(3)], [C(2) x0(4)], 'g');
h.H2D = plot([D(1) x0(3)], [D(2) x0(4)], 'g');
axis equal

opt = optimset('Display', 'iter');
x = fminunc(@objfun, x0, opt, A, B, C, D, h);

function f = objfun(x, A, B, C, D, h)
H1 = x(1:2);
H2 = x(3:4);
f = dist(A, H1) + dist(B, H1) + dist(H1, H2) + dist(H2, C) + dist(H2, D);

set(h.H1, 'XData', H1(1), 'YData', H1(2));
set(h.H2, 'XData', H2(1), 'YData', H2(2));
set(h.AH1, 'XData', [A(1) H1(1)], 'YData', [A(2) H1(2)]);
set(h.BH1, 'XData', [B(1) H1(1)], 'YData', [B(2) H1(2)]);
set(h.H1H2, 'XData', [H1(1) H2(1)], 'YData', [H1(2) H2(2)]);
set(h.H2C, 'XData', [C(1) H2(1)], 'YData', [C(2) H2(2)]);
set(h.H2D, 'XData', [D(1) H2(1)], 'YData', [D(2) H2(2)]);
title(['AH_1 + BH_1 + H_1H_2 + H_2C + H_2D = ' num2str(f,'%.3f')])
drawnow

function d = dist(p1, p2)
d = sqrt( sum( (p1-p2).^2 ) );