#!/usr/bin/env ruby # simulateur de prets immobiliers multiples require 'optparse' apport = 0 pret = 160000 pretlen= 25 taux = 5.00 pretzero = 27000 pretzerolen = 8 pret1pc = 9600 pret1pclen = 10 OptionParser.new { |o| o.on('-p pret', Integer) { |p| pret = p } o.on('-d duree', Integer) { |d| pretlen = d } o.on('-a apport', Integer) { |a| apport = a } o.on('-t taux', Float) { |t| taux = t } o.on('--p0 p0', Integer) { |p0| pretzero = p0 } o.on('--p0len p0len', Integer) { |p0len| pretzerolen = p0len } o.on('--p1 p1pc', Integer) { |p1pc| pret1pc = p1pc } o.on('--p1len p1pclen', Integer) { |p1pclen| pret1pclen = p1pclen } }.parse! class Pret attr_accessor :du, :taux, :interets def initialize(du, taux) @du, @taux = du, taux.to_f @interets = 0 end def mensualite(mens=0) int = @du * @taux / 100 / 12 @interets += int @du += int if mens > @du @du = 0 else @du -= mens mens end end def tpm 1.00 + @taux.to_f / 100 / 12 end def sumtpm(n) tpm == 1.0 ? n.to_f : ((tpm ** n) - 1) / (tpm - 1) end def calc_mens(duree) @du * (tpm ** duree) / sumtpm(duree) end # duree tot = t3 # 0 -> t3: paye retval sur differents prets # 0 -> t1: paye m1 de moins ( = mens pret 1) # 0 -> t2: paye m2 de moins ( = mens pret 2) def calc_mens_cx(t3, t1, m1, t2, m2) t1, t2, m1, m2 = t2, t1, m2, m1 if t1 > t2 m1 += m2 p = @du * (tpm ** t3) + m1.to_f * (tpm ** (t3-t1)) * sumtpm(t1) + m2.to_f * (tpm ** (t3-t2)) * sumtpm(t2-t1) q = (tpm ** (t3-t1)) * sumtpm(t1) + (tpm ** (t3-t2)) * sumtpm(t2-t1) + sumtpm(t3-t2) p / q end end p0 = Pret.new(pretzero, 0) p1 = Pret.new(pret1pc, 1.5) p = Pret.new(pret - p0.du - p1.du - apport, taux) m0 = p0.calc_mens(pretzerolen*12) m1 = p1.calc_mens(pret1pclen*12) mb = p.calc_mens_cx(pretlen*12, pretzerolen*12, m0, pret1pclen*12, m1) puts "mens: t0 %.2f*#{pretzerolen}a 1%% %.2f*#{pret1pclen}a pret (#{p.du}) %.2f*#{pretlen}a" % [m0, m1, mb-m0-m1] puts "total => %.2f (= %.2f / 3)" % [mb, mb*3] (pretlen * 12).times { |i| mens = mb mens -= p0.mensualite(m0) mens -= p1.mensualite(m1) puts "#{i/12} du %.2f int %.2f" % [p.du, p.interets] if $VERBOSE and i % 12 == 0 if p.mensualite(mens) == 0 puts "fini a #{i/12}a#{i%12}" break end } puts "reste du: %.2fe - interets: 1%% %.2f, pret %.2f (%.2f)" % [p.du, p1.interets, p.interets, p1.interets+p.interets]