最大内接矩 matlab,趣题:内切圆与最大内接矩形

ae9546e20f6f61c7f42ca3bf001a1ae4.gif

看图,DEFG为直角三角形ABC的内接矩形,三个内切圆的半径从小到大依次为r1, r2和r3。证明:当内接矩形的面积达到最大时,r1^2 + r2^2 = r3^2。

ae9546e20f6f61c7f42ca3bf001a1ae4.gif

四个直角三角形ABC, EDC, AEF, DBG显然相似,内切圆半径与边长一样对应成比例。因此,我们可以把研究对象转换到任意一个对应边上。这里,我们重点观察四个三角形斜边长的关系。

如果△ABC的三边BC, AC, AB长度分别为a, b, c,那么对于某个相似比k,其余三个三角形的对应边长度如下:

△ABC     a      b      c

△EDC    ka     kb     kc

△AEF    …    …  (1-k)b

△DBG    …    …  (1-k)a

现在,我们要证明的是,当矩形DEFG面积达到最大时,有:

[(1-k)a]^2 + [(1-k)b]^2 = (kc)^2

也即

(1-k)^2 * a^2 + (1-k)^2 * b^2 = k^2 * c^2

同时,我们还知道a^2 + b^2 = c^2。等式两边同时乘以k^2后与上式相减,我们就得到:

(1 – 2k) * (a^2 + b^2) = 0

显然,只有k=1/2时上式才有可能成立。

接着看,由△DBG ∽ △ABC,可知 DG/AC = BD/AB,因此DG = (1-k)ab/c。另外,我们还知道DE=kc,那么矩形DEFG的面积就可以这样表示:

S = DG x DE = (1-k)k * ab

S取最大等价于函数f(k)=(1-k)k达到最大值。这个函数是一个以0和1为根的上下颠倒的抛物线,显然在k=1/2时达到最大值。

来源:cut-the-knot新文

Matrix67原创翻译

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要求一个矩形的面积最大且完全被包含在给定的多边形内,可以使用MATLAB的polybool函数和fmincon函数来实现。 具体步骤如下: 1.使用polybool函数计算多边形的边界框,确定内接矩形的初始约束。 2.定义一个目标函数,该函数计算矩形的面积。这个函数需要考虑矩形是否与多边形相交。如果相交,则返回一个很小的面积值,以便fmincon函数可以到不相交的解。 3.使用fmincon函数进行优化,以内接矩形最大面积。优化的约束条件是内接矩形必须完全包含在多边形内部。 4.使用polybool函数将内接矩形多边形相交,以确定内接矩形的实际位置。 以下是MATLAB代码的示例: ``` % 定义多边形的顶点坐标 x = [0 1 1 0]; y = [0 0 1 1]; % 计算多边形的边界框 xmin = min(x); xmax = max(x); ymin = min(y); ymax = max(y); % 定义目标函数,计算矩形的面积 f = @(x) -x(3)*x(4); % 定义约束条件 A = [1 0 0 0; -1 0 0 0; 0 1 0 0; 0 -1 0 0; 0 0 1 0; 0 0 -1 0; 0 0 0 1; 0 0 0 -1]; b = [xmin; -xmax; ymin; -ymax; 0; 0; 0; 0]; nonlcon = @(x) rectangle_constraint(x, xpoly, ypoly); % 初始值 x0 = [xmin ymin (xmax-xmin)/2 (ymax-ymin)/2]; % 进行优化 options = optimoptions('fmincon','Display','none'); x = fmincon(f, x0, A, b, [], [], [], [], nonlcon, options); % 计算内接矩形的顶点坐标 rect_x = [x(1); x(1)+x(3); x(1)+x(3); x(1)]; rect_y = [x(2); x(2); x(2)+x(4); x(2)+x(4)]; % 将内接矩形多边形相交,得到实际位置 [xi, yi] = polybool('intersection', x, y, rect_x, rect_y); ``` 其中,rectangle_constraint函数用于判断矩形是否与多边形相交: ``` function [c, ceq] = rectangle_constraint(x, xpoly, ypoly) % 判断矩形是否与多边形相交 rect_x = [x(1); x(1)+x(3); x(1)+x(3); x(1)]; rect_y = [x(2); x(2); x(2)+x(4); x(2)+x(4)]; [in, on] = inpolygon(rect_x, rect_y, xpoly, ypoly); if any(~in) || any(on) c = -1; % 约束不满足 else c = 0; % 约束满足 end ceq = []; end ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值