www.gusucode.com > optim 案例源码 matlab代码程序 > optim/plotInvestments.m
function plotInvestments(N,PurchaseYears,Maturity,InterestRates,varargin) %plotInvestments creates a figure to visualize the setup and % the solution of the long-term investment example. % This is a helper function for the Long-Term Investment Example. % % To visualize the problem setup: % plotInvestments(N,PurchaseYears,Maturity,InterestRates) % % To visualize the solution: % plotInvestments(N,PurchaseYears,Maturity,InterestRates,xsol) % % Inputs: % N - scalar containing the number of available bonds % % PurchaseYears - nPtotal-by-1 vector containing the purchase year for each % bond % % Maturity - nPtotal-by-1 vector containing the maturity period for each % bond. % % InterestRates - nPtotal-by-1 vector containing the expected yearly return for % each bond. % % Optional Inputs: % xsol - nPtotal-by-1 vector containing the solution to the investment % problem. % % smallScale - boolean (true by default). If set to false, the plot only % contains lines and no text. % Determine whether the call is to visualize: % * the problem setup (plotSol = 0); or % * the solution (plotSol = 1) % based on the number of inputs. plotSol = 0; smallScale = true; if nargin > 4 plotSol = 1; xsol = varargin{1}; if nargin > 5 smallScale = varargin{2}; end end % Total number of purchase options nPtotal = length(PurchaseYears); % Number of years T = nPtotal-N; % Create a figure if smallScale figure('Position',[20 100 700 100+25*(N+2)],... 'Color','w','Units','Pixels') else figure('Position',[20 100 700 700],... 'Color','w','Units','Pixels') end % Create an axis ax = gca; % Set the axes to fill the entire figure set(ax,'Position',[0 0 1 1]); % remove the axis ticks axis off hold on % Define x- and y-spacing for the year and bonds x = linspace(0.08,0.98,T+1); xwidth = x(2)-x(1); xl = 0.02; if smallScale yt = 0.98; y = linspace(0.84,0.02,N+2); ywidth = y(1)-y(2); else yt = 0.94; y = linspace(0.92,0.02,N+2); ywidth = y(1)-y(2); end % Plot the vertical year lines xyear = NaN(3*T+2,1); xyear(1:3:end) = x; xyear(2:3:end) = x; yyear = NaN(3*T+2,1); yyear(1:3:end) = yt; yyear(2:3:end) = y(end); plot(xyear,yyear,'k--') if smallScale plot([xl xl],[y(1) y(end)],'k') end % if small scale if smallScale % Plot the horizontal bond lines xsec = NaN(3*(N+2),1); xsec(1:3:end) = xl; xsec(2:3:end) = x(end); ysec = NaN(3*(N+2),1); ysec(1:3:end) = y; ysec(2:3:end) = y; plot(xsec,ysec,'k') plot([x(1) x(end)], [yt yt],'k') % Add textbox to label each year for j=1:T annotation('textbox','Position',[x(j) y(1) xwidth yt-y(1)],... 'String', [ 'Year ' num2str(j)],... 'VerticalAlignment','Middle', 'HorizontalAlignment','Center',... 'EdgeColor','none'); end % Add textbox to label each bond for i=0:N annotation('textbox','Position',[xl y(i+2) x(1)-xl ywidth],... 'String',['B_' num2str(i) char(10) num2str(InterestRates(i+T)) '%' ],... 'VerticalAlignment','Middle', 'HorizontalAlignment','Center',... 'EdgeColor','none'); end % Plot the bonds % Start with the first bond on the first line for j=1:T % Draw a rectangle for each purchase option that extends for the length % of the maturity period ar = annotation('rectangle','Position',[x(j) y(2) x(j+1)-x(j) ywidth],... 'FaceColor', [0.8 0.8 0.8]); % If visualizing the solution if plotSol % Add a textbox containing the amount invested annotation('textbox','Position',[x(j) y(2) x(j+1)-x(j) ywidth],... 'String', ['x' num2str(j) ' = ' num2str(xsol(j),'%.2f')],... 'VerticalAlignment','middle', 'HorizontalAlignment','Center',... 'EdgeColor','none'); % If the amount invested is not too small color the rectangle in % red if xsol(j)>1e-2 set(ar,'FaceColor',[0.85 0.15 0.15]); end else % Otherwise display the index for this purchase option annotation('textbox','Position',[x(j) y(2) x(j+1)-x(j) ywidth],... 'String', ['x' num2str(j)],... 'VerticalAlignment','middle', 'HorizontalAlignment','Center',... 'EdgeColor','none'); end end % Plot the index and expected returns for the other purchase options for i = 1:N j = PurchaseYears(i+T); % year of purchase Sidx = i+T; % purchase option index % Draw a rectangle for each purchase option that extends for the length % of the maturity period ar = annotation('rectangle','Position',[x(j) y(i+2) x(j+Maturity(Sidx))-x(j) ywidth],... 'FaceColor', [0.8 0.8 0.8]); % If visualizing the solution if plotSol % Add a textbox containing the amount invested annotation('textbox','Position',[x(j) y(i+2) x(j+Maturity(Sidx))-x(j) ywidth],... 'String', ['x' num2str(Sidx) ' = ' num2str(xsol(Sidx),'%.2f')],... 'VerticalAlignment','middle', 'HorizontalAlignment','Center',... 'EdgeColor','none'); % If the amount invested is not too small color the rectangle in % red if xsol(Sidx)>1e-2 set(ar,'FaceColor',[0.85 0.15 0.15]); end else % Otherwise display the index for this purchase option annotation('textbox','Position',[x(j) y(i+2) x(j+Maturity(Sidx))-x(j) ywidth],... 'String', ['x' num2str(Sidx)],... 'VerticalAlignment','middle', 'HorizontalAlignment','Center',... 'EdgeColor','none'); end end else % if large scale example % Plot the horizontal bond lines idx = xsol>1e-2; nsol = nnz(idx); xsec = NaN(3*nsol,1); xsec(1:3:end) = x(PurchaseYears(idx)); xsec(2:3:end) = x(PurchaseYears(idx)+Maturity(idx)); ysec = NaN(3*nsol,1); idx0 = idx(1:T); nsol0 = nnz(idx0); ysec(1:3:3*nsol0) = y(1); ysec(2:3:3*nsol0) = y(1); ysec(3*nsol0+1:3:end) = y(find(idx(T+1:end))+1); ysec(3*nsol0+2:3:end) = y(find(idx(T+1:end))+1); plot(xsec,ysec,'r','LineWidth',2) % Add textbox to label the solution bonds tidx = find([sum(idx0);idx(T+1:end)]); for i=1:nnz(tidx) annotation('textbox','Position',[xl y(tidx(i)) x(1)-xl ywidth],... 'String',['B_{' num2str(tidx(i)-1) '}'],... 'VerticalAlignment','Middle', 'HorizontalAlignment','Center',... 'EdgeColor','none'); end % Add textbox to label each year annotation('textbox','Position',[0 yt x(1) 0.98-yt],... 'String', 'Year ',... 'VerticalAlignment','Middle', 'HorizontalAlignment','Right',... 'EdgeColor','none'); for j=1:T annotation('textbox','Position',[x(j) yt xwidth 0.98-yt],... 'String', num2str(j), 'FontSize', 8,... 'VerticalAlignment','Middle', 'HorizontalAlignment','Center',... 'EdgeColor','none'); end end hold off