2

问题是

a.编写一个函数,它找到具有最小面积 st 的圆,它限制给定的点列表(使用 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 中的圆的区域

4

2 回答 2

4

注意:我不相信你画的圆是最小的边界圆。它应该小一点,向上和向右,并且应该至少接触其周边的两个点。

接近问题

我们有一组点,我们想画一个包含所有点的圆。问题是您需要三个信息来定义一个圆:圆心的 X 和 Y 坐标,以及圆的半径。所以这个问题似乎并不简单。

但是,有一个更容易解决的相关问题。假设圆的中心是固定的。从那时起,我们使一个圆同心向外生长,使其变得越来越大。在某些时候,圆圈将包含我们集合中的一个点。随着它变大,它将包含第二个点和第三个点,直到我们集合中的所有点都落在我们的圈内。显然,一旦集合中的最后一个点落入我们的圆内,我们就有了包含所有点的最小圆,假设我们从固定圆的中心点开始。

此外,我们可以确定这个圆的半径是多少。它只是从集合中的任何点到圆心的最大距离,因为当最后一个点接触到我们扩大的圆的周长时,我们就停止了。

下一个问题是确定放置圆心的最佳起点是什么? 显然,如果起点远离我们集合中的所有点,那么半径必须非常大,甚至可以包含集合中的一个点。直观地说,它一定在我们点的“中间”某处。但是,具体在哪里?

使用fminsearch

我的建议是你想找到点 P(x, y) 最小化你必须扩大圆圈以包含集合中的所有点的大小。我们很幸运,我们可以用它fminsearch来找到 P。

根据fminsearch文档,您传入的函数必须是一个参数的函数(可能是一个数组),并且它必须返回一个标量。这个想法是您希望函数的输出尽可能小,并且您想找出哪些输入可以实现。

在我们的例子中,我们想编写一个函数来输出我们的圆的大小,给定圆的中心作为输入。这样,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 案例!

于 2013-06-29T12:09:59.160 回答
-1

实际上,虽然您可能需要它来完成您的家庭作业(我假设就是这样),但您根本不需要使用优化器。使用我的最小边界工具发布的 minboundcircle 代码无需使用优化器即可完成。(还有一个 minboundsphere 工具。)

无论如何,您可能会在其中找到一些有用的技巧。至少,学习如何通过使用凸包来减小问题的大小(以及解决问题的速度)。毕竟,只有凸包上的点才能确定最小边界圆。所有其他点都只是浪费 CPU 时间。

于 2013-06-29T12:39:03.140 回答