【问题标题】:How to get the minimum of Sqrt[3x+1]+Sqrt[3y+1]+Sqrt[3z+1]?如何获得 Sqrt[3x+1]+Sqrt[3y+1]+Sqrt[3z+1] 的最小值?
【发布时间】:2010-11-24 23:55:02
【问题描述】:

f[x_,y_,z_] := Sqrt[3x+1]+Sqrt[3y+1]+Sqrt[3z+1]

我想使用mathematica 获得x>=0&&y>=0&&z>=0&&x+y+z==1 的f 的最小值。

PS:我确实知道如何通过数学方法获得最小值:

Since 0<=x<=1,0<=y<=1,0<=z<=1, we have
0<=x^2<=x,0<=y^2<=y,0<=z^2<=z.
Hence,
3a+1 >= a^2 + 2a + 1 = (a+1)^2, where a in {x,y,z}.
Consequently,
f[x,y,z] >= x+1+y+1+z+1 = 4,
Where the equality holds if and only if (x==0&&y==0||z==1)||...

PS2:我预计下面的代码会起作用,但它没有。

Minimize[{f[x,y,z],x>=0&&y>=0&&z>=0&&x+y+z==1},{x,y,z}]

实际上,正如 Simon 指出的那样,它有效...运行时间比我预期的要长,我在 Mahtematica 显示结果之前关闭了它。

【问题讨论】:

  • 嗯?我看到的只有两个可行的选项是 x=y=z=(1/3), f(x,y,z)=3*sqrt(2) .... 或 x=y=0, z=1 导致f(x,y,z)=1+1+sqrt(4)=1+1+2=4
  • @jon_darkstar 最小值,不是最大值
  • 是的,我后来就抓住了=P。但中间选项是否值得探索?
  • 正确无约束,但请注意 x + y + z = 1。需要一个或两个拉格朗日乘数。
  • f w.r.t 任何三个变量的偏导数显然总是在减少,因此您希望将所有 x+y+z=1 约束“合并”到一个变量中。勒格朗日?为什么?我想也许你需要一个证明或者想以一种奇怪的方式概括 f(概括约束没有区别 - 用 x+y+z=k 替换 x+y+z=1 并且你仍然希望其中一个相等到 k),但直观上它非常简单

标签: wolfram-mathematica constraints minimization


【解决方案1】:

这是你想要的吗?

In[1]:= f[x_,y_,z_]:=Sqrt[3x+1]+Sqrt[3y+1]+Sqrt[3z+1]
In[2]:= Minimize[{f[x,y,z],x>=0,y>=0,z>=0,x+y+z==1},{x,y,z}]
Out[2]= {4,{x->1,y->0,z->0}}

请注意,文档中说“即使在多个点达到相同的最小值,也只会返回一个”,因此您必须自己施加问题的排列对称性。


PS 你可以把它变成一个拉格朗日乘数问题

In[3]:= Thread[D[f[x,y,z] - \[Lambda](x+y+z-1), {{x,y,z,\[Lambda]}}]==0];
        Reduce[Join[%,{x>=0,y>=0,z>=0}],{x,y,z,\[Lambda]},Reals]
        {f[x,y,z],D[f[x, y, z], {{x, y, z}, 2}]}/.ToRules[%]
Out[4]= x==1/3&&y==1/3&&z==1/3&&\[Lambda]==3/(2 Sqrt[2])
Out[5]= {3 Sqrt[2],{{-(9/(8 Sqrt[2])),0,0},{0,-(9/(8 Sqrt[2])),0},{0,0,-(9/(8 Sqrt[2]))}}}

并看到唯一的静止点是 x=y=z=1/3 处的最大值。因此最小值必须位于边界上。然后,您可以使用类似的代码,但仅限于边界以最终找到正确的结果。

【讨论】:

  • 哦,谢谢。这就是我想要的。实际上,我已经尝试过了,并且在我强制关闭程序之前它已经运行了超过 2 mius。
  • @Eastsun:很慢——在我便宜的 hp 笔记本电脑上花了大约 30 秒……reduce 代码要快得多。
【解决方案2】:

只是为了好玩,这是Simon给出的解决方案的情节:

f[x_, y_, z_] := Sqrt[3 x + 1] + Sqrt[3 y + 1] + Sqrt[3 z + 1]
g1 = ContourPlot3D[f[x, y, z] == 4, {x, 0, 1}, {y, 0, 1}, {z, 0, 1}, AxesLabel -> {x,y,z}, MeshFunctions -> {#3 &}, ContourStyle -> {Blue, Opacity[0.5]}];
g2 = ContourPlot3D[ x + y + z == 1, {x, 0, 1}, {y, 0, 1}, {z, 0, 1}, AxesLabel -> {x,y,z}, MeshFunctions -> {#2 &}, ContourStyle -> {Green, Opacity[0.5]}];
Show[g1, g2, Graphics3D[{PointSize[0.05], Red, Point[{1, 0, 0}]}], ViewPoint -> {1.1`, -2.4`, 1.7`}]

【讨论】:

    【解决方案3】:

    你说你对“数学方法”不感兴趣(我不确定你这么说是什么意思,但它让我想到了使用拉格朗日乘数的最小化方法)。如果这是正确的,您为什么将 Mathematica 带入讨论?你觉得它会用什么?

    我不得不假设您的意思是数字的计算机解决方案。我将从线性规划和单纯形法开始。

    【讨论】:

    • 我只是想知道有没有什么简单的方法,一两行就解决了。
    • 线性规划/数值可以做到这一点,但这值得一个更有趣的功能来优化 IMO
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-08-24
    • 1970-01-01
    • 1970-01-01
    • 2018-12-12
    • 2014-12-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多