;------------------------------------------------------------- ;+ ; NAME: ; MORT ; PURPOSE: ; Mortgage or loan computation. ; CATEGORY: ; CALLING SEQUENCE: ; mort, amt, yi, ny, pmt ; INPUTS: ; amt = amount borrowed. in ; yi = yearly interest rate in %. in ; ny = number of years for loan. in ; pmt = monthly payment. in ; May be an array, see notes. ; If pmt <= 0 then add to required as extra. ; KEYWORD PARAMETERS: ; Keywords: ; SUMMARY=sm return summary array: ; [total paid, cost of credit, cost as %, times original, ; months, required monthly payment] ; If any payment < required value then sm(0) is -1. ; FILE=f output file. ; /NOLIST suppresses listing. ; OUTPUTS: ; COMMON BLOCKS: ; NOTES: ; Note: pmt may be an array. If not enough ; payments the last value is used repeatedly. ; Mort is run interactively if no arguments are given. ; Useful note: a payment computation may be picked up in the ; middle. For example, suppose a 30 year $100,000 loan is ; being repayed at %10 yearly interest with $1000 payments ; each month. At month 200, after $200,000 has been payed, ; there is $14839.06 left, and $15898.75 yet to be paid. ; This computation may be picked up from month 200 by ; entering 14839.06 as the loan amount, %10 interest, and ; $1000 payments. The total paid will be $15898.75. Use ; any value for the number of years as long it it allows ; the desired monthly payments or less. ; MODIFICATION HISTORY: ; R. Sterner, 5 Jul, 1990 ; ; Copyright (C) 1990, Johns Hopkins University/Applied Physics Laboratory ; This software may be used, copied, or redistributed as long as it is not ; sold and this copyright notice is reproduced on each copy made. This ; routine is provided as is without any express or implied warranties ; whatsoever. Other limitations apply as described in the file disclaimer.txt. ;- ;------------------------------------------------------------- pro mort, amt0, yi0, ny, pmt, help=hlp, summary=sm, $ file=file, nolist=nolst if keyword_set(hlp) then begin print,' Mortgage or loan computation.' print,' mort, amt, yi, ny, pmt' print,' amt = amount borrowed. in' print,' yi = yearly interest rate in %. in' print,' ny = number of years for loan. in' print,' pmt = monthly payment. in' print,' May be an array, see notes.' print,' If pmt <= 0 then add to required as extra.' print,' Keywords:' print,' SUMMARY=sm return summary array:' print,' [total paid, cost of credit, cost as %, times original,' print,' months, required monthly payment]' print,' If any payment < required value then sm(0) is -1.' print,' FILE=f output file.' print,' /NOLIST suppresses listing.' print,' Note: pmt may be an array. If not enough' print,' payments the last value is used repeatedly.' print,' Mort is run interactively if no arguments are given.' print,' Useful note: a payment computation may be picked up in the' print,' middle. For example, suppose a 30 year $100,000 loan is' print,' being repayed at %10 yearly interest with $1000 payments' print,' each month. At month 200, after $200,000 has been payed,' print,' there is $14839.06 left, and $15898.75 yet to be paid.' print,' This computation may be picked up from month 200 by' print,' entering 14839.06 as the loan amount, %10 interest, and' print,' $1000 payments. The total paid will be $15898.75. Use' print,' any value for the number of years as long it it allows' print,' the desired monthly payments or less.' return endif ;------- Must prompt for some or all parameters --------------- if n_elements(amt0) eq 0 then begin print,' ' print,' ---==< Mortgage computation >==---' print,' ' amt0 = '' read,' Enter loan amount: ',amt0 if amt0 eq '' then return amt0 = amt0 + 0. endif if n_elements(yi0) eq 0 then begin yi0 = '' read,' Enter yearly interest rate: ',yi0 if yi0 eq '' then return yi0 = yi0 + 0. endif if n_elements(ny) eq 0 then begin ny = '' read,' Enter number of years for loan: ',ny if ny eq '' then return ny = ny + 0. endif ;------ compute required payment --------- yi = yi0/100. ; yearly rate as a fraction. amt = amt0 ; Loan amount. mi = yi/12. ; Monthly interest. nm = ny*12. ; Number of months of loan. cpmt = amt*(mi/(1.-1./(1.+mi)^nm)) ; Computed monthly payment. cpmt = long(cpmt*100. + .5)/100. ; Round to nearest penny. ;----- if no payment given prompt ------------- if n_elements(pmt) eq 0 then begin ploop: pmt = '' print, cpmt, format="(' Minimum required monthly payment = ',f8.2)" print,' Enter extra on principal as a negative.' print,' For example: -200 means $200 more than required amount.' read,' To change payment enter new amount (RET for same): ',pmt if pmt eq '' then pmt = cpmt pmt = pmt + 0. if pmt le 0 then pmt = cpmt + abs(pmt) if pmt lt cpmt then begin print,cpmt,format="(' You must pay at least ',f8.2)" goto, ploop endif endif else if pmt le 0 then begin ; If pmt as arg < 0 use as extra. pmt = cpmt + abs(pmt) endif ;------- Handle payment as an array --------- if min(pmt) lt cpmt then begin print,' Error in mort: all payments must be at the required value.' sm = [-1.] return endif lst = n_elements(pmt) - 1 ; Last element. ;------- handle summary printout --------- sflag = 0 ; Summary only flag. Def = print all. if (n_params(0) lt 4) then begin sflag = '' read,' Print summary only? y/n: ',sflag sflag = strlowcase(sflag) eq 'y' endif ;------ handle output file ----------- if n_elements(file) ne 0 then begin get_lun, lun openw, lun, file print,' Output going to file '+file+' . . .' endif else begin lun = -1 endelse ;------- init values ----------- mon = 0 ; Month counter. total = 0. ; Total payed. pmt_a = 0. ; Total Payment (may vary). pmti = 0. ; Amount of payment that is interest. pmtp = 0. ; Amount of payment that is principal. ;-------- List initial conditions ------------ if not keyword_set(nolst) then begin printf,lun, amt0, yi0, ny, cpmt, $ format="(//,' Loan amount = ',f10.2,/,"+$ "' Yearly interest rate = ',"+$ "f6.3,'%',/,' Number of years = ',f4.1,/,"+$ "' Required monthly payment = ',f8.2)" lo = min(pmt) hi = max(pmt) if lo ne hi then begin printf,lun,lo,hi,format="(' Actual monthly payment "+$ "varies from = ',f8.2,' to ',f8.2,//)" endif else begin printf,lun,lo,format="(' Actual monthly payment = ',f8.2,//)" endelse printf, lun, ' ' endif ;-------- List table heading --------- if (not keyword_set(nolst)) and (sflag ne 1) then begin printf,lun,' Mon Payment Interest Principal Remaining Total' endif ;--------- Computation loop --------------- loop: if (not keyword_set(nolst)) and (sflag ne 1) then begin printf,lun, mon, pmt_a, pmti, pmtp, amt, total, $ format="(' ',i3,' ',f8.2,' ',f8.2,' ',f9.2"+$ ",' ',f10.2,' ',f10.2)" endif if amt eq 0 then goto, done pmt_a = pmt(mon