Re: Some linear constraints seem to be ignored in function
- To: mathgroup at smc.vnet.net
- Subject: [mg132371] Re: Some linear constraints seem to be ignored in function
- From: Bob Hanlon <hanlonr357 at gmail.com>
- Date: Sun, 2 Mar 2014 01:04:32 -0500 (EST)
- Delivered-to: l-mathgroup@mail-archive0.wolfram.com
- Delivered-to: l-mathgroup@wolfram.com
- Delivered-to: mathgroup-outx@smc.vnet.net
- Delivered-to: mathgroup-newsendx@smc.vnet.net
- References: <20140222080533.BDB3B6A13@smc.vnet.net>
If the function and constraints are linear, NMinimize can always find
global minima, over both real and integer values. Otherwise, NMinimize may
sometimes find only a local minimum.
Better results
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)]);
var = {lxw, lwz, c, d};
cons = And @@ Cases[ff @@ var, Log[x_] -> x > 0, Infinity] // Simplify
d < 1 && lwz < 1 && 1 + lwz > 0 && 1 + 2 c + d > 2 (lwz + lxw) && lxw < 1
&&
1 + lxw > 0
T = 10;
J1 = 1;
J2 = -2/10;
sol1 = NMinimize[{ff @@ var, cons}, var, Method -> "DifferentialEvolution"]
//
Quiet
{-12.5767, {c -> -0.236399, d -> -0.976973, lwz -> -0.68191,
lxw -> -0.939971}}
Solving for all of the partial derivatives equal to zero
sol2 = NSolve[
Append[
Simplify[
D[ff @@ var, #] == 0 & /@ var],
cons],
var][[1]]
{lxw -> -0.0599281, lwz -> -0.0599281, c -> 4.21567, d -> -4.65527}
ff @@ var /. sol2
-14.1157
Which is less than the previously identified local minimum.
However, since
lxw == lwz /. sol2
True
investigate with lwz constrained to equal lxw
ff[lxw_, c_, d_] = ff[lxw, lxw, c, d] // Simplify
(2 c)/5 - 2 lxw +
5/4 (-4 (-1 + d) Log[(1 - d)/16] + (1 + 2 c + d - 4 lxw) Log[
1/16 (1 + 2 c + d - 4 lxw)] -
8 (Log[(1 - lxw)/8] - lxw Log[1 - lxw] + (1 + lxw) Log[1 + lxw]))
var2 = {lxw, c, d};
cons2 = And @@ Cases[ff @@ var2, Log[x_] -> x > 0, Infinity] // Simplify
d < 1 && -1 < lxw < 1 && 1 + 2 c + d > 4 lxw
sol3 = NMinimize[{ff @@ var2, cons2}, var2,
Method -> "DifferentialEvolution"] // Quiet
{-15.4231, {c -> -0.0657214, d -> -0.474906, lxw -> -0.994937}}
Which is again less than the previously identified local minima.
Bob Hanlon
On Sat, Feb 22, 2014 at 11:00 AM, Bob Hanlon <hanlonr357 at gmail.com> wrote:
> I don't know why the search methods go outside the constraints, but you
> can get better results using a Method other than the default of Automatic.
>
>
> $Version
>
>
> "8.0 for Mac OS X x86 (64-bit) (October 5, 2011)"
>
>
> Clear[ff, T, J1, J2]
>
>
> 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)]);
>
>
> cons = And @@ Cases[ff[lxw, lwz, c, d],
>
> Log[x_] -> x > 0, Infinity] // Simplify
>
>
> d < 1 && lwz < 1 && 1 + lwz > 0 && 1 + 2 c + d > 2 (lwz + lxw) && lxw < 1
> &&
> 1 + lxw > 0
>
>
> T = 10;
> J1 = 1;
> J2 = -2/10;
>
>
> Off[NMinimize::nrnum]
>
>
> NMinimize[{ff[lxw, lwz, c, d], cons}, {lxw, lwz, c, d}]
>
>
> {-4.91624, {c -> 0.94525, d -> -0.315535, lwz -> 0.901231, lxw ->
> -0.191668}}
>
>
> NMinimize[{ff[lxw, lwz, c, d], cons}, {lxw, lwz, c, d},
> Method -> "DifferentialEvolution"]
>
>
> {-12.5767, {c -> -0.236399, d -> -0.976973, lwz -> -0.68191,
> lxw -> -0.939971}}
>
>
>
> Bob Hanlon
>
>
>
>
> On Sat, Feb 22, 2014 at 3:05 AM, Daniel Stariolo <
> daniel.stariolo at gmail.com> wrote:
>
>> I'm trying to minimize a non-linear function of four variables with some
>> linear constraints. Mathematica 8 is unable to find a good solution giving
>> complex values of the function at some point in the iteration. This implies
>> that one or some contraints are not being enabled in the process. Is this a
>> bug or limitation of the optimization function ?
>>
>> Function to minimize is
>>
>> 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)])
>>
>> where
>>
>> T = 10;
>> J1 = 1;
>> J2 = -0.2;
>>
>> are constant parameters. Then I try
>>
>> 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}]
>>
>> with the result
>>
>> NMinimize::nrnum: "The function value 5.87777-4.87764 I is not a real
>> number at {c,d,lwz,lxw} = {-0.718817,-1.28595,0.69171,-0.932461}."
>>
>> I would appreciate if someone can give a hint at what is happening here.
>>
>>
>