"Bayu Firgiawan" wrote in message <lmkpi8$ha9$1@newscl01ah.mathworks.com>...
> "Steven Lord" <Steven_Lord@mathworks.com> wrote in message <lmkm7h$7jl$1@newscl01ah.mathworks.com>...
> > You've posted a LOT of code (though not all of it, I suspect) but we can't
> > run it because 1) it depends on what you type at various INPUT statements
> > and 2) it depends on the contents of variables you haven't showed us.
> >
> > Simplify this down to a SMALL section of code and instructions that people
> > can execute and with which you can reproduce the behavior. Post that code
> > and instructions to the group (please do NOT send them to me directly.) Then
> > readers of the group can try it out and see if they can reproduce the
> > behavior you're describing.
> >
> > As for the performance, I've got two ideas.
> >
> > 1) You're displaying a LOT of text to the Command Window with FPRINTF. Try
> > commenting those out or guarding them by IF statements controlled by a
> > variable you define at the top of your code, like:
> >
> > debugging = false;
> > if debugging
> > fprintf(...
> > end
> >
> > That way the text only displays when you turn debugging on.
> >
> > 2) You have a LOT of calls to HOLD throughout your code. My guess is that
> > you keep on adding line after line after line in the same axes, which will
> > cause rendering to slow down as the renderer has to figure out what to
> > display where and what's concealed "underneath" other graphics objects.
> >
> > *snip*
> >
> > --
> > Steve Lord
> > slord@mathworks.com
> > To contact Technical Support use the Contact Us link on
> > http://www.mathworks.com
>
Here are my entire code
repeat=1;
while repeat==1
close all
clc;
clear;
warning off all
format longG
%===================
while length(filename)<2
disp('Input Project file price');
start=input('[Press ENTER to continou]');
filename=uigetfile('.xlsx');
if length(filename)<2
disp('No file loaded. try to load it please.');
disp('--------------------------')
else
filepath=strcat(pwd,'/',filename);
disp('File loaded!');
fprintf(strcat('[',pwd,'/',filename,']\n'));
end
end
%=============================|
%input range mulai data
inputcelltext='input cell range';
cellrange1text=' (first cell) =';
fprintf(strcat(inputcelltext,cellrange1text));
cellrange1='';
while length(cellrange1)<2
cellrange1=input(' ','s');
if (length(cellrange1)<2)
fprintf('\b\b');
end
cellrange1split=strsplit(cellrange1,':');
if length(cellrange1split)>1
fprintf('\b\b');
for bscr=1:length(cellrange1) %backspacecellrange
fprintf('\b');
end
cellrange1='';
end
end
for bsic=1:(length(cellrange1text)+length(cellrange1)+1) %backspaceinputcell
fprintf('\b');
end
%=============================|
%input range akhir data
cellrange2text='(second cell) = ';
fprintf(cellrange2text);
fprintf(strcat(cellrange1,':'));
cellrange2='';
while length(cellrange2)<2
cellrange2=input('','s');
if (length(cellrange2)<2)
fprintf('\b');
end
end
%=============================|
%read date of data
cellrange=strcat(cellrange1,':',cellrange2);
V=xlsread(filepath,1,cellrange);
dtrange1=strsplit(cellrange1,cellrange1(1));
dtrange2=strsplit(cellrange2,cellrange2(1));
dt=xlsread(filepath,1,strcat('A',dtrange1{2},':A',dtrange2{2}));
clc;
disp('Crude oil prices (USD)')
fprintf(strcat(' periode [',datestr((dt((str2num(dtrange2{2})-1),1)+datenum('30-Dec-1899')),'dd/mm/yyyy'),'-',datestr((dt((str2num(dtrange1{2})-1),1)+datenum('30-Dec-1899')),'dd/mm/yyyy'),'] \n'))
disp('---------------------------------------------')
disp(V)
count=length(V);
%=============================|
%Year
t0=input('Publish Year = '); %Tahun awal diterbitkan
fprintf('=======================\n')
vart0=0;
while vart0==0
Te=input('Excecution Year = '); %Tahun Proyek dieksekusi
fprintf('======================\n')
if Te<(t0+1)
disp('Please input bigger year than Publish Year!');
else
vart0=1;
end
end
T=Te-t0;
tmin=0;
%=============================|
disp('Which Scenario?');
disp('1. Varying Standar Deviation (sigma).');
disp('2. Varying Expected Return (miu).');
disp('3. Varying Strike Price (D).');
disp('');
%=============================|
scenario=0;
while scenario<1 || scenario>3
scenario = input('[1-3] = ');
fprintf('========================\n')
if scenario<1 || scenario>3
disp('Input a scenario number!');
end
end
trial=0;
while trial<1
trial=input('How many number of trial ? = ');
if trial<1
disp('too small, \nrepeat again!');
end
end
%===============|
%Pencarian Return Data V
for i=1:count-1
returnV(i,1)=(V(i+1)-V((i)))/(V(i)); %Estimasi RETURN data V
end
%==============|
switch scenario
case 1
D(1:trial)=85;
miu(1:trial)=mean(returnV);
for tr=1:trial
fprintf('Input Sigma trial-%d = ',tr);
sig(tr)=input('');
sig2(tr)=sig(tr)^2;
sce(tr,scenario)=sig(tr);
end
fprintf('=============\n')
xlabels='Standar Deviasi (sigma)';
scetype(scenario)=cellstr(' Standar Deviasi');
case 2
D(1:trial)=85;
for tr=1:trial
fprintf('Input miu trial-%d = ',tr);
miu(tr)=input('');
sce(tr,scenario)=miu(tr);
end
fprintf('=====================\n')
sig2(1:trial)=var(returnV);
sig(1:trial)=sqrt(sig2(1));
xlabels='Expected Return (miu)';
scetype(scenario)=cellstr(' Expected Return');
case 3
for tr=1:trial
fprintf('Input strike price trial-%d = ',tr);
D(tr)=input('');
sce(tr,scenario)=D(tr);
end
fprintf('======================\n')
miu(1:trial)=mean(returnV);
sig2(1:trial)=var(returnV);
sig(1:trial)=sqrt(sig2(1));
xlabels='Strike Price (D)';
scetype(scenario)=cellstr('Strike Price');
end
for tr=1:trial
%=============================|
imax=T*1000; %jumlah subselang untuk V %DeltaV
jmax=T*1000; %jumlah subselang untuk (T)dibuatnya selama harian %DeltaT
%=============================|
r=miu(tr);
d=0; %Besar nilai dividen
%=============================|
%Pendefinisian nilai maksimum dan minimum dari rentang harga
Vmaks=max(V); %nilai maskimum dari data V
Vmin=min(V); %nilai minimum untuk data V
PMax=2*(Vmaks); %nilai prediksi maksimum dari data harga
%=============================|
%Persiapan kalkulasi menggunkan Metode Numerik Finite Different
p=(PMax-Vmin)/(imax); %panjang selang posisi untuk V
w=(T-tmin)/(jmax); %panjang selang posisi untuk tau
VV=Vmin:p:PMax; %vektor untuk data V interior
maxwa=max(VV-D(tr),0);
F{tr}=maxwa(1:size(maxwa,2))'; %syarat awal, nilai saat maturity
F2{tr}=F{tr};
F3{tr}=F{tr};
%=============================|
%pendefinisian t dan tau
for i=1:jmax+1
t(i)=(i-1)*w;
tau(i)=T-t(i);
end
%=============================|
D1=diag(1:1:(imax-1));
D2=D1.^2;
T1=diag(ones(imax-2,1),1)-diag(ones(imax-2,1),-1);
T2=-2*eye(imax-1,imax-1)+diag(ones(imax-2,1),1)+diag(ones(imax-2,1),-1);
%=============================|
% PENDEFINISIAN MATRIK DALAM METODE
% FTCS_BTCS_CRANK_NICOLSON
%=============================|
rd=r-d;
A{tr}=((1-(r*w))*eye(imax-1))+(0.5*w*sig2(tr)*D2*T2)+(0.5*rd*w*D1*T1); %Matriks untuk FTCS
g{tr}=[0.5*w*(sig2(tr)-rd)*(max(Vmin-(D(tr)*exp(-r*tau)),0)) zeros(1,(imax-3)) 0.5*w*(imax-1)*(sig2(tr)*(imax-1)+rd)*max(PMax-(D(tr)*exp(-r*tau)),0)]'; %Matriks untuk menyesuaikan dengan Matriks FTCS %zeros imax-3 disesuaikan dengan F dan A
B{tr}=((1+(r*w))*eye(imax-1))+(0.5*w*sig2(tr)*D2*T2)+(0.5*rd*w*D1*T1); %Matriks untuk BTCS
u{tr}=[0.5*w*(sig2(tr)-rd)*(max(Vmin-(D(tr)*exp(-r*tau)),0)) zeros(1,(imax-3)) 0.5*w*(imax-1)*(sig2(tr)*(imax-1)+rd)*max(PMax-(D(tr)*exp(-r*tau)),0)]'; %Matriks untuk menyesuaikan dengan Matriks BTCS %zeros imax-3 disesuaikan dengan F dan A
invB{tr}=inv(B{tr});
invIB{tr}=inv(eye(imax-1)+B{tr});
%=============================|
% PERHITUNGAN ITERASI MENGGUNAKAN METODE
% FTCS_BTCS_CRANK NICOLSON
% MENERAPKAN BOUNDARY AMERICAN OPTION
%=============================|
%definisi Awal batas awal dan batas akhir MatrixIterF
MatrixIterF{tr,1}=NaN(imax+1,jmax+1);
MatrixIterF{tr,1}(1,:)=max(Vmin-(D(tr)*exp((-r)*tau)),0); %syarat batas bawah
MatrixIterF{tr,1}(imax+1,:)=max(PMax-(D(tr)*exp(-r*tau)),0); %syarat batas atas
MatrixIterF{tr,1}(:,1)=F{tr}; %syarat awal
%definisi Awal batas awal dan batas akhir MatrixIterF
MatrixIterF{tr,2}=NaN(imax-1,jmax-1);
MatrixIterF{tr,2}(1,:)=max(Vmin-(D(tr)*exp((-r)*tau)),0); %syarat batas bawah
MatrixIterF{tr,2}(imax+1,:)=max(PMax-(D(tr)*exp(-r*tau)),0); %syarat batas atas
MatrixIterF{tr,2}(:,1)=F{tr}; %syarat awal
%definisi Awal batas awal dan batas akhir MatrixIterF
MatrixIterF{tr,3}=NaN(imax-1,jmax-1);
MatrixIterF{tr,3}(1,:)=max(Vmin-(D(tr)*exp((-r)*tau)),0); %syarat batas bawah
MatrixIterF{tr,3}(imax+1,:)=max(PMax-(D(tr)*exp(-r*tau)),0); %syarat batas atas
MatrixIterF{tr,3}(:,1)=F{tr}; %syarat awal
for j=2:jmax+1
F{tr}=A{tr}*F{tr}+g{tr}; %menghitung F menggunakan metode FTCS
F2{tr}=invB{tr}*(F2{tr}+u{tr}); %menghitung F menggunakan metode BTCS
F3{tr}=invIB{tr}*((A{tr}+eye(imax-1))*F3{tr}+g{tr}+u{tr}); %menghitung F menggunakan metode Crank-Nicolson
or i=1:imax
if F{tr}(i)>=(maxwa(i))'
MatrixIterF{tr,1}(i,j)=F{tr}(i);
else
MatrixIterF{tr,1}(i,j)=(maxwa(i))';
end
if F2{tr}(i)>=(maxwa(i))'
MatrixIterF{tr,2}(i,j)=F2{tr}(i);
else
MatrixIterF{tr,2}(i,j)=(maxwa(i))';
end
if F3{tr}(i)>=(maxwa(i))'
MatrixIterF{tr,3}(i,j)=F3{tr}(i);
else
MatrixIterF{tr,3}(i,j)=(maxwa(i))';
end
end
F{tr}=MatrixIterF{tr,1}(1:imax+1,j);
F2{tr}=MatrixIterF{tr,2}(1:imax+1,j);
F3{tr}=MatrixIterF{tr,3}(1:imax+1,j);
end
%=============================|
% PERHITUNGAN WAITING VALUE
% SEBAGAI HARGA OPSI
%=============================|
%Rumus = F-(max(V-D),0)
MatrixIterWait{tr,1}=NaN(imax+1,jmax+1);
MatrixIterWait{tr,2}=NaN(imax+1,jmax+1);
MatrixIterWait{tr,3}=NaN(imax+1,jmax+1);
for j=1:jmax+1
for i=1:imax+1
MatrixIterWait{tr,1}(i,j)=MatrixIterF{tr,1}(i,j)-(maxwa(i))'; %menghitung Waiting Value menggunakan metode FTCS
MatrixIterWait{tr,2}(i,j)=MatrixIterF{tr,2}(i,j)-(maxwa(i))'; %menghitung Waiting Value menggunakan metode BTCS
MatrixIterWait{tr,3}(i,j)=MatrixIterF{tr,3}(i,j)-(maxwa(i))'; %menghitung Waiting Value menggunakan metode C-N
end
end
if tr<2
%=============================|
%Penyimpanan Nama metode ke dalam array
methodnames=[cellstr(' FTCS');cellstr(' BTCS');cellstr(' Crank-Nicolson')];
%=============================|
%pilihan penamipilan plot atau tidak
disp('Show plot?');
disp('0 -> NO.');
disp('1 -> YES.');
varplot=2;
while varplot<0 || varplot>1
varplot=input('[0-1] = ');
if varplot<0 || varplot>1
disp('INPUT THE NUMBER CORRECTLY !');
end
end
end
%=============================|
%pendefinisian color yang akan digunakan
colors=['c';'m';'k';'y';'b';'g';'r'];
%=============================|
switch varplot
case 1
disp('show all?');
disp('0 -> NO, hanya beberapa.');
disp('1 -> YES.');
varplot1=2;
while varplot1<0 || varplot1>1
varplot1=input('[0-1] = ');
if varplot1<0 || varplot1>1
disp('pls Input correctly !');
end
fprintf('==================================\n')
end
%=============================|
switch varplot1
case 1
trpl=trial;
trppl(1:trial)=1:trial;
otherwise
fprintf('how many that will be plotted = ');
trplot=0;
while trplot<1
trplot=input('');
if trplot<1
disp('pls input corrctly!');
end
fprintf('================================\n')
end
%=============================|
%pemilihan uji ke- yang di plotkan
for trp=1:trplot
trpp(trp)=0;
while trpp(trp)<1
fprintf('trial no-%d that will be plotted = ',trp);
trpp(trp)=input('');
if trpp(trp)<1
disp('input correctly!');
end
end
fprintf('===========================\n')
end
trpl=trplot;
trppl=trpp;
end
%=============================|
%=============================|
% PLOTTING
% WAITING VALUE
%=============================|
%penentuan jumlah yang akan di plotkan
for tr=1:trpl
if tr<2
fprintf('====================================================\n')
trialwv=0;
while trialwv<1
trialwv=input('number of price of \nWaiting Value that will be plotted = ');
if trialwv<1
disp('too small, \nrepeat!');
end
end
%=============================|
%pada harga berapa yang akan di plotkan (akan disesuaikan dari partisi ke-)
for wv=1:trialwv
inputwv(wv)=Vmin-1;
while inputwv(wv)<Vmin || inputwv(wv)>PMax
fprintf('price number-%d will be plotted [USD%0.2f - USD%0.2f] = ',wv,Vmin,PMax);
inputwv(wv)=input('');
end
nilaiwv(wv)=cellstr(sprintf('Harga Opsi pada harga USD%d',inputwv(wv)));
end
fprintf('====================================================\n')
end
%=============================|
%mulai plot figure undeveloped Value
for j=1:3
figure('Name',sprintf('Figure %d Trial %d',j,trppl(tr)),'NumberTitle','off')
set(gcf,'renderer','zbuffer');
[X Y]=meshgrid(VV,0:w:T);
Z=MatrixIterF{trppl(tr),j};
surf(X,Y,Z);
switch j
case 1
colormap(hot)
case 2
colormap(summer)
case 3
colormap(winter)
end
colorbar
title(strcat('Plot Undeveloped Value Project menggunakan metode ',methodnames(j),sprintf(' uji ke-%d.',trppl(tr))))
xlabel('Harga Minyak Mentah di Pasar (VV)')
ylabel('t=0..T')
zlabel('Hasil Undeveloped Value Proyek (F)')
grid on
end
%=============================|
%Mulai plot figure Waiting value
for j=4:6
figure('Name',sprintf('Figure %d Trial %d',j,trppl(tr)),'NumberTitle','off')
set(gcf,'renderer','zbuffer');
title(strcat('Plot harga opsi menggunakan metode ',methodnames(j-3),sprintf(' uji ke-%d.',trppl(tr))))
xlabel('t=0..T')
ylabel('Harga Opsi (Waiting Value) Project')
hold on
for wv=1:trialwv
if (wv>length(colors))
if (mod(wv,length(colors))==1)
x=1;
else
x=x+1;
end
else
x=wv;
end
wvi=(round(((inputwv(wv))-Vmin)/p))+1;
plot(0:w:T,MatrixIterWait{trppl(tr),j-3}(wvi,:),colors(x));
end
legend(nilaiwv,'Location','NorthWest');
hold off
grid on
end
%=============================|
% PLOTTING t TERTENTU
% Nilai F(V,t) grafiks Tahunan
%=============================|
% Untuk membuat bagian dari legend
for j=1:(T+1)
i=(j-1);
nilait(j)=cellstr(sprintf('Nilai di t=%d',i));
end
%=============================|
% Memulai iterasi plot t tertentu
for y=7:9
figure('Name',sprintf('Figure %d Trial %d',y,trppl(tr)),'NumberTitle','off')
set(gcf,'renderer','zbuffer');
title(strcat('Plot di t tertentu menggunakan metode ',methodnames(y-6),sprintf(' uji ke-%d.',trppl(tr))))
xlabel('Harga Minyak Mentah di Pasar (VV)')
ylabel('Nilai Undeveloped Proyek (F)')
hold on
for j=1:(T+1)
if (j>length(colors))
if (mod(j,length(colors))==1)
x=1;
else
x=x+1;
end
else
x=j;
end
tj(j)=round((((T+1)-j)-tmin)/w);
plot(VV,MatrixIterF{trppl(tr),y-6}(:,(tj(j)+1)),colors(x));
end
legend(nilait,'Location','NorthWest');
hold off
end
end
%=============================|
%=============================|
% PEMBAGIAN UNTUK BARIS DAN KOLOM
% HARGA DAN WAKTU
%=============================|
otherwise
for j=1:(T+1)
tj(j)=round((((T+1)-j)-tmin)/w);
end
end
%=============================|
%pembagian posisi partisi harga
fprintf('\n');
disp('Harga Baris');
for ss=1:length(VV)
varv(ss,1)=VV(ss);
varv(ss,2)=(round(((VV(ss))-Vmin)/p))+1;
if (varv(ss,1)<100)
fprintf('%0.2f %0.2f\n',varv(ss,1),varv(ss,2));
else
fprintf('%0.2f %0.2f\n',varv(ss,1),varv(ss,2));
end
end
%=============================|
%pembagian posisi partisi waktu
fprintf('\n');
disp('Tahun Kolom');
for ss=1:(T+1)
vart(ss,1)=ss-1;
vart(ss,2)=tj(ss)+1;
fprintf('%0.2f %0.2f\n',vart(ss,1),vart(ss,2));
end
%=============================|
% PLOTTING SENSITIVITAS
% Nilai F(V,t) Terhadap parameter yang berubah-ubah
%=============================|
fprintf('====================================================\n')
trialsv=0;
while trialsv<1
trialsv=input('number of sensitivity that will be plotted = ');
if trialsv<1
disp('too small, repeat again!');
end
end
%=============================|
%input harga
for sv=1:trialsv
fprintf('==========================\n')
inputv(sv)=Vmin-1;
while inputv(sv)<Vmin || inputv(sv)>PMax
fprintf('price of trial-%d that will be plotted [USD%0.2f - USD%0.2f] = ',sv,Vmin,PMax);
inputv(sv)=input('');
end
%=============================|
%input tahun
% fprintf('====================================================\n')
inputt(sv)=tmin-1;
while inputt(sv)<tmin || inputt(sv)>T
fprintf('year of trial-%d will be plotted [%d-%d] = ',sv,tmin,T);
inputt(sv)=input('');
end
%=============================|
%pengubahan dari inputan ke penentuan partisi
ti(sv)=tj(inputt(sv)+1)+1;
vi(sv)=(round(((inputv(sv))-Vmin)/p))+1;
end
%=============================|
%daftar simbol per-metode
syms=['s';'+';'o'];
%=============================|
%mulai plot sensitivitas
%clf
for sv=1:trialsv
figure('Name',sprintf('Figure Sensitivitas ke-%d',sv),'NumberTitle','off')
set(gcf,'renderer','zbuffer');
title(strcat('Plot sensitivitas terhadap ',scetype(scenario),sprintf(' di posisi F(%d,%d)',inputv(sv),inputt(sv))))
xlabel(xlabels)
ylabel('Nilai Undeveloped Proyek')
hold on
for js=1:3
fprintf('==================================\n')
fprintf('\nSensitivitas dengan metode %s di posisi F(%d,%d)\n',methodnames{js},inputv(sv),inputt(sv))
for tr=1:trial
methods{tr}=sprintf('Nilai uji ke-%d = %f\n',tr,MatrixIterF{tr,js}(vi(sv),ti(sv)));
fprintf(methods{tr});
plMatrixIterF(tr,js)=MatrixIterF{tr,js}(vi(sv),ti(sv));
end
plot(sce(1:trial,scenario),plMatrixIterF(1:trial,js), strcat(colors(length(colors)-js+1),syms(js)));
hold all
end
grid on
legend(methodnames,'Location','NorthEast');
hold off
end
%=============================|
%pertanyaan pengulangan proses running
fprintf('\n');
fprintf('=============================\n')
disp('re-run?');
disp('0 -> No.');
disp('1 -> Yes.');
repeat=2;
while repeat<0 || repeat>1
repeat=input('[0-1] = ');
if repeat<0 || repeat>1
disp('Mohon masukkan pilihan dengan benar!');
end
fprintf('=================SELESAI======================\n')
end
%=%=============================|
end
%=======
Data : https://app.box.com/s/07gf6mzkhh9g93zd0rts
range : b2:b2082
I have a new problem here beside the first question,
I have to change the range form imax+1 to imax-1, before that
I have a matrix size imax+1 (x axis) and jmax+1 (y axis), the first row of x axis will be assign to this max(Vmin-(D(tr)*exp((-r)*tau)),0);
and the (imax+1) will be this max(PMax-(D(tr)*exp(-r*tau)),0);
and the jmax+1 axis will be filled with maxwa (on code)
and i only need to process the interior
what should i change then?? alway stuck on dimension miss match
sorry for asking too much :( #urgent #desperate
thank for helping :))
> "Steven Lord" <Steven_Lord@mathworks.com> wrote in message <lmkm7h$7jl$1@newscl01ah.mathworks.com>...
> > You've posted a LOT of code (though not all of it, I suspect) but we can't
> > run it because 1) it depends on what you type at various INPUT statements
> > and 2) it depends on the contents of variables you haven't showed us.
> >
> > Simplify this down to a SMALL section of code and instructions that people
> > can execute and with which you can reproduce the behavior. Post that code
> > and instructions to the group (please do NOT send them to me directly.) Then
> > readers of the group can try it out and see if they can reproduce the
> > behavior you're describing.
> >
> > As for the performance, I've got two ideas.
> >
> > 1) You're displaying a LOT of text to the Command Window with FPRINTF. Try
> > commenting those out or guarding them by IF statements controlled by a
> > variable you define at the top of your code, like:
> >
> > debugging = false;
> > if debugging
> > fprintf(...
> > end
> >
> > That way the text only displays when you turn debugging on.
> >
> > 2) You have a LOT of calls to HOLD throughout your code. My guess is that
> > you keep on adding line after line after line in the same axes, which will
> > cause rendering to slow down as the renderer has to figure out what to
> > display where and what's concealed "underneath" other graphics objects.
> >
> > *snip*
> >
> > --
> > Steve Lord
> > slord@mathworks.com
> > To contact Technical Support use the Contact Us link on
> > http://www.mathworks.com
>
Here are my entire code
repeat=1;
while repeat==1
close all
clc;
clear;
warning off all
format longG
%===================
while length(filename)<2
disp('Input Project file price');
start=input('[Press ENTER to continou]');
filename=uigetfile('.xlsx');
if length(filename)<2
disp('No file loaded. try to load it please.');
disp('--------------------------')
else
filepath=strcat(pwd,'/',filename);
disp('File loaded!');
fprintf(strcat('[',pwd,'/',filename,']\n'));
end
end
%=============================|
%input range mulai data
inputcelltext='input cell range';
cellrange1text=' (first cell) =';
fprintf(strcat(inputcelltext,cellrange1text));
cellrange1='';
while length(cellrange1)<2
cellrange1=input(' ','s');
if (length(cellrange1)<2)
fprintf('\b\b');
end
cellrange1split=strsplit(cellrange1,':');
if length(cellrange1split)>1
fprintf('\b\b');
for bscr=1:length(cellrange1) %backspacecellrange
fprintf('\b');
end
cellrange1='';
end
end
for bsic=1:(length(cellrange1text)+length(cellrange1)+1) %backspaceinputcell
fprintf('\b');
end
%=============================|
%input range akhir data
cellrange2text='(second cell) = ';
fprintf(cellrange2text);
fprintf(strcat(cellrange1,':'));
cellrange2='';
while length(cellrange2)<2
cellrange2=input('','s');
if (length(cellrange2)<2)
fprintf('\b');
end
end
%=============================|
%read date of data
cellrange=strcat(cellrange1,':',cellrange2);
V=xlsread(filepath,1,cellrange);
dtrange1=strsplit(cellrange1,cellrange1(1));
dtrange2=strsplit(cellrange2,cellrange2(1));
dt=xlsread(filepath,1,strcat('A',dtrange1{2},':A',dtrange2{2}));
clc;
disp('Crude oil prices (USD)')
fprintf(strcat(' periode [',datestr((dt((str2num(dtrange2{2})-1),1)+datenum('30-Dec-1899')),'dd/mm/yyyy'),'-',datestr((dt((str2num(dtrange1{2})-1),1)+datenum('30-Dec-1899')),'dd/mm/yyyy'),'] \n'))
disp('---------------------------------------------')
disp(V)
count=length(V);
%=============================|
%Year
t0=input('Publish Year = '); %Tahun awal diterbitkan
fprintf('=======================\n')
vart0=0;
while vart0==0
Te=input('Excecution Year = '); %Tahun Proyek dieksekusi
fprintf('======================\n')
if Te<(t0+1)
disp('Please input bigger year than Publish Year!');
else
vart0=1;
end
end
T=Te-t0;
tmin=0;
%=============================|
disp('Which Scenario?');
disp('1. Varying Standar Deviation (sigma).');
disp('2. Varying Expected Return (miu).');
disp('3. Varying Strike Price (D).');
disp('');
%=============================|
scenario=0;
while scenario<1 || scenario>3
scenario = input('[1-3] = ');
fprintf('========================\n')
if scenario<1 || scenario>3
disp('Input a scenario number!');
end
end
trial=0;
while trial<1
trial=input('How many number of trial ? = ');
if trial<1
disp('too small, \nrepeat again!');
end
end
%===============|
%Pencarian Return Data V
for i=1:count-1
returnV(i,1)=(V(i+1)-V((i)))/(V(i)); %Estimasi RETURN data V
end
%==============|
switch scenario
case 1
D(1:trial)=85;
miu(1:trial)=mean(returnV);
for tr=1:trial
fprintf('Input Sigma trial-%d = ',tr);
sig(tr)=input('');
sig2(tr)=sig(tr)^2;
sce(tr,scenario)=sig(tr);
end
fprintf('=============\n')
xlabels='Standar Deviasi (sigma)';
scetype(scenario)=cellstr(' Standar Deviasi');
case 2
D(1:trial)=85;
for tr=1:trial
fprintf('Input miu trial-%d = ',tr);
miu(tr)=input('');
sce(tr,scenario)=miu(tr);
end
fprintf('=====================\n')
sig2(1:trial)=var(returnV);
sig(1:trial)=sqrt(sig2(1));
xlabels='Expected Return (miu)';
scetype(scenario)=cellstr(' Expected Return');
case 3
for tr=1:trial
fprintf('Input strike price trial-%d = ',tr);
D(tr)=input('');
sce(tr,scenario)=D(tr);
end
fprintf('======================\n')
miu(1:trial)=mean(returnV);
sig2(1:trial)=var(returnV);
sig(1:trial)=sqrt(sig2(1));
xlabels='Strike Price (D)';
scetype(scenario)=cellstr('Strike Price');
end
for tr=1:trial
%=============================|
imax=T*1000; %jumlah subselang untuk V %DeltaV
jmax=T*1000; %jumlah subselang untuk (T)dibuatnya selama harian %DeltaT
%=============================|
r=miu(tr);
d=0; %Besar nilai dividen
%=============================|
%Pendefinisian nilai maksimum dan minimum dari rentang harga
Vmaks=max(V); %nilai maskimum dari data V
Vmin=min(V); %nilai minimum untuk data V
PMax=2*(Vmaks); %nilai prediksi maksimum dari data harga
%=============================|
%Persiapan kalkulasi menggunkan Metode Numerik Finite Different
p=(PMax-Vmin)/(imax); %panjang selang posisi untuk V
w=(T-tmin)/(jmax); %panjang selang posisi untuk tau
VV=Vmin:p:PMax; %vektor untuk data V interior
maxwa=max(VV-D(tr),0);
F{tr}=maxwa(1:size(maxwa,2))'; %syarat awal, nilai saat maturity
F2{tr}=F{tr};
F3{tr}=F{tr};
%=============================|
%pendefinisian t dan tau
for i=1:jmax+1
t(i)=(i-1)*w;
tau(i)=T-t(i);
end
%=============================|
D1=diag(1:1:(imax-1));
D2=D1.^2;
T1=diag(ones(imax-2,1),1)-diag(ones(imax-2,1),-1);
T2=-2*eye(imax-1,imax-1)+diag(ones(imax-2,1),1)+diag(ones(imax-2,1),-1);
%=============================|
% PENDEFINISIAN MATRIK DALAM METODE
% FTCS_BTCS_CRANK_NICOLSON
%=============================|
rd=r-d;
A{tr}=((1-(r*w))*eye(imax-1))+(0.5*w*sig2(tr)*D2*T2)+(0.5*rd*w*D1*T1); %Matriks untuk FTCS
g{tr}=[0.5*w*(sig2(tr)-rd)*(max(Vmin-(D(tr)*exp(-r*tau)),0)) zeros(1,(imax-3)) 0.5*w*(imax-1)*(sig2(tr)*(imax-1)+rd)*max(PMax-(D(tr)*exp(-r*tau)),0)]'; %Matriks untuk menyesuaikan dengan Matriks FTCS %zeros imax-3 disesuaikan dengan F dan A
B{tr}=((1+(r*w))*eye(imax-1))+(0.5*w*sig2(tr)*D2*T2)+(0.5*rd*w*D1*T1); %Matriks untuk BTCS
u{tr}=[0.5*w*(sig2(tr)-rd)*(max(Vmin-(D(tr)*exp(-r*tau)),0)) zeros(1,(imax-3)) 0.5*w*(imax-1)*(sig2(tr)*(imax-1)+rd)*max(PMax-(D(tr)*exp(-r*tau)),0)]'; %Matriks untuk menyesuaikan dengan Matriks BTCS %zeros imax-3 disesuaikan dengan F dan A
invB{tr}=inv(B{tr});
invIB{tr}=inv(eye(imax-1)+B{tr});
%=============================|
% PERHITUNGAN ITERASI MENGGUNAKAN METODE
% FTCS_BTCS_CRANK NICOLSON
% MENERAPKAN BOUNDARY AMERICAN OPTION
%=============================|
%definisi Awal batas awal dan batas akhir MatrixIterF
MatrixIterF{tr,1}=NaN(imax+1,jmax+1);
MatrixIterF{tr,1}(1,:)=max(Vmin-(D(tr)*exp((-r)*tau)),0); %syarat batas bawah
MatrixIterF{tr,1}(imax+1,:)=max(PMax-(D(tr)*exp(-r*tau)),0); %syarat batas atas
MatrixIterF{tr,1}(:,1)=F{tr}; %syarat awal
%definisi Awal batas awal dan batas akhir MatrixIterF
MatrixIterF{tr,2}=NaN(imax-1,jmax-1);
MatrixIterF{tr,2}(1,:)=max(Vmin-(D(tr)*exp((-r)*tau)),0); %syarat batas bawah
MatrixIterF{tr,2}(imax+1,:)=max(PMax-(D(tr)*exp(-r*tau)),0); %syarat batas atas
MatrixIterF{tr,2}(:,1)=F{tr}; %syarat awal
%definisi Awal batas awal dan batas akhir MatrixIterF
MatrixIterF{tr,3}=NaN(imax-1,jmax-1);
MatrixIterF{tr,3}(1,:)=max(Vmin-(D(tr)*exp((-r)*tau)),0); %syarat batas bawah
MatrixIterF{tr,3}(imax+1,:)=max(PMax-(D(tr)*exp(-r*tau)),0); %syarat batas atas
MatrixIterF{tr,3}(:,1)=F{tr}; %syarat awal
for j=2:jmax+1
F{tr}=A{tr}*F{tr}+g{tr}; %menghitung F menggunakan metode FTCS
F2{tr}=invB{tr}*(F2{tr}+u{tr}); %menghitung F menggunakan metode BTCS
F3{tr}=invIB{tr}*((A{tr}+eye(imax-1))*F3{tr}+g{tr}+u{tr}); %menghitung F menggunakan metode Crank-Nicolson
or i=1:imax
if F{tr}(i)>=(maxwa(i))'
MatrixIterF{tr,1}(i,j)=F{tr}(i);
else
MatrixIterF{tr,1}(i,j)=(maxwa(i))';
end
if F2{tr}(i)>=(maxwa(i))'
MatrixIterF{tr,2}(i,j)=F2{tr}(i);
else
MatrixIterF{tr,2}(i,j)=(maxwa(i))';
end
if F3{tr}(i)>=(maxwa(i))'
MatrixIterF{tr,3}(i,j)=F3{tr}(i);
else
MatrixIterF{tr,3}(i,j)=(maxwa(i))';
end
end
F{tr}=MatrixIterF{tr,1}(1:imax+1,j);
F2{tr}=MatrixIterF{tr,2}(1:imax+1,j);
F3{tr}=MatrixIterF{tr,3}(1:imax+1,j);
end
%=============================|
% PERHITUNGAN WAITING VALUE
% SEBAGAI HARGA OPSI
%=============================|
%Rumus = F-(max(V-D),0)
MatrixIterWait{tr,1}=NaN(imax+1,jmax+1);
MatrixIterWait{tr,2}=NaN(imax+1,jmax+1);
MatrixIterWait{tr,3}=NaN(imax+1,jmax+1);
for j=1:jmax+1
for i=1:imax+1
MatrixIterWait{tr,1}(i,j)=MatrixIterF{tr,1}(i,j)-(maxwa(i))'; %menghitung Waiting Value menggunakan metode FTCS
MatrixIterWait{tr,2}(i,j)=MatrixIterF{tr,2}(i,j)-(maxwa(i))'; %menghitung Waiting Value menggunakan metode BTCS
MatrixIterWait{tr,3}(i,j)=MatrixIterF{tr,3}(i,j)-(maxwa(i))'; %menghitung Waiting Value menggunakan metode C-N
end
end
if tr<2
%=============================|
%Penyimpanan Nama metode ke dalam array
methodnames=[cellstr(' FTCS');cellstr(' BTCS');cellstr(' Crank-Nicolson')];
%=============================|
%pilihan penamipilan plot atau tidak
disp('Show plot?');
disp('0 -> NO.');
disp('1 -> YES.');
varplot=2;
while varplot<0 || varplot>1
varplot=input('[0-1] = ');
if varplot<0 || varplot>1
disp('INPUT THE NUMBER CORRECTLY !');
end
end
end
%=============================|
%pendefinisian color yang akan digunakan
colors=['c';'m';'k';'y';'b';'g';'r'];
%=============================|
switch varplot
case 1
disp('show all?');
disp('0 -> NO, hanya beberapa.');
disp('1 -> YES.');
varplot1=2;
while varplot1<0 || varplot1>1
varplot1=input('[0-1] = ');
if varplot1<0 || varplot1>1
disp('pls Input correctly !');
end
fprintf('==================================\n')
end
%=============================|
switch varplot1
case 1
trpl=trial;
trppl(1:trial)=1:trial;
otherwise
fprintf('how many that will be plotted = ');
trplot=0;
while trplot<1
trplot=input('');
if trplot<1
disp('pls input corrctly!');
end
fprintf('================================\n')
end
%=============================|
%pemilihan uji ke- yang di plotkan
for trp=1:trplot
trpp(trp)=0;
while trpp(trp)<1
fprintf('trial no-%d that will be plotted = ',trp);
trpp(trp)=input('');
if trpp(trp)<1
disp('input correctly!');
end
end
fprintf('===========================\n')
end
trpl=trplot;
trppl=trpp;
end
%=============================|
%=============================|
% PLOTTING
% WAITING VALUE
%=============================|
%penentuan jumlah yang akan di plotkan
for tr=1:trpl
if tr<2
fprintf('====================================================\n')
trialwv=0;
while trialwv<1
trialwv=input('number of price of \nWaiting Value that will be plotted = ');
if trialwv<1
disp('too small, \nrepeat!');
end
end
%=============================|
%pada harga berapa yang akan di plotkan (akan disesuaikan dari partisi ke-)
for wv=1:trialwv
inputwv(wv)=Vmin-1;
while inputwv(wv)<Vmin || inputwv(wv)>PMax
fprintf('price number-%d will be plotted [USD%0.2f - USD%0.2f] = ',wv,Vmin,PMax);
inputwv(wv)=input('');
end
nilaiwv(wv)=cellstr(sprintf('Harga Opsi pada harga USD%d',inputwv(wv)));
end
fprintf('====================================================\n')
end
%=============================|
%mulai plot figure undeveloped Value
for j=1:3
figure('Name',sprintf('Figure %d Trial %d',j,trppl(tr)),'NumberTitle','off')
set(gcf,'renderer','zbuffer');
[X Y]=meshgrid(VV,0:w:T);
Z=MatrixIterF{trppl(tr),j};
surf(X,Y,Z);
switch j
case 1
colormap(hot)
case 2
colormap(summer)
case 3
colormap(winter)
end
colorbar
title(strcat('Plot Undeveloped Value Project menggunakan metode ',methodnames(j),sprintf(' uji ke-%d.',trppl(tr))))
xlabel('Harga Minyak Mentah di Pasar (VV)')
ylabel('t=0..T')
zlabel('Hasil Undeveloped Value Proyek (F)')
grid on
end
%=============================|
%Mulai plot figure Waiting value
for j=4:6
figure('Name',sprintf('Figure %d Trial %d',j,trppl(tr)),'NumberTitle','off')
set(gcf,'renderer','zbuffer');
title(strcat('Plot harga opsi menggunakan metode ',methodnames(j-3),sprintf(' uji ke-%d.',trppl(tr))))
xlabel('t=0..T')
ylabel('Harga Opsi (Waiting Value) Project')
hold on
for wv=1:trialwv
if (wv>length(colors))
if (mod(wv,length(colors))==1)
x=1;
else
x=x+1;
end
else
x=wv;
end
wvi=(round(((inputwv(wv))-Vmin)/p))+1;
plot(0:w:T,MatrixIterWait{trppl(tr),j-3}(wvi,:),colors(x));
end
legend(nilaiwv,'Location','NorthWest');
hold off
grid on
end
%=============================|
% PLOTTING t TERTENTU
% Nilai F(V,t) grafiks Tahunan
%=============================|
% Untuk membuat bagian dari legend
for j=1:(T+1)
i=(j-1);
nilait(j)=cellstr(sprintf('Nilai di t=%d',i));
end
%=============================|
% Memulai iterasi plot t tertentu
for y=7:9
figure('Name',sprintf('Figure %d Trial %d',y,trppl(tr)),'NumberTitle','off')
set(gcf,'renderer','zbuffer');
title(strcat('Plot di t tertentu menggunakan metode ',methodnames(y-6),sprintf(' uji ke-%d.',trppl(tr))))
xlabel('Harga Minyak Mentah di Pasar (VV)')
ylabel('Nilai Undeveloped Proyek (F)')
hold on
for j=1:(T+1)
if (j>length(colors))
if (mod(j,length(colors))==1)
x=1;
else
x=x+1;
end
else
x=j;
end
tj(j)=round((((T+1)-j)-tmin)/w);
plot(VV,MatrixIterF{trppl(tr),y-6}(:,(tj(j)+1)),colors(x));
end
legend(nilait,'Location','NorthWest');
hold off
end
end
%=============================|
%=============================|
% PEMBAGIAN UNTUK BARIS DAN KOLOM
% HARGA DAN WAKTU
%=============================|
otherwise
for j=1:(T+1)
tj(j)=round((((T+1)-j)-tmin)/w);
end
end
%=============================|
%pembagian posisi partisi harga
fprintf('\n');
disp('Harga Baris');
for ss=1:length(VV)
varv(ss,1)=VV(ss);
varv(ss,2)=(round(((VV(ss))-Vmin)/p))+1;
if (varv(ss,1)<100)
fprintf('%0.2f %0.2f\n',varv(ss,1),varv(ss,2));
else
fprintf('%0.2f %0.2f\n',varv(ss,1),varv(ss,2));
end
end
%=============================|
%pembagian posisi partisi waktu
fprintf('\n');
disp('Tahun Kolom');
for ss=1:(T+1)
vart(ss,1)=ss-1;
vart(ss,2)=tj(ss)+1;
fprintf('%0.2f %0.2f\n',vart(ss,1),vart(ss,2));
end
%=============================|
% PLOTTING SENSITIVITAS
% Nilai F(V,t) Terhadap parameter yang berubah-ubah
%=============================|
fprintf('====================================================\n')
trialsv=0;
while trialsv<1
trialsv=input('number of sensitivity that will be plotted = ');
if trialsv<1
disp('too small, repeat again!');
end
end
%=============================|
%input harga
for sv=1:trialsv
fprintf('==========================\n')
inputv(sv)=Vmin-1;
while inputv(sv)<Vmin || inputv(sv)>PMax
fprintf('price of trial-%d that will be plotted [USD%0.2f - USD%0.2f] = ',sv,Vmin,PMax);
inputv(sv)=input('');
end
%=============================|
%input tahun
% fprintf('====================================================\n')
inputt(sv)=tmin-1;
while inputt(sv)<tmin || inputt(sv)>T
fprintf('year of trial-%d will be plotted [%d-%d] = ',sv,tmin,T);
inputt(sv)=input('');
end
%=============================|
%pengubahan dari inputan ke penentuan partisi
ti(sv)=tj(inputt(sv)+1)+1;
vi(sv)=(round(((inputv(sv))-Vmin)/p))+1;
end
%=============================|
%daftar simbol per-metode
syms=['s';'+';'o'];
%=============================|
%mulai plot sensitivitas
%clf
for sv=1:trialsv
figure('Name',sprintf('Figure Sensitivitas ke-%d',sv),'NumberTitle','off')
set(gcf,'renderer','zbuffer');
title(strcat('Plot sensitivitas terhadap ',scetype(scenario),sprintf(' di posisi F(%d,%d)',inputv(sv),inputt(sv))))
xlabel(xlabels)
ylabel('Nilai Undeveloped Proyek')
hold on
for js=1:3
fprintf('==================================\n')
fprintf('\nSensitivitas dengan metode %s di posisi F(%d,%d)\n',methodnames{js},inputv(sv),inputt(sv))
for tr=1:trial
methods{tr}=sprintf('Nilai uji ke-%d = %f\n',tr,MatrixIterF{tr,js}(vi(sv),ti(sv)));
fprintf(methods{tr});
plMatrixIterF(tr,js)=MatrixIterF{tr,js}(vi(sv),ti(sv));
end
plot(sce(1:trial,scenario),plMatrixIterF(1:trial,js), strcat(colors(length(colors)-js+1),syms(js)));
hold all
end
grid on
legend(methodnames,'Location','NorthEast');
hold off
end
%=============================|
%pertanyaan pengulangan proses running
fprintf('\n');
fprintf('=============================\n')
disp('re-run?');
disp('0 -> No.');
disp('1 -> Yes.');
repeat=2;
while repeat<0 || repeat>1
repeat=input('[0-1] = ');
if repeat<0 || repeat>1
disp('Mohon masukkan pilihan dengan benar!');
end
fprintf('=================SELESAI======================\n')
end
%=%=============================|
end
%=======
Data : https://app.box.com/s/07gf6mzkhh9g93zd0rts
range : b2:b2082
I have a new problem here beside the first question,
I have to change the range form imax+1 to imax-1, before that
I have a matrix size imax+1 (x axis) and jmax+1 (y axis), the first row of x axis will be assign to this max(Vmin-(D(tr)*exp((-r)*tau)),0);
and the (imax+1) will be this max(PMax-(D(tr)*exp(-r*tau)),0);
and the jmax+1 axis will be filled with maxwa (on code)
and i only need to process the interior
what should i change then?? alway stuck on dimension miss match
sorry for asking too much :( #urgent #desperate
thank for helping :))