help-glpk
[Top][All Lists]

## Re: [Help-glpk] Calculate sqrt of var

 From: Nigel Galloway Subject: Re: [Help-glpk] Calculate sqrt of var Date: Tue, 22 Apr 2014 03:55:35 -0700

```Andrew,

The following model estimates the sqrt of a variable. If you think it
will

/*Estimate the square root of a variable

April 18th., 2014.
*/

param V  :=  2; /*variable <= 2**(V-1)**2*/
param T  :=  10; /*Tolerance of result 2**V/2**T*/
param Dx :=  2*(V+T-1);
param Dy :=  V+T-1;

var value;
var result;
var mySQRT;
var gn {x in 0 .. Dx, y in 0 .. Dy, z in 1 .. 2}, binary;

i1 : value = 2; /*set variable value*/

gn1 {x in 0 .. Dx, y in 0 .. Dy : x > Dy+y or x-y < 0} : gn[x,y,1] = 0;
gn2 {x in 0 .. Dx, y in 0 .. Dy : x <= Dy+y and x-y >= 0} :
sum {z in 1..2} gn[x,y,z] = gn[x-y,0,1] + gn[y,0,1];
gn3 {x in 0 .. Dx, y in 0 .. Dy : x <= Dy+y and x-y >= 0} : gn[x,y,1] <=
gn[x,y,2];

r2 : result = sum{x in 0 .. Dx} sum{y in 0 .. Dy} gn[x,y,1]*2**(x-2*T);
r3 : result - ceil(2**V)/2**(T) <= value;
r4 : result + ceil(2**V)/2**(T) >= value;
r5 : mySQRT = sum{y in 0 .. Dy} gn[y,0,1]*2**(y-T);

solve;

printf "Approximate Square Root of %f is %f (%f)\n",value, mySQRT,
result;

end;

As configured it calculates sqrt(2):
Approximate Square Root of 2.000000 is 1.413086 (1.996812)

Changing value to 973.5, V to 5, and T to 4 results in:
Approximate Square Root of 973.500000 is 31.187500 (972.660156)

--
Nigel Galloway

On Tue, Apr 8, 2014, at 05:11 PM, Meketon, Marc wrote:
> My guess is that fee[m] is a const/param, so can you rewrite your
> constraint to be the following?
>
> fee[m]*fee[m] = 1000 + (100 + (sum {n in N} (n mod 47))) * (sum {l > in
> L} prod[l,m]);
>
> -----Original Message-----
> Of Andrew Makhorin
> Sent: Tuesday, April 08, 2014 3:34 PM
> To: Tiago Costa
> Subject: Re: [Help-glpk] Calculate sqrt of var
>
> On Tue, 2014-04-08 at 18:46 +0100, Tiago Costa wrote:
> > Hi,
> >
> > I'm trying to apply the following restriction:
> >
> > subject to calc2 {m in M} :
> >      fee[m] = sqrt(1000 + (100 + (sum {n in N} (n mod 47))) * (sum {l
> > in L} prod[l,m]));
> >
> > However since prod[l,m] is a var, I get "argument for sqrt has invalid
> > type".
> >
> > I've read in the documentation that you can only calculate the sqrt of
> > constants/params/etc so is there a workaround to calculate the sqrt of
> > a var?
> >
> > Thanks
> > --
> > Tiago Costa
> >
>
> Only linear constraints are allowed while sqrt makes the constraint
> non-linear. However, using sqrt *below* the solve statement, i.e. when
> all the variables have been computed, is allowed.
>
>
>
> _______________________________________________
> Help-glpk mailing list
> https://lists.gnu.org/mailman/listinfo/help-glpk
>
> This e-mail and any attachments may be confidential or legally
> privileged. If you received this message in error or are not the intended
> recipient, you should destroy the e-mail message and any attachments or
> copies, and you are prohibited from retaining, distributing, disclosing
> or using any information contained herein.  Please inform us of the
> erroneous delivery by return e-mail. Thank you for your cooperation.
>
> _______________________________________________
> Help-glpk mailing list