Метод называется итерацией с фиксированной точкой;см., например, статью в Википедии http://en.wikipedia.org/wiki/Fixed_point_iteration.
Идея состоит в том, что если rate
содержит правильное значение (то есть IRR), то NPV равно нулю, поэтому утверждение
rate *= (1 - npv(rate, cashflows) / investment)
не изменится rate
.Таким образом, как только вы найдете IRR, итерация не изменит его.Итерация с фиксированной точкой иногда сходится к правильному значению, а иногда нет.Примеры @Gareth и @unutbu показывают, что здесь они не всегда сходятся.
Критерий сходимости заключается в следующем.Запишите оператор обновления в цикле как
rate = rate * (1 - npv(rate, cashflows) / investment)
Теперь, если производная правой части по rate
находится между 1 и -1, то метод сходится.Я не могу сразу увидеть, при каких обстоятельствах это имеет место.
Вы можете удивиться, почему итерация не обходится без
rate *= (1 - npv(rate, cashflows))
без странной переменной investment
.Действительно, я удивлялся тому же самому;это также будет метод с фиксированной запятой, который сходится к IRR, если выполняется условие производной.Я предполагаю, что производное условие удовлетворяется в некоторых обстоятельствах для метода, который вы дали, а не для метода без investment
.