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.
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.
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.
I need it so that the return value is constant, not randomized.
ASKER
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);
?>
ASKER
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.
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.
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;
}
Still not sure I understand the function. Could you sketch a curve that would show what you're seeking?
nerotech-function.gif
nerotech-function.gif
ASKER
Yes Ray, thats exactly what i'm after.
shinji,
how do the results of the function i supplied compare to what you want?
how do the results of the function i supplied compare to what you want?
ASKER
Virmaior: its not what i'm after.
Test values:
25-100 (0% difference)
101 (9.1% difference)
10,000 (19% difference)
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
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)
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?
kore de ha nihon no kanji wo kaite dekimasen. shikashi, saisho no hoshikatta no kotae to ima no sagashiteru no kotae ha chigaimashita no?
ASKER
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).
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
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
ASKER
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.
Open in new window