NB: comme on m'a déjà demandé de faire une offre de crédit (), je précise: je ne suis pas banquier !!!
On cherche à calculer n'importe lequel de ces 4 nombres à partir des 3 autres.
Chaque fin de mois k, la mensualité est composée d'une partie du capital remboursé (Ck), et des intérêts (Ik) correspondant au travail pendant un mois du capital non encore remboursé en début de mois. Et, bien sûr, toutes les mensualités sont égales.
Le 1er mois, on paye: C1 + I1 = M
Le 2ème mois, on paye: C2 + I2 = M
le 3ème mois, on paye: C3+I3 = M
etc… jusqu'à la dernière mensualité:
Si on fait la somme de toutes ces formules, on trouve:
On reconnait la somme d'une progression géométrique de raison (1+I). En effet, une progression géométrique est une liste de termes dont chacun peut être obtenu en multipliant le terme précédent par une valeur qu'on appelle la “raison” de la progression.
Par exemple pour n termes:
P = a + a*r + a*r2 + a*r3 … + a*rn-1
Et dans ce cas, on sait que la somme de cette progression est obtenue par:
S = a*(rn-1)/(r-1)
En remplaçant a par (M-I*C) et r par (1+I), on trouve la formule suivante pour calculer M:
En notation mathématique:
Et en notation Python:
Si en refaisant le calcul à la main vous trouvez <m>M~=~CI lbrace{1/{1-1/(1+I)^N}}rbrace</m>, ne vous inquiétez pas: ça donne le même résultat (essayez, ça donne en python: M = C*I*(1-(1/(1-(1+I)**N)))).
On déduit les formules suivantes
Pour le calcul de l'intérêt, nous avons une équation implicite à résoudre, puisque I apparait plusieurs fois dans la formule. On ne peut donc pas avoir une formule de type “I=…”: il s'agit donc de trouver I par programme, tel que f(I)=0, avec par exemple la formule de M :
C'est d'ailleurs très amusant de résoudre une équation implicite telle que f(I)=0 par programme:
Pour le calcul du tableau d'amortissement, on a déjà les formules plus haut. Ainsi, pour le mois k:
Voilà, c'est fini pour la théorie, il ne reste plus qu'à programmer!
#!/usr/bin/python # -*- coding: utf-8 -*- # n'oubliez pas la ligne suivante pour que la division, même entre 2 entiers, donne toujours un résultat décimal from __future__ import division def menscredit(C,IA,N): """menscredit(C,IA,N): mensualités M d'un prêt C à IA% d'intérêt par an, à rembourser en N mois""" # si le capital est nul, il n'y a rien à rembourser if C==0: M=0 return M # si l'intérêt est nul, la mensualité ne dépend plus que de C et N if IA==0: M=C/N return M # calcul de la mensualité dans le cas général C=C I=IA/1200 M=C*I*(1-1/(1-(1+I)**N)) return M
#!/usr/bin/python # -*- coding: utf-8 -*- # n'oubliez pas la ligne suivante pour que la division, même entre 2 entiers, donne toujours un résultat décimal from __future__ import division def moiscredit(C,IA,M): """moiscredit(C,IA,M): nombre de mois de remboursement d'un prêt C ayant un intérêt IA%/an et une mensualité M""" # si le capital est nul, il n'y a rien a rembourser if C==0: N=0 return N # si l'intérêt est nul, la mensualité ne dépend que de N if IA==0: N=C/M return N # calcul du nombre de mois de remboursement C=C I=IA/1200 N=log(1-1/(1-M/(C*I)))/log(1+I) return N
#!/usr/bin/python # -*- coding: utf-8 -*- # n'oubliez pas la ligne suivante pour que la division, même entre 2 entiers, donne toujours un résultat décimal from __future__ import division def capcredit(IA,M,N): """capcredit(IA,M,N): capital emprunté à IA%/an d'intérêt, remboursé en N mois avec une mensualité de M""" # si l'intérêt est nul, le capital est facile à calculer! if IA==0: C=M*N return C # calcul du capital emprunté I=IA/1200 M=M C=M/(I*(1-(1/(1-(1+I)**N)))) return C
#!/usr/bin/python # -*- coding: utf-8 -*- # n'oubliez pas la ligne suivante pour que la division, même entre 2 entiers, donne toujours un résultat décimal from __future__ import division def intcredit(C,M,N): """intcredit(C,M,N): intérêt IA%/an, connaissant le capital emprunté C, la mensualité M et le nb de mois de remboursement N""" # cas ou l'intérêt est manifestement nul if N*M==C: IA=0 return IA # calcul de IA par recherche de zéro IA=10.0 DI=1.0 eps=0.000001 F1=M-menscredit(C,IA,N) F2=F1 while (fabs(F1)>eps): F1=F2 IA=IA+DI F2=M-menscredit(C,IA,N) if ((F2*F1)<0) or (fabs(F2)>fabs(F1)): DI=-DI/2 return IA
#!/usr/bin/python # -*- coding: utf-8 -*- # n'oubliez pas la ligne suivante pour que la division, même entre 2 entiers, donne toujours un résultat décimal from __future__ import division def coutcredit(C,M,N,sup=0): """coutcredit(C,M,N,sup=0): coût d'un crédit connaissant le capital C, la mensualité M et le nb de mois de remboursement N (sup = coût supplémentaire optionnel)""" return M*N-C+sup