Как увеличить число для определенного процента (скажем,% 10) в несколько раз (скажем, 20), а затем снова уменьшить его до базового значения? - PullRequest
0 голосов
/ 11 июня 2018

У меня в основном есть число, скажем 100.

Я могу увеличить его на 10 процентов каждый раз .Итак:

  • 1-й запуск стал бы 110,
  • 2-й 121,
  • 3-й 133 и так далее.

Я могу посчитать, насколько это значение было увеличено. Но как экспоненциально уменьшить количество, зная, сколько раз оно было увеличено до 100?

Есть ли способ сделать это с помощью простой математической операции, такой как ** вместо циклатекущее значение, сколько раз оно было изменено на 10 процентов?

Я знаю, что могу просто сохранить его в дополнительном столбце, например base_number=100 или что-то еще, когда мне нужно базовое значение, но я хотел бы знать, возможно ли это сделать с помощью однострочных вычислений?

Ответы [ 2 ]

0 голосов
/ 11 июня 2018

Давайте сделаем простой пример и попробуем найти формулу:

100 * 1.10 = 110;
110 * 1.10 = 121;
121 * 1.10 = 133.1;

Итак, сейчас у нас есть:

basic_number (will be bn) * increase_value (will be iv) = basic_number2;
bn2 * iv = bn3;
bn3 * iv = bn4;

Мы можем написать это тоже:

bn * iv = bn2;
bn * iv * iv = bn3;
bn * iv * iv * iv = bn4;

Итак, у нас есть начало формулы:

bn * iv^3 = bn4;

Теперь у вас будут данные в соответствии с вашим постом:

X : the number of increase
bnX : the basic number increase X time
iv : the increase value

И вы хотите найтиbn в соответствии с этими значениями:

bn * iv^X = bnX;
bn = bnX / iv^X;
bn = bnX / (iv * iv * iv ... * iv); // X time

Так что с PHP это может выглядеть так:

$X = /* the number of incease */;
$bnX = /* the basic number increase X time */;
$iv = /* the increase value */;

for($i = 0; $i < $X; $i++) {
    $bnX = $bnX / $iv;
}

Таким образом, если вы echo $bnX; в конце цикла, выдолжен получить ваш базовый номер!

Вы можете попытаться создать формулу php и использовать ее каждый раз:

// 1/ Using a loop
function getBasicNumber($bnX, $X, $iv) {
    for($i = 0; $i < $X; $i++) {
        $bnX = $bnX / $iv;
    }
    return $bnX;
}

РЕДАКТИРОВАТЬ

// 2/ Using pow
function getBasicNumber($bnX, $X, $iv) {
    return $bnX / pow($X, $iv);
}

// 3/ Using '**'
function getBasicNumber($bnX, $X, $iv) {
    return $bnX / $X**$iv;
}

Таким образом, вам просто нужно сделать:

echo getBasicNumber(133.1, 3, 1.10); // 100 here for example

Надеюсь, это понятно?Но все же, это скорее математическая проблема, чем программирование

0 голосов
/ 11 июня 2018

Итак, ваш основной вопрос: как вы инвертируете и находите x_0 с учетом известных n и:

x_n = x_0 * 1.1^n

Похоже, мы можем просто разделить на 1.1^n

x_n/(1.1^n) = x_0

Таким образом, вы можете либо вычислить 1.1^n с помощью pow(1.1, n) и разделить на это x_n (ваше «увеличенное» значение), либо просто зациклить и уменьшить, как вы увеличили:

//1.
$original = $increased/pow(1.1, n);

//2.
$original = $increased;
for ($i = 0; $i < n; $i++) {
    $original = $original / 1.1;
}

Итак, в вашем примере, скажем, наш $increased известен как 133, а n=3.Затем с помощью первого метода:

$original = 133 / (1.1^3) = 133 / 1.33 = 100
...