让
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}]
实际上,正如西蒙指出的那样,它有效......运行时间比我预期的要长,我在Mahtematica向我展示结果之前关闭了它。
答案 0 :(得分:4)
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处的最大值。因此,最小值必须位于边界上。然后,您可以使用类似的代码但限制在边界以最终找到正确的结果。
答案 1 :(得分:2)
只是为了好玩,这是西蒙给出的解决方案的情节:
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`}]
答案 2 :(得分:1)
你说你对“数学方法”不感兴趣(当你这么说时我不清楚你的想法,但它让我想到拉格朗日乘数的最小化方法)。如果这是正确的,为什么要将Mathematica带入讨论?你觉得它会用什么?
我必须假设你的意思是数字,计算机解决方案。我将从线性编程和单纯形法开始。