Code covered by the BSD License  

Highlights from
Mortgage

from Mortgage by Yi Cao
A small tool for mortgage calculation

[monthpay,annualpay,totalpay,balance]=mortgage(capital,rate,years,yinterest)
function [monthpay,annualpay,totalpay,balance]=mortgage(capital,rate,years,yinterest)

%MORTGAGE  A small tool for mortgage calculation 
%   [monthpay,annualpay,totalpay,balance]=mortgage(capital,rate,years,yinterest)
%Input   
%   capital: the loaned capital
%   rate (%): interest rate, either fixed or a vector of rates for different years
%   years: the loan period
%   yinterest: 1 - interest calculated annualy; 0 - interest calculated monthly 
%Output
%   monthpay: monthly payment with the same length as rate.
%   annualpay: annual payment with the same length as rate.
%   totalpay: total payment within the loan period.
%   blance: a vector of balance at the end of each year.
%
%Examples:
%   loan=75000; rate=7.5; years=25;
%   [monthpay,annualpay,totalpay,balance]=mortgage(loan,rate,years)
%   monthpay = 
%      560.69
%   annualpay =
%      6728.3
%   totalpay =
%      16821e+005
%   balance = 
%      73897
%      72711
%      71436
%     ......
%     -0.000
%
%   loan=75000; rate=[4.95+zeros(3,1);7.5+zeros(22,1)]; years=25;
%   [monthpay,annualpay,totalpay,balance]=mortgage(loan,rate,years)
%   monthpay = 
%      441.23
%      441.23
%      441.23
%      549.54
%      ......
%   balance =
%      73418
%      71757
%      70014
%      68671
%     ......
%    -0.0000
%

% By Yi Cao at Cranfield University on 15/09/2007
%

if nargin<4
    yinterest=1;
end
if isscalar(rate)
    if yinterest
        annualpay=capital*(1+1/((1+rate/100)^years-1))*rate/100;
        monthpay=annualpay/12;
        totalpay=annualpay*years;
        balance=filter(1,[1 -1-rate/100],[capital;-annualpay(ones(years,1))]);
    else
        monthpay=capital*(1+1/((1+rate/12/100)^(years*12)-1))*rate/12/100;
        annualpay=monthpay*12;
        totalpay=annualpay*years;
        mbalance=filter(1,[1 -1-rate/12/100],[capital;-monthpay(ones(years*12,1))]);
        balance=mbalance(1:12:end);
    end
    balance=balance(2:end);
else
    if numel(rate)~=years
        error('specified rate mismatch specified years.')
    end
    if yinterest
        balance=zeros(years,1);
        annualpay=balance;
        for k=1:years
            annualpay(k)=capital*(1+1/((1+rate(k)/100)^(years-k+1)-1))*rate(k)/100;
            capital=capital*(1+rate(k)/100)-annualpay(k);
            balance(k)=capital;
        end
        monthpay=annualpay/12;
        totalpay=sum(annualpay);
    else
        balance=zeros(years,1);
        monthpay=balance;
        for k=1:years
            mrate=rate(k)/12/100;
            monthpay(k)=capital*(1+1/((1+mrate)^((years-k+1)*12)-1))*mrate;
            tmp=filter(1,[1 -1-mrate],[capital -monthpay(k,ones(12,1))]);
            capital=tmp(end);
            balance(k)=capital;
        end
        annualpay=monthpay*12;
        totalpay=sum(annualpay);        
    end
end
    

Contact us at files@mathworks.com