code: def apr
        payment_ratio = self.monthly_payment_with_fees / self.loan_amount
        f             = lambda { |k| (k**(self.period + 1) - (k**self.period * (payment_ratio + 1)) + payment_ratio) }
        f_deriv       = lambda { |k| ((self.period + 1) * k**self.period) - (self.period * (payment_ratio + 1) * k**(self.period - 1)) }
  
        root = newton_raphson(f, f_deriv, self.monthly_interest_rate + 1)
        100 * 12 * (root - 1).to_f
      end
docs: solves APR
   [a (1 + a)^N] / [(1 + a)^N - 1] - P/C = 0
   where a = APR/1200, N = period, P = monthly payment, C = loan_amount
   calculate APR uses the Newton-Raphson to find the root (the value for 'a' that makes f(a) = 0)