package financial import "math" // IRRCalculatorImpl implements IRRCalculator interface type IRRCalculatorImpl struct{} // NewIRRCalculator creates a new IRR calculator func NewIRRCalculator() IRRCalculator { return &IRRCalculatorImpl{} } // CalculateIRR calculates Internal Rate of Return using Newton-Raphson method // IRR is the discount rate where NPV = 0 func (irr *IRRCalculatorImpl) CalculateIRR(capex, annualCashFlow float64, years int) float64 { if annualCashFlow <= 0 { return 0.0 // No positive cash flow } // Newton-Raphson iteration irrRate := 0.1 // Initial guess: 10% tolerance := 0.0001 maxIterations := 100 for i := 0; i < maxIterations; i++ { npv := -capex derivative := 0.0 for year := 1; year <= years; year++ { yearFloat := float64(year) discountFactor := math.Pow(1+irrRate, yearFloat) npv += annualCashFlow / discountFactor derivative -= yearFloat * annualCashFlow / math.Pow(1+irrRate, yearFloat+1) } if math.Abs(npv) < tolerance { return irrRate * 100 // Return as percentage } if derivative != 0 { irrRate = irrRate - npv/derivative } else { break } // Prevent negative IRR if irrRate < -0.99 { irrRate = -0.99 } } return irrRate * 100 // Return as percentage }