Wolfram mathematica Mathematica中的最小化函数
我尝试使用NMinimize函数来查找以下函数的全局最小值Wolfram mathematica Mathematica中的最小化函数,wolfram-mathematica,mathematical-optimization,Wolfram Mathematica,Mathematical Optimization,我尝试使用NMinimize函数来查找以下函数的全局最小值 f={s1-Log[1000/{Norm[{2.83,0,2}-{u,v,w}]}^3]}^2+{s2- Log[1000/{Norm[{0,2.83,-2}-{u,v,w}]}^3]}^2+{s3- Log[1000/{Norm[{-2.83,0,2}-{u,v,w}]}^3]}^2+{s4- Log[1000/{Norm[{0,-2.83,-2}-{u,v,w}]}^3]}^2; n最小化[f,{u,v,w},方法->{“差分进化”
f={s1-Log[1000/{Norm[{2.83,0,2}-{u,v,w}]}^3]}^2+{s2-
Log[1000/{Norm[{0,2.83,-2}-{u,v,w}]}^3]}^2+{s3-
Log[1000/{Norm[{-2.83,0,2}-{u,v,w}]}^3]}^2+{s4-
Log[1000/{Norm[{0,-2.83,-2}-{u,v,w}]}^3]}^2;
n最小化[f,{u,v,w},方法->{“差分进化”}]。
该优化是一种无约束优化。下面是我每次运行它时得到的错误
NMinimize::nnum:“函数值{{2.67476}}不是当前的数字。”
{u,v,w}={0.673558,0.659492,0.0861047}”
我不确定哪里出了问题。还有一种方法可以设置停止规则,并在出现此类错误时从NMINIMIMIZE输出中提取值。
请帮我调试这段代码。
提前谢谢你的帮助
Kum.大括号在Mathematica中表示列表,因此您的函数输出的是一个单元素矩阵,而不是标量。请更改用于分组到普通括号中的
{}
对。事实上,您得到的是双大括号,这表明有两个级别的大括号需要转换
f = (s1 - Log[1000./(Norm[{2.83, 0, 2} - {u, v, w}])^3])^2 + (s2 -
Log[1000./(Norm[{0, 2.83, -2} - {u, v, w}])^3])^2 + (s3 -
Log[1000./(Norm[{-2.83, 0, 2} - {u, v, w}])^3])^2 + (s4 -
Log[1000./(Norm[{0, -2.83, -2} - {u, v, w}])^3])^2;
作为进一步说明,我将把整数
值(1000
)更改为实数(1000.
),因为其余的输入是机器精度的实数。正如Brett在评论中提醒我的那样,输出不会有任何不同,但是如果你做了大量重复计算,你可能会注意到性能的小幅度提高,如果你想进一步提高性能,你可以更轻松地使用该函数
(当我意识到这是一个1*1的矩阵输出,而不是矢量输出时编辑。)
1000
与1000相比。
在这里不应该有任何区别——反正都会被强制到机器精度上。@BrettChampion-你说得很对,输出将是相同的,但会有一个小的性能提升,这是我的意思,但我设法在编辑中省去了。我会在回答中更清楚。Using1000。
而不是1000
在我的机器上加速了大约0.2%(使用s1、s2、s3、s4的随机值)。而如果我使用h=Simplify[f,Element[u | v | w,Reals]
来去除规范和相关的绝对值(它们被平方化了……),速度会快35%@Verbeia,非常感谢您的帮助!!!!更改为普通括号确实帮助了它现在的工作:)@BrettChampion,如前所述,simplify函数真的让事情进展得更快了。:)再次感谢您。@rcollyer-您真的进入了语法突出显示,我明白了:)@Verbeia,我想如果我还是要编辑它,我会的它不是完美的,但已经足够有效了。