Wolfram mathematica 在Mathematica 8的函数N最小化中,某些线性约束似乎被忽略

Wolfram mathematica 在Mathematica 8的函数N最小化中,某些线性约束似乎被忽略,wolfram-mathematica,constraints,mathematical-optimization,Wolfram Mathematica,Constraints,Mathematical Optimization,我试图最小化一个由四个变量组成的具有线性约束的非线性函数。Mathematica 8无法找到一个好的解决方案,在迭代的某个点给出函数的复数值。这意味着一个或一些约束在该过程中未启用。这是优化功能的缺陷还是限制 最小化的函数是 ff[lxw_, lwz_, c_, d_] := - J1 (lxw + lwz) - 2 J2 c + T (-Log[2] - 1/2 (1 - lxw) Log[(1 - lxw)/4] - 1/2 (1 + lxw) Log[(1 + lxw)/4] -

我试图最小化一个由四个变量组成的具有线性约束的非线性函数。Mathematica 8无法找到一个好的解决方案,在迭代的某个点给出函数的复数值。这意味着一个或一些约束在该过程中未启用。这是优化功能的缺陷还是限制

最小化的函数是

ff[lxw_, lwz_, c_, d_] := - J1 (lxw + lwz) - 2 J2 c +
 T (-Log[2] - 1/2 (1 - lxw) Log[(1 - lxw)/4] - 
 1/2 (1 + lxw) Log[(1 + lxw)/4] - 
 1/2 (1 - lwz) Log[(1 - lwz)/4] - 
 1/2 (1 + lwz) Log[(1 + lwz)/4] + 1/2 (1 - d) Log[(1 - d)/16] + 
 1/8 (1 + 2 c + d - 2 lwz - 2 lxw) Log[
   1/16 (1 + 2 c + d - 2 lwz - 2 lxw)])
在哪里

是常数参数。然后我试着

NMinimize[{ff[lxw, lwz, c, d],
 2 c + d - 2 lwz - 2 lxw  >= -0.999 && 
 -0.999 <= lxw <=  0.999 &&
 -0.999 <= lwz <= 0.999 && 
 -0.999 <= c <= 0.999 &&
       d <= 0.9999}, {lxw, lwz, c, d}]
n最小化[{ff[lxw,lwz,c,d],
2 c+d-2 lwz-2 lxw>=-0.999&&
-0.999试试这个:

  Clear[ff];
  ff[lxw_, lwz_, c_, d_]  /; 2 c + d - 2 lwz - 2 lxw  >= -0.999 :=
     < your function def >
Clear[ff];
ff[lxw_uz,lwz_z,c_uz,d_uz]/;2 c+d-2 lwz-2 lxw>=-0.999:=

这将导致函数未计算,以防NMinimize超出范围。很抱歉,我无法从这里进行测试。如果没有,请尝试在mathematica.stackexchange.com上询问


除此之外,为什么要使用出现警告,因为在警告中给出的值处,
ff
中的最后一个术语很复杂,因为记录的是负数,即

{c, d, lwz, lxw} = {
   -0.7188174745559741`,
   -1.2859482844800894`,
    0.6917100913968041`,
   -0.9324611085040573`};

Log[1/16 (1 + 2 c + d - 2 lwz - 2 lxw)]
-2.5558+3.14159 i

-0.0776301

在Mathematica 9中,除了警告之外,还会产生一个结果:-

{-4.90045, {c -> 0.94425, d -> -0.315633, lwz -> 0.900231, lxw -> -0.191476}}

-4.90045


感谢@george和Chris的帮助。第一个建议没有奏效。我仍然不知道为什么算法似乎超出了范围,但[(由Daniel Lichtblau提出)@danielstariolo-感谢后续信息。
1/16 (1 + 2 c + d - 2 lwz - 2 lxw)
{-4.90045, {c -> 0.94425, d -> -0.315633, lwz -> 0.900231, lxw -> -0.191476}}
{c, d, lwz, lxw} = {
    0.9442497691706085`,
   -0.31563295950647885`,
    0.900230825707721`,
   -0.1914760216875171`};

ff[lxw, lwz, c, d]