WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

komplizierteres Intergral über zwei Variablen

 

Anfänger00
Forum-Anfänger

Forum-Anfänger


Beiträge: 12
Anmeldedatum: 06.10.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 31.10.2011, 12:32     Titel: komplizierteres Intergral über zwei Variablen
  Antworten mit Zitat      
Hallo zusammen, wie man gleich unschwer erkennen wird, bin ich Anfängerin, daher bitte ich um Rücksicht, falls ich "doofe" Fragen stellen. Ich versuche zur Zeit verschiedene Intergrale (Finanzmathe) aus einem Paper in Matlab nachzubilden und habe leider große Problem damit.
Wenn S eine geometrisch brownsche bewegung mit mu (0,05) und sigma (0,2) ist, erhalte ich in matlab die Dichte ja über lognpdf(S,mu*T,sigma^2*T) (?). Mein erstes Intergral ist nun über diese Dichte multipliziert mit einem Wert, der sich aus der Black Scholes Formel ergibt, zu bilden.

Ich versuche es nun folgendermaßen:
____________________
Meine Inputparameter:
muBS1=0.05;
sigmaBS1=0.2;
T=0.5;
N=round(T*365*24)
g_xt=0.8; %g muss kleiner gleich 1 sein
K=10;
S2=55;
______________________________

X=((1-g_xt)*S1+K)/g_xt
a=log(S1/X)
b=(a+(muBS1+0.5*sigmaBS1^2)*N)
d1= b./(sigmaBS1*sqrt(N));
d2= d1-sigmaBS1*sqrt(N);
n1=normcdf(d1);
n2=normcdf(d2);
fun=@(S1) lognpdf((S1),muBS1*N,(sigmaBS1^2)*N)*S1*n1-(exp(-muBS1*N)*n2*X)
integral=quad(fun,0,inf)


aber leider stimmt hier was nicht, ich gebe in matlab statt inf eine sehr große zahl ein. Aber das Intergral steigt mit der Grenze. Wenn ich jedoch die Dichtefunktion (lognormal) zugrunde lege, müsste das Integral doch begrenzt sein oder?

Wenn ich das geschafft habe muss ich später eine komplizierteres Integral berechnen. Ohne angegebene Grenzen im R². Wie ich das integral zu verstehen habe, weiß ich leider nicht. Ich denke, ich muss in Matlab über zwei Variablen integrieren. Geht dies auch mit Quad? (siehe angehängte Bilder).

Ich sitze nun schon sehr lange daran, aber auch eine Auffrischung der Stochastik-Grundlagen hilft mir hier leider nicht weiter. Deshalb wäre ich euch sehr dankbar, wenn jemand mir helfen kann.

Vielen Dank und Gruß
Anfängerin

integral 1.png
 Beschreibung:

Download
 Dateiname:  integral 1.png
 Dateigröße:  13.51 KB
 Heruntergeladen:  590 mal
integral 2.png
 Beschreibung:

Download
 Dateiname:  integral 2.png
 Dateigröße:  5.9 KB
 Heruntergeladen:  609 mal
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


Beiträge: 24.502
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 01.11.2011, 17:10     Titel:
  Antworten mit Zitat      
Hallo,

dein Code läuft so nicht.
Die Frage ist für mich: ist S1 eine Konstante (und wenn ja: welche; wird in a, b etc. verwendet) oder die Integrationsvariable? Oder verwendest du S1 in zwei verschiedenen Zusammenhängen?

Für Integrale mit unendlichen Grenzen kann man übrigens QUADGK verwenden.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Anfänger00
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 12
Anmeldedatum: 06.10.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 01.11.2011, 19:23     Titel:
  Antworten mit Zitat      
Hallo Harald,

danke für deine Antwort!
Ich habe jetzt einiges korrigiert, aber trotzdem noch ein Problem.
Ich habe folgende Funktionen geschrieben:

Das ist meine Hauptfunktion, die je nach Integral sich die anderen (unteren) Funktionen aufruft:

function Endwert=Preis(T,K,sigma1,sigma2, r, Y1_0,Y2_0)
Fun_bis_inf=@(c,z) normpdf(z,EW_C1_D,Sigma_C1_D).*normpdf(c,EW_C2,sqrt(Var_C2)).*phi1(r,T,Y1_0,K,sigma1,g(c+z));
Fun_bis_0=@(c,z) normpdf(z,EW_C1_D,Sigma_C1_D).*normpdf(c,EW_C2,sqrt(Var_C2)).*phi2(r,T,Y1_0,Y2_0,sigma1,sigma2,K,g(c+z));
integral1=dblquad(Fun_bis_inf,-100,100,0,100)
integral2=dblquad(Fun_bis_0,-100,100,-100,0)
Endwert= integral1 + integral2

Hier habe ich als nun eine zweidimensionales Integral in zwei geteilt, einmal für den Bereich von -100 bis 0 (z-Variable) und einmal von 0 bis 100.
Das merkwürdige ist, dass es eigentlich gut durchläuft und phi 1 keine Probleme hat. Auch bei phi2 funktioniert es für den Fall, dass g>1 ist, aber für den Fall "else" (g<=1) kriege ich eine Fehlermeldung.
Ich kann meinen Fehler hier einfach nicht finden. Liegt es daran, dass in dem Doppeltintegral an sich noch weitere Integrale berechnet werden? Ich kann keine Probleme in den Grenzen feststellen. Wenn ich jede Komponente einzeln aufrufe läuft es immer, aber sobald ich alles gleichzeitig aufrufe, bekomme ich eine ganze Pallette von Fehlermeldungen:
_____________________________
??? Error using ==> times
Matrix dimensions must agree.

Error in ==>
phi2>@(y)lognpdf(y,log(Y1_0)+(r-sigma1.^2/2).*T,sqrt(T).*sigma1).*BLS(Y2_0,(K+(1-g).*y)./g,T,r,sigma2)
at 9
fun2=@(y)lognpdf(y,log(Y1_0)+(r-sigma1.^2/2).*T,sqrt(T).*sigma1).*BLS(Y2_0,(K+(1-g).*y)./g,T,r,sigma2);

Error in ==> phi2 at 11
if max(fun2(i))>1.5*fun2(i(end)) && fun2(i(end))<.000001

Error in ==>
Optionspreis>@(c,z)normpdf(z,EW_C1_D,Sigma_C1_D).*normpdf(c,EW_C2,sqrt(Var_C2)).*phi2(r,T,Y1_0,Y2_0,sigma1,sigma2,K,g(c+z))
at 39
Fun_bis_0=@(c,z)
normpdf(z,EW_C1_D,Sigma_C1_D).*normpdf(c,EW_C2,sqrt(Var_C2)).*phi2(r,T,Y1_0,Y2_0,sigma1,sigma2,K,g(c+z));

Error in ==> quad>quadstep at 125
y = f(x, varargin{:});

Error in ==> quad at 98
[Q(3),fcnt,warn(3)] = ...

Error in ==> dblquad>innerintegral at 77
Q(i) = quadf(intfcn, xmin, xmax, tol, trace, y(i), varargin{:});

Error in ==> quad at 76
y = f(x, varargin{:});

Error in ==> dblquad at 53
Q = quadf(@innerintegral, ymin, ymax, tol, trace, intfcn, ...
__________________________________________________

Ich kann meinen Fehler einfach nicht finden...
Wenn es an der dbquad liegt, verstehe ich aber nicht, warum es sonst bei phi1 nicht meckert. Da macht es ja genau das Gleiche....

Hier sind die "Nebenfunktionen". In phi2 sind auch Integrale enthalten.

Vielen Dank schon mal für jede Hilfe!
Schöne Grüße



___Berechnung von g:________________
function g=g(x)
vega=1.013;
gamma=6.203;
if x > 0
g=min(30,gamma./(x.^vega));
else g=30;
end


____Berechnung von BLS__________
function price=BLS(Y,K,T,r,sigma)
d1=(log(Y./K)+((r+sigma.^2)./2).*T)./(sqrt(T).*sigma);
d2=d1-sqrt(T).*sigma;
price=Y.*normcdf(d1,0,1)-K.*(exp(-r*T)).*normcdf(d2,0,1);

___phi1___________________
function phi1=phi1(r,T,Y1_0,K,sigma1,g)
if g>1
phi1=(g-1).*BLS(Y1_0,(K./(g-1)),T,r,sigma1)
else phi1 = 0
end
end

_____phi2________________
function phi2=phi2(r,T,Y1_0,Y2_0,sigma1,sigma2,K,g)
if g>1
fun2=@(y)lognpdf(y,(log(Y1_0)+(r-sigma1.^2/2).*T),sqrt(T).*sigma1).*BLS(Y2_0,(K-(g-1).*y)./g,T,r,sigma2);
temp1=g.*quadl(fun2,0,K./(g-1))
temp2=g.*Y2_0.*normcdf(((r-.5*sigma1.^2).*T-log(K./((g-1).*Y1_0)))./sqrt(T).*sigma1);
temp3=(g-1).*BLS(Y1_0,K./(g-1),T,r,sigma1);
phi2=temp1+temp2+temp3
else
fun2=@(y)lognpdf(y,log(Y1_0)+(r-sigma1.^2/2).*T,sqrt(T).*sigma1).*BLS(Y2_0,(K+(1-g).*y)./g,T,r,sigma2);
i=0:.1:100;
if max(fun2(i))>1.5*fun2(i(end)) && fun2(i(end))<.000001
else
error('integration in phi2 might cause issues');
end
phi2=g*quadl(fun2,0,100)
end
_____________________________
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.502
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 01.11.2011, 20:39     Titel:
  Antworten mit Zitat      
Hallo,

verwende doch die Code-Umgebung; das macht einiges lesbarer.

Du kannst das Problem selber untersuchen, indem du in der betroffenen Zeile einen Haltepunkt oder setzt und dir die Variablen im Workspace anschaust.

Wenn ich mir das genauer anschauen soll, dann füge bitte auch den Aufruf der Hauptfunktion bei.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Anfänger00
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 12
Anmeldedatum: 06.10.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 02.11.2011, 12:25     Titel:
  Antworten mit Zitat      
Hallo Harald,

ich habe nun die komplette Hauptfunktion eingefügt. Ich hoffe das macht es nun leichter Smile
So kannst du die Hauptfunktion aufrufen Optionspreis(0.5,10,0.2,0.3,0.05,12,30). Mit dem Haltepunkt habe ich es schon versucht, aber ich sehe den Fehler nicht.

Danke schon mal für die Hilfe!!

schöne Grüße



Anfänger00 hat Folgendes geschrieben:

Das ist meine Hauptfunktion, die je nach Integral sich die anderen (unteren) Funktionen aufruft:

Code:
function Endwert=Optionspreis(T,K,sigma1,sigma2, r, Y1_0,Y2_0)
%% ________ Inputparameter
kappa_c1=0.1523;
kappa_c2=0.5085;
theta_c1=14.62168;
sigma_c1=472.8854;
theta_c2=-0.0462;
sigma_c2=890.6285;
kappa_D=0.0213;
theta_D= 1.8501;
sigma_D=300.4723;
C1=7000;
C2=4500;
D=4300;
%N=round(T*365*24);
%% ______Berechnung der Deterministische Komponenten
f_C1=5985.8+689.4*cos(2*pi*(T/365-3.1));
f_C2=3426.9+856.4*cos(2*pi*(T/365-3.1));
f_D=3332.6+809.9*cos(2*pi*(T/24+0.3))+1232.4*cos(2*pi*(T/168-0.3871))+1420.6*cos(2*pi*(T/8760+0.0131));
%% Berechnung Parameter für die jeweilige Density
EW_C1=f_C1+(C1-f_C1).*exp(-kappa_c1.*T)+theta_c1.*(1-exp(-kappa_c1.*T));
Var_C1=((sigma_c1.^2)./(2*kappa_c1)).*(1-exp(-2*kappa_c1.*T));

EW_C2=f_C2+(C2-f_C2).*exp(-kappa_c2.*T)+theta_c2.*(1-exp(-kappa_c2.*T));
Var_C2=(((sigma_c2.^2)./(2*kappa_c2)).*(1-exp(-2*kappa_c2.*T)));

EW_D=f_D+(D-f_D).*exp(-kappa_D.*T)+theta_D.*(1-exp(-kappa_D*T));
Var_D=((sigma_D.^2)./(2*kappa_D)).*(1-exp(-2*kappa_D.*T));

EW_C1_D=EW_C1-EW_D;
Sigma_C1_D=sqrt(Var_C1+Var_C2);

EW_C2_D=EW_C2-EW_D;
Sigma_C2_D=sqrt(Var_C2+Var_D);
%% Intergral über f_C-D * f_C

Fun_bis_inf=@(c,z) normpdf(z,EW_C1_D,Sigma_C1_D).*normpdf(c,EW_C2,sqrt(Var_C2)).*phi1(r,T,Y1_0,K,sigma1,g(c+z));
Fun_bis_0=@(c,z) normpdf(z,EW_C1_D,Sigma_C1_D).*normpdf(c,EW_C2,sqrt(Var_C2)).*phi2(r,T,Y1_0,Y2_0,sigma1,sigma2,K,g(c+z));  
integral1=dblquad(Fun_bis_inf,-100,100,0,100)
integral2=dblquad(Fun_bis_0,-100,100,-100,0)
Endwert= integral2 + integral1
end



Hier habe ich als nun eine zweidimensionales Integral in zwei geteilt, einmal für den Bereich von -100 bis 0 (z-Variable) und einmal von 0 bis 100.
Das merkwürdige ist, dass es eigentlich gut durchläuft und phi 1 keine Probleme hat. Auch bei phi2 funktioniert es für den Fall, dass g>1 ist, aber für den Fall "else" (g<=1) kriege ich eine Fehlermeldung.
Ich kann meinen Fehler hier einfach nicht finden. Liegt es daran, dass in dem Doppeltintegral an sich noch weitere Integrale berechnet werden? Ich kann keine Probleme in den Grenzen feststellen. Wenn ich jede Komponente einzeln aufrufe läuft es immer, aber sobald ich alles gleichzeitig aufrufe, bekomme ich eine ganze Pallette von Fehlermeldungen:
_____________________________
Code:
??? Error using ==> times
Matrix dimensions must agree.

Error in ==>
phi2>@(y)lognpdf(y,log(Y1_0)+(r-sigma1.^2/2).*T,sqrt(T).*sigma1).*BLS(Y2_0,(K+(1-g).*y)./g,T,r,sigma2)
at 9
    fun2=@(y)lognpdf(y,log(Y1_0)+(r-sigma1.^2/2).*T,sqrt(T).*sigma1).*BLS(Y2_0,(K+(1-g).*y)./g,T,r,sigma2);
   
Error in ==> phi2 at 11
    if max(fun2(i))>1.5*fun2(i(end)) && fun2(i(end))<.000001

Error in ==>
Optionspreis>@(c,z)normpdf(z,EW_C1_D,Sigma_C1_D).*normpdf(c,EW_C2,sqrt(Var_C2)).*phi2(r,T,Y1_0,Y2_0,sigma1,sigma2,K,g(c+z))
at 39
Fun_bis_0=@(c,z)
normpdf(z,EW_C1_D,Sigma_C1_D).*normpdf(c,EW_C2,sqrt(Var_C2)).*phi2(r,T,Y1_0,Y2_0,sigma1,sigma2,K,g(c+z));

Error in ==> quad>quadstep at 125
y = f(x, varargin{:});

Error in ==> quad at 98
[Q(3),fcnt,warn(3)] = ...

Error in ==> dblquad>innerintegral at 77
    Q(i) = quadf(intfcn, xmin, xmax, tol, trace, y(i), varargin{:});

Error in ==> quad at 76
y = f(x, varargin{:});

Error in ==> dblquad at 53
Q = quadf(@innerintegral, ymin, ymax, tol, trace, intfcn, ...

__________________________________________________

Ich kann meinen Fehler einfach nicht finden...
Wenn es an der dbquad liegt, verstehe ich aber nicht, warum es sonst bei phi1 nicht meckert. Da macht es ja genau das Gleiche....

Hier sind die "Nebenfunktionen". In phi2 sind auch Integrale enthalten.

Code:
function g=g(x)
vega=1.013;
gamma=6.203;
if x > 0
    g=min(30,gamma./(x.^vega));
else g=30;
end


Code:
function price=BLS(Y,K,T,r,sigma)
d1=(log(Y./K)+((r+sigma.^2)./2).*T)./(sqrt(T).*sigma);
d2=d1-sqrt(T).*sigma;
price=Y.*normcdf(d1,0,1)-K.*(exp(-r*T)).*normcdf(d2,0,1);


Code:
function phi1=phi1(r,T,Y1_0,K,sigma1,g)
if g>1
    phi1=(g-1).*BLS(Y1_0,(K./(g-1)),T,r,sigma1)
else phi1 = 0
end
end


Code:
function phi2=phi2(r,T,Y1_0,Y2_0,sigma1,sigma2,K,g)
if g>1
    fun2=@(y)lognpdf(y,(log(Y1_0)+(r-sigma1.^2/2).*T),sqrt(T).*sigma1).*BLS(Y2_0,(K-(g-1).*y)./g,T,r,sigma2);
    temp1=g.*quadl(fun2,0,K./(g-1))
    temp2=g.*Y2_0.*normcdf(((r-.5*sigma1.^2).*T-log(K./((g-1).*Y1_0)))./sqrt(T).*sigma1);
    temp3=(g-1).*BLS(Y1_0,K./(g-1),T,r,sigma1);
    phi2=temp1+temp2+temp3
else
    fun2=@(y)lognpdf(y,log(Y1_0)+(r-sigma1.^2/2).*T,sqrt(T).*sigma1).*BLS(Y2_0,(K+(1-g).*y)./g,T,r,sigma2);
    i=0:.1:100;
    if max(fun2(i))>1.5*fun2(i(end)) && fun2(i(end))<.000001
    else
        error('integration in phi2 might cause issues');
    end
    phi2=g*quadl(fun2,0,100)
end
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.502
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 02.11.2011, 14:56     Titel:
  Antworten mit Zitat      
Hallo,

ich weiß zumindest das Problem: g ist ein Vektor mit zwei Elementen, y ein Vektor mit 101 Elementen, und das passt nicht zusammen. Warum an der Stelle g ein Vektor mit 2 Elementen ist, kann ich dir auch nicht sagen.

Was mich jedoch erstaunt: du willst, soweit ich das verstehe, ein Doppelintegral berechnen. Im Integranden taucht jedoch auch nochmal ein Integral auf - wieso?

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Anfänger00
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 12
Anmeldedatum: 06.10.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 02.11.2011, 17:10     Titel:
  Antworten mit Zitat      
Hallo,
ich verstehe ich auch nicht, warum die Dimensionen unterschiedlich sind. Wahrscheinlich ist es unzulässig in dem Doppelintegral ein anderes zu berechnen? Das Problem ist, ich für eine Komponente, die ich im doppelten Integral brauche, ein anderes Integral berechnen muss, dies hängt aber wiederrum von g ab, was im doppelten berechnet wird.
Den Teil aus dem Paper habe ich als Bild angehangen. Da sieht man die Zusammenhänge ganz gut.

Gruß

Unbenannt.png
 Beschreibung:

Download
 Dateiname:  Unbenannt.png
 Dateigröße:  51.88 KB
 Heruntergeladen:  593 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen



Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

Du kannst Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.
Du kannst Dateien in diesem Forum posten
Du kannst Dateien in diesem Forum herunterladen
.





 Impressum  | Nutzungsbedingungen  | Datenschutz | FAQ | goMatlab RSS Button RSS

Hosted by:


Copyright © 2007 - 2025 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks

MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.