使用Mathematica 8在功能NMinimize中似乎忽略了一些线性约束

时间:2014-02-21 21:19:00

标签: 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] - 
 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)])

,其中

T = 10;
J1 = 1;
J2 = -0.2;

是常量参数。然后我试试

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}]

结果

  

NMinimize :: nrnum:&#34;函数值5.87777 [VeryThinSpace] -4.87764 \ I \ n      在{c,d,lwz,lxw} = {-0.718817,-1.28595,0.69171,-0.932461}不是实数。

如果有人可以暗示这里发生的事情,我将不胜感激。

2 个答案:

答案 0 :(得分:0)

试试这个:

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

如果NMinimize超出范围,则会导致函数无法评估。对不起,我不能从这里测试..如果没有尝试在mathematica.stackexchange.com上询问

除此之外,为什么要使用&lt; =。999而不是简单地&lt; 1? 如果你修复它也可能会有所帮助(使用整数1,而不是1.)

答案 1 :(得分:0)

出现警告是因为警告中给出的值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我

1/16 (1 + 2 c + d - 2 lwz - 2 lxw)
  

-0.0776301

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

{-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]
  

-4.90045