问题是
a.write一个函数,它找到具有最小区域的圆圈。它绑定给定的点列表(使用fminsearch并给出适当的图)。 b。如果你管理了球体做同样的事情(找到一个体积最小的球体)
到目前为止我尝试过:
%%Main function
function minarea= mincircle(points)
maxx=max(points(1,:));
maxy=max(points(2m:));
radius=max(maxx,maxy);
minarea=fminsearch(@(x) circle(x,r,c),[0,0])
end
%%This function is supposed to give equalation of circle
function eq=circle(x,r,c)
eq=(x(1)-c(1)).^2+(x(2)-c(2)).^2 %=r?
% and here I don't know how to insert r:
end`
为了更好地理解,我会附上草图。
在这些术语中,我想找到中心位于O
的圆的区域答案 0 :(得分:4)
注意:我不相信你画的圆是最小的边界圆。它应该更小,向上和向右,并且应该在其周边至少触摸两个点。
我们有一组点,我们想绘制一个包含所有点的圆。问题是你需要三位信息来定义一个圆:圆的中心的X和Y坐标,以及圆的半径。所以这个问题看起来并不简单。
然而,有一个相关的问题更容易解决。假设圆的中心是固定的。从那时起,我们使一个圆同心地向外生长,使它变得越来越大。在某些时候,圆圈将包含我们集合中的一个点。随着它变大,它将包含第二个点和第三个点,直到我们集合中的所有点落入我们的圈内。很明显,一旦集合中的最后一个点落入我们的圆圈内,我们就会得到包含所有点的最小圆圈,因为我们从固定圆心的中心点开始。
此外,我们可以确定这个圆的半径是多少。它只是从集合中任意点到圆心的最大距离,因为我们在扩展圆周边触摸最后一个点时停止。
下一个问题是确定放置圆心的最佳起点是什么?显然,如果起点远离我们集合中的所有点,那么半径必须非常大甚至包含集合中的一个点。直觉上,它必须在中间"我的观点在哪里。但到底在哪里呢?
fminsearch
我的建议是你要找到点P(x,y),它最小化你需要增大圆圈的大小以包含集合中的所有点。我们很幸运,我们可以使用fminsearch
找到P。
According to the fminsearch
documentation,传入的函数必须是一个参数(可能是一个数组)的函数,并且必须返回一个标量。我们的想法是,您希望函数的输出尽可能小,并且您想要找出哪些输入可以实现。
在我们的例子中,我们想要编写一个输出圆的大小的函数,给定圆的 center 作为输入。这样,fminsearch
将找到仍然包含所有点的最小圆圈的中心。我将编写一个函数,输出所需的半径,以包含给定中心点P的所有点。
pointsX = [..]; % X-coordinates of points in the set
pointsY = [..]; % Y-coordinates of points in the set
function r = radiusFromPoint(P)
px = P(1);
py = P(2);
distanceSquared = (pointsX - px).^2 + (pointsY - py).^2;
r = sqrt(max(distanceSquared));
end
然后我们想用fminsearch
来找到给我们最小半径的点。我只是天真地使用原点(0,0)作为我的初始估计,但你可能有更好的想法(比如使用集合中的第一个点)
P0 = [0, 0]; % starting estimate
[P, radiusMin] = fminsearch(@radiusFromPoint, P0);
圆圈的中心位于P
,半径为radiusMin
。
我会留给你绘制输出并概括为3D案例!
答案 1 :(得分:0)
实际上,虽然你可能需要它来完成你的家庭作业(我认为这就是这个),你根本不需要使用优化器。使用我的minimal bounding tools发布的minboundcircle代码不使用优化器。 (还有一个minboundsphere工具。)
无论如何,你可能会发现一些有用的技巧。至少,学习如何通过使用凸包来减小问题的大小(以及解决方案的速度)。毕竟,只有凸包上的点才能确定最小的边界圆。所有其他点只是浪费CPU时间。