#!/usr/bin/env python
# -*- coding: utf-8 -*-
# ***************************************************************************
# * Copyright (C) 2015, Paul Lutus *
# * *
# * This program is free software; you can redistribute it and/or modify *
# * it under the terms of the GNU General Public License as published by *
# * the Free Software Foundation; either version 2 of the License, or *
# * (at your option) any later version. *
# * *
# * This program is distributed in the hope that it will be useful, *
# * but WITHOUT ANY WARRANTY; without even the implied warranty of *
# * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
# * GNU General Public License for more details. *
# * *
# * You should have received a copy of the GNU General Public License *
# * along with this program; if not, write to the *
# * Free Software Foundation, Inc., *
# * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
# ***************************************************************************
# Created on Nov 12, 2015 11:43:51 AM
from sympy import *
import re,sys,os
# in LaTeX rendering, this separates
# certain two-letter variables for readability
def padspace(s):
return re.sub(r'(fv|ir|pv|pb|pmt|np)',r'\1\,',s)
var('pv fv np pmt ir pb')
# the base equation from which all others are derived
bfa = ((pb*ir+1)*pmt-(ir+1)**np*((pb*ir*pmt)+pmt+ir*pv))/ir
bfe = fv - bfa
print('Base financial equation:\n')
eq = Equality(fv,bfa)
pprint(eq)
print('In LaTeX form:\n')
pprint(padspace(latex(eq)))
for lat in (True,False):
print('\n*** Result for %s' % ('viewing','Webpage')[lat])
results = []
# for payment at end|beginning
for p in (0,1):
print('\n*** Payment at %s\n' % ('End','Beginning')[p])
# solve for each variable
for v in (pv,fv,np,pmt):
q = solve(bfe,v)[0].subs({pb:p}).simplify()
results.append(q)
# create insertable LaTeX block for Web page
if(lat):
print(r'\begin{equation}')
print(str(v) + ' = ' + padspace(latex(q)))
print(r'\end{equation}')
else:
pprint(Equality(v,q))
# declare functional forms of the equations
fpv = lambdify((fv,np,pmt,ir),results[0])
ffv = lambdify((pv,np,pmt,ir),results[1])
fnp = lambdify((pv,fv,pmt,ir),results[2])
fpmt = lambdify((pv,fv,np,ir),results[3])
ppmt = fpmt(0,100000,200,0.01)
print('\nExample problem:\n')
# test the functions for consistency
# using an example problem
print(ffv(0,200,ppmt,0.01))
print(fpv(100000,200,ppmt,0.01))
print(fpmt(0,100000,200,0.01))
print(fnp(0,100000,ppmt,0.01))
print('\nRound Robin Calculation:\n')
y = ffv(0,200,ppmt,0.01)
print(y)
x = fpv(y,200,ppmt,0.01)
print(x)