Link to home
Start Free TrialLog in
Avatar of nerotech
nerotech

asked on

Linear Decrease Algorithm

Hello,

Could someone please provide a PHP Algorithm which will result in a smaller value being returned when a larger value is provided.

E.g.

x(25); //returns say 50
x(50); //returns say 49.3
x(100000); //returns say 1 etc

function x($value) {
code..
return($value) {
}

Also i would like it where negative values will not be returned.

Regards Shinji.
Avatar of kszurek
kszurek

Maybe this:
function x($a)
{
	return rand(0, $a-1);
}
echo x(25);

Open in new window

Avatar of nerotech

ASKER

Thanks for the response, but this is not what i'm after.

I need it so that the return value is constant, not randomized.
Note: i should have named the topic "nonlinear decrease algorithm", as i wish to cause the decrease to become more significant as the provided value increases.
Nerotech: What rules would you apply to determine how much smaller the return value should be?
Strange solution:
<?PHP
function x($a)
{
	$b = substr(abs(crc32($a)), 0, 1);
	return ($a-$b > 0 ? $a-$b : 1);
}
echo x(46);
?>

Open in new window

Well initially I would prefer the returned value to be ~10% less of the provided value, as the value increments I would like the percentage to decrease more rapidly and Eventually the returned value would be 99.9% less than the original.

The point at which 99.9% less should be >=10,000

To summarize:

Start value >=0 && <=25 (-10%)
End value >=10,000 (-99.9%)

Percentage removed per increment will initially start slow, but will become more apparent at ~1,000.
Avatar of Roonaan
What kind of calculations are you doing? Something like showing an animation in x seconds with a varying start/end or something?

function non_linear_decrease($input)
{
  if ($input < 0 ) { return 0; }
  
  $input_temp = $input;
  $multiplier = 1;
  while (($input_temp / 10) )  > 10) {
    $multiplier = $multiplier * .9;
    $input_temp = $input_temp / 10; 
  }
 
  return $input * $multiplier;
}

Open in new window

Still not sure I understand the function.  Could you sketch a curve that would show what you're seeking?
nerotech-function.gif
Yes Ray, thats exactly what i'm after.
shinji,
how do the results of the function i supplied compare to what you want?
Virmaior: its not what i'm after.

Test values:
25-100 (0% difference)
101 (9.1% difference)
10,000 (19% difference)
Shinji: I have to leave and can't work on this, but it looks like you need a parabola with a horizontal axis.

http://www.intmath.com/Plane-analytic-geometry/4_Parabola.php

Good luck! ~Ray
K‰“Uc_hFg‚mSŒoiFgYK

function nonlinear_decrease($input)
{
   if (($input > 25) and ($input < 100)) { return $input; }
  return $input * (1 - log($input,1.62));
}

that gets the values you are looking for
(19% for 10000) and (9% for 100)
or rather return $input * (1 - ( log($input,1.62) / 100));

kore de ha nihon no kanji wo kaite dekimasen. shikashi, saisho no hoshikatta no kotae to ima no sagashiteru no kotae ha chigaimashita no?
Sorry Virmaior, i should have been less ambiguous with my response (and original question).
Those were the test values & results i used on the function that you provided earlier.

The values i need are:

Start value >=0 && <=25 (-10%)
End value >=10,000 (-99.9%)

with nonlinear increase (see the graph Ray posted).

Ray is correct in pointing out that I require a parabolic function (Quadrant I).
ASKER CERTIFIED SOLUTION
Avatar of Ray Paseur
Ray Paseur
Flag of United States of America image

Link to home
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Start Free Trial
Great, thanks alot Ray, works perfect! :)
Glad to help!  BTW, that algorithm (when unconstrained) is the central element of single-server queueing theory.  Response Time = Service Time divided by (1 - Percent Busy).  I have used it for years to predict computer performance under increasing loads.  Nice to see it serves your needs, too.