数学 / 导数 · 从变化率到极值与不等式 / 优化建模:从实际约束到最值 待审核 8 / 8
目标函数 · 定义域端点 · 费马原理

优化建模:从实际约束到最值

「用料最省」「利润最大」「用时最短」这类问题落到数学上都是同一件事:写出一个一元函数,求它在某个区间上的最值。难点不在求导,在于把实际的约束翻译成函数与定义域——翻译得对不对,只能拿结论回到实际中去检验。

1 · 从实际问题到目标函数

建模的次序是固定的,跳步会在后面付出代价。

  1. 设变量。选一个自变量,其余的量都用它表示。选谁不影响答案,但影响表达式的繁简:圆柱罐用底面半径比用高好写,因为体积约束能把高直接解出来。
  2. 目标函数,即待优化的那个量关于自变量的表达式。所有约束条件在这一步用掉,把多元问题压成一元。
  3. 定定义域。几何量为正、销量不为负、比例不超过一,这些限制决定了后面在哪个区间上比较。
  4. 求导,解 f(x)=0f'(x) = 0,把驻点与定义域中可取的端点一并比较,定出最值。
  5. 回到实际意义验算。答案的量纲对不对,数量级合不合理,与已知的实物是否吻合。

第五步最容易被略过,而它恰恰是发现建模出错的唯一机会。下一节的罐子就卡在这一步上。

2 · 等体积罐子的用料

容积固定为 VV 的圆柱形罐子,底面半径 rr、高 hh 满足 V=πr2hV = \pi r^2 h。表面积

A(r)=2πr2+2πrh=2πr2+2Vr,r(0,+)A(r) = 2\pi r^2 + 2\pi r h = 2\pi r^2 + \frac{2V}{r}, \qquad r \in (0, +\infty)

求导得 A(r)=4πr2Vr2A'(r) = 4\pi r - \frac{2V}{r^2},令其为零解出 r=V2π3r = \sqrt[3]{\dfrac{V}{2\pi}}。代回体积约束,h=Vπr2=2rh = \dfrac{V}{\pi r^2} = 2r:用料最省的罐子,高恰好等于直径。定义域是开区间,两个端点都取不到(半径为零装不下东西,半径趋于无穷时用料也趋于无穷),驻点唯一,它就是最小值点。

V=330V = 330 立方厘米,算得 r=3.745r = 3.745 厘米、h=7.490h = 7.490 厘米,表面积 264.36264.36 平方厘米。

拿这个结论去比对实物就出了问题。常见的 330 毫升两片式铝罐外径约 6666 毫米、总高约 115115 毫米,高与直径之比接近 1.741.74,而不是理论给出的 11。真实的罐子比「最省」的方案高而瘦,且偏离得相当明显。

结论与实物不符时,该重新审视的是模型。上面那个目标函数把罐子当成了一张厚度均匀的纸:侧壁、底、盖每平方厘米的代价相同,卷封的翻边不耗材,罐子在货架上和手里也不占地方。这几条都不成立。把底与盖的厚度记作侧壁的 kk 倍,目标函数变成 Ak(r)=2kπr2+2VrA_k(r) = 2k\pi r^2 + \dfrac{2V}{r},驻点条件给出 r3=V2kπr^3 = \dfrac{V}{2k\pi},代回后

h=Vπr2=2krh = \frac{V}{\pi r^2} = 2kr

高与直径之比恰好就是厚度倍数 kk,且与容积 VV 无关。反过来由实物的 1.741.74 反推,相当于底盖的等效厚度约为侧壁的 1.741.74 倍——两片式铝罐的罐身经过减薄拉伸而底与盖需要承压,这个量级是说得通的。再把卷封翻边的耗材算进去,罐子还会被进一步拉高:取 k=2k = 2、翻边宽 0.30.3 厘米时最优半径从 2.9722.972 降到 2.9232.923 厘米,比值从 2.0002.000 升到 2.1032.103

注 · 真实尺寸能离理论最优这么远,还有一个数值上的原因:目标函数在最优点附近极平坦。一阶导数在最优点为零,目标值的变化是二阶的:偏离翻一倍代价翻四倍,而基数极小。实测 V=330V = 330 的理想模型:半径偏离最优 5%5\% 只多用 0.242%0.242\% 的材料,偏离 10%10\% 多用 0.939%0.939\%,偏离 20%20\% 也才多用 3.556%3.556\%。把半径从最优的 3.7453.745 厘米直接改成实物的 3.33.3 厘米(偏离 12%12\%),用料只多 1.54%1.54\%。省下的这一点材料,抵不过握持手感、货架高度与产线模具带来的约束,厂商也就没有理由去凑那个「最优」。

驻点有闭式解,用不着数值求根;core/optimize.ts 里仍留了一份牛顿法,用来对照。以 A(r)=0A'(r) = 0 为方程,初值分别取 1122881212,迭代 9977881010 步后都停下,四个结果与解析解 V/2π3\sqrt[3]{V / 2\pi} 至多差一个 ulp(其中初值 88 那一次差 4.44×10164.44 \times 10^{-16},其余三次逐位相同)。初值 1212 的第一步跳到了 1.031.03,几乎冲出定义域左端——牛顿法的二次收敛只在最后几步兑现,前几步全看初值的运气。

图 2-1 · 上格是实物示意,下格是同一模型的目标函数曲线,游标扫过时两格同步。红点是最值,橙点是可取的端点,切线的倾斜方向即 ff' 的符号。可切换到定价模型压低限价,观察最值如何从内部驻点转移到端点上。

3 · 定价与定义域的端点

某商品单位成本 88 元,售价定为 pp 元时日销量为 q=20010pq = 200 - 10p 件。日利润

L(p)=(p8)(20010p),p[8,20]L(p) = (p - 8)(200 - 10p), \qquad p \in [8, 20]

定义域的两端各有来历:低于成本价不做生意,高于 2020 元时销量降到零。L(p)=28020pL'(p) = 280 - 20p,驻点 p=14p = 14L(14)=360L(14) = 360 元,大于两端的 L(8)=L(20)=0L(8) = L(20) = 0,最优定价是 1414 元。

例 3.1 上一段加一条限价:售价不得超过 1212 元。定义域缩成 [8,12][8, 12],驻点 1414 落在区间之外,候选只剩两个端点,L(8)=0L(8) = 0L(12)=320L(12) = 320,最优定价是 1212 元。LL[8,12][8, 12] 上一路递增,最优被限价「顶」在了右端点上。

警示 · 端点是否属于定义域,由实际问题决定,不能凭数学上的方便挑。限价这类政策约束是可以取到的上界,端点必须进候选;而罐子的半径取不到零,那个端点进了候选反而会给出一个取不到的「最优」。core/optimize.ts 的模型因此各自声明 closed: [boolean, boolean]solve 只把可取的端点放进候选清单。

4 · 折射与 Snell 定律

光从一种介质进入另一种时会拐一下。费马原理(Fermat's principle)说,光走的是用时最短的那条路径。用时最短与路程最短是两件事,两者只在同一种介质里才重合。

设光源在界面上方高 h1h_1 处,目标点在界面下方深 h2h_2 处,两者水平相距 dd;光在上下两种介质中的速率分别为 v1v_1v2v_2。设入射点距光源正下方 xx,则

T(x)=h12+x2v1+h22+(dx)2v2,x[0,d]T(x) = \frac{\sqrt{h_1^2 + x^2}}{v_1} + \frac{\sqrt{h_2^2 + (d - x)^2}}{v_2}, \qquad x \in [0, d]

定理 4.1(Snell 定律) 使 T(x)T(x) 取最小值的入射点满足 sinθ1sinθ2=v1v2\frac{\sin\theta_1}{\sin\theta_2} = \frac{v_1}{v_2} 其中 θ1\theta_1θ2\theta_2 分别是入射线与折射线跟界面法线的夹角。

证明TT 求导: T(x)=xv1h12+x2dxv2h22+(dx)2T'(x) = \frac{x}{v_1\sqrt{h_1^2 + x^2}} - \frac{d - x}{v_2\sqrt{h_2^2 + (d - x)^2}} 两个分式各自的分子是水平位移、分母是斜边长与速率之积,故 xh12+x2=sinθ1\dfrac{x}{\sqrt{h_1^2 + x^2}} = \sin\theta_1dxh22+(dx)2=sinθ2\dfrac{d - x}{\sqrt{h_2^2 + (d-x)^2}} = \sin\theta_2,于是 T(x)=sinθ1v1sinθ2v2T'(x) = \frac{\sin\theta_1}{v_1} - \frac{\sin\theta_2}{v_2} TT'[0,d][0, d] 上严格递增(第一项随 xx 增大,第二项随 xx 减小),零点唯一,且 T(0)<0<T(d)T'(0) < 0 < T'(d),该零点即最小值点。令 T=0T' = 0 即得定理的等式。∎

求导的中间结果自己变成了正弦,并非巧合:sinθ\sin\theta 本来就是「路径长度关于入射点位移的变化率」,TT' 的两项各是一段路的用时对同一个位移的响应。

h1=3h_1 = 3h2=2h_2 = 2d=5d = 5,水与空气的折射率之比 n=v1/v2=1.33n = v_1 / v_2 = 1.33。数值解出的最优入射点是 x=3.58780x = 3.587\,80,此处 θ1=50.0987\theta_1 = 50.0987^\circθ2=35.2261\theta_2 = 35.2261^\circ,正弦之比算得 1.33000000000000051.330\,000\,000\,000\,000\,5,与 nn 只差 4.44×10164.44 \times 10^{-16}。这个偏差是最后一位的舍入,两条路线(对目标函数求导,与直接引用 Snell 定律)在双精度下完全对上。

顺带可以量出「拐这一下」值多少。同一组参数下,直线路径的入射点由相似三角形定为 x=3x = 3,用时 8.004458.004\,45;最优路径的用时 7.933067.933\,06,快了 0.90%0.90\%。折射角在图上看着相当明显,换算成用时却只有不到百分之一的差别,这与上一节罐子那条同源:最优点附近目标函数是平的,入射点偏离最优 0.10.1 时用时只多 2.29×1032.29 \times 10^{-3},偏离 0.010.01 时只多 2.26×1052.26 \times 10^{-5}

5 · 参考文献

  1. Mathematical optimization. Wikipedia. 优化问题的一般形式与可行域的概念。https://en.wikipedia.org/wiki/Mathematical_optimization
  2. Fermat's principle. Wikipedia. 费马原理的表述、历史与由它导出的反射与折射定律。https://en.wikipedia.org/wiki/Fermat%27s_principle
  3. Snell's law. Wikipedia. 折射定律的多种推导路径,含费马原理与惠更斯原理两条。https://en.wikipedia.org/wiki/Snell%27s_law
  4. Newton's method. Wikipedia. 牛顿法的收敛阶与对初值的依赖。https://en.wikipedia.org/wiki/Newton%27s_method
  5. Drink can. Wikipedia. 两片式铝罐的成型工艺、壁厚分布与常见公称尺寸。https://en.wikipedia.org/wiki/Drink_can