%% MonthlyPayment.m -- Figure out your monthly payment of your housing loan %% !!!***Please do not redistribute this code via public media such as Internet/Email. Thanks! ***!!! %% !!!***Demonstration ONLY -- No Commercial Use Without Permission! Thanks! ***!!! %% Created by Yufeng Zheng (Yufeng.Zheng@R2Image.com) on June 6, 2006 %% function [monPay tPayToYear] = MonthlyPayment(totalLoan, downPayment, loanYears, annualInterest, flagPrintMonthly, monPayGuess) %% Ex: MonthlyPayment(200000, 50000, 15, 4.5, 1); %print out a detailed list month-by-month %% monPay = MonPay(200000, 50000, 15, 4.5, 0); % Usage to calculate the difference between two Interest Rates -- Mar 12, 2009 % % [mp4 tp4]=MonPay(200000, 50000, 15, 4.5); % % [mp5 tp5]=MonPay(200000, 50000, 15, 4.75); % % tp5-tp4 %% function [monPay tPayToYear] = MonthlyPayment(totalLoan, downPayment, loanYears, annualInterest, flagPrintMonthly, monPayGuess) tPayToYear = []; annualInterest = annualInterest / 100; loanAmount = totalLoan - downPayment; %totalInterest = loanAmount * loanYears * annualInterest, if(nargin < 5) flagPrintMonthly = 0; end if(nargin < 6) % monPayGuess = (loanAmount * annualInterest / 12) * 1.1187; monPayGuess = (loanAmount / loanYears / 12) * 1.5; end epsilonErr = 1; %%$5 error stepAdjust = 0.005; maxLoops = 10000000; numLoops = 0; diff = loanAmount; while(abs(diff) > epsilonErr) numLoops = numLoops + 1; debt = loanAmount; %principle (debt) remained to be paid paidLoan = 0; %should equal to [loanAmount] for(i = 1:loanYears*12) curMonInterest = (debt * annualInterest / 12); %a varying interest month-by-month paidLoan = paidLoan + (monPayGuess - curMonInterest); debt = debt - (monPayGuess - curMonInterest); end diff = paidLoan - loanAmount; if(abs(diff) > epsilonErr) if(diff < 0) monPayGuess = monPayGuess * (1+stepAdjust); else monPayGuess = monPayGuess * (1-stepAdjust); end end if(numLoops > maxLoops) error('MaxLoops (100,000) is reached!!!'); end end % diff, % debt, % numLoops, monPay = monPayGuess; totalPaid = monPay * loanYears * 12; totalInterest = totalPaid - loanAmount; fprintf('\nSummary: \tMonthly Payment = %.2f; \t Total Payment = %.2f; \n \t\t\tTotal Interest = %.2f\n',monPay,totalPaid,totalInterest); if(flagPrintMonthly == -1) fprintf('\n\tWarning: Not Printing Yearly/Monthly List because of [flagPrintMonthly = %d]\n',flagPrintMonthly); return; end debt = loanAmount; %principle (debt) remained to be paid paidLoan = 0; %should equal to [loanAmount] paidInterest = 0; %fprintf('\n\tEndOfYear\t\tPaidLoan\t\tPaidInterest\t\tTotalPayment\t\tDebt\n'); fprintf('\nYear\t\tpLoan\t\tpItst\t\ttPay\t\tDebt\n'); for(i = 1:loanYears) for(j = 1:12) curMonInterest = (debt * annualInterest / 12); %a varying interest month-by-month paidInterest = paidInterest + curMonInterest; paidLoan = paidLoan + (monPay - curMonInterest); debt = debt - (monPay - curMonInterest); if(flagPrintMonthly == 1) totalPayment = paidLoan + paidInterest;%%TEMP 1/6/2009 fprintf('\t M%d\t\t%.0f\t\t%.0f\t\t%.0f\t\t%.0f\n',j,paidLoan,paidInterest,totalPayment,debt);%%TEMP end end totalPayment = paidLoan + paidInterest; if(flagPrintMonthly == 1) fprintf('\t_Y%d\t\t%.0f\t\t%.0f\t\t%.0f\t\t%.0f\n',i,paidLoan,paidInterest,totalPayment,debt); else fprintf('\tY%d\t\t%.0f\t\t%.0f\t\t%.0f\t\t%.0f\n',i,paidLoan,paidInterest,totalPayment,debt); end tPayToYear = [tPayToYear; totalPayment]; end return;