tt_IRR function
tt_IRR(values, guess): internal rate of return (Newton-Raphson iteration)
Implementation
dynamic tt_IRR(List<dynamic> values) {
final n = values.length;
if (n < 2) return 0.0;
var rate = varToDouble(values.last); // guess
final cashFlows = values.sublist(0, n - 1).map(varToDouble).toList();
for (var iter = 0; iter < 100; iter++) {
double npv = 0, dnpv = 0;
for (var i = 0; i < cashFlows.length; i++) {
final v = cashFlows[i];
npv += v / pow(1 + rate, i);
if (i > 0) dnpv -= i * v / pow(1 + rate, i + 1);
}
if (dnpv.abs() < 1e-10) break;
rate -= npv / dnpv;
if (npv.abs() < 1e-8) break;
}
return rate;
}