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

quad-Funktion mit 2 Unbekannten

 

Olympique
Forum-Newbie

Forum-Newbie


Beiträge: 6
Anmeldedatum: 09.01.10
Wohnort: München
Version: ---
     Beitrag Verfasst am: 09.01.2010, 21:19     Titel: quad-Funktion mit 2 Unbekannten
  Antworten mit Zitat      
Servus,

ich habe 20 Gleichungen, die alle von x und sigma abhängen. Es soll über x integriert werden. Es ist nur eine numerische Integration möglich.
Eine Integralgrenze ist Unendlich, ich habe mich deshalb für die quadgk-Funktion entschieden.
Was haltet ihr davon?

Ich habe nun eine Funktion Integrand_abh_von_i(sigma,x,i) geschrieben, die von sigma und x abhängt und von der i-ten Gleichung.

Meine Funktion schaut wie folgt aus:
Code:
function I = Integral(sigma)


I=zeros(1,20);

for i=1:1:20
   
I(i) = quadgk(@(x)Integrand_abh_von_i(sigma,x,i),0,inf);

end


end


Irgendwo muss ein Fehler enthalten sein, ich hab aber keine Ahnung wo.
Kann mir einer helfen?

Vielen Dank,
Alexander
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 09.01.2010, 23:12     Titel:
  Antworten mit Zitat      
Hallo,

sieht soweit gut aus. Wie kommst du darauf, dass ein Fehler enthalten ist? Fehlermeldung von MATLAB? Welche?
Unerwartete Ergebnisse? Inwiefern?

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Gast



Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 12.01.2010, 14:16     Titel:
  Antworten mit Zitat      
Hallo,


entschuldige die späte Antwort, aber ich war die letzten Tage nicht daheim.

Also, ich erhalte folgende Fehler:
Code:
??? Error using ==> times
Matrix dimensions must agree.

Error in ==> bankruptcy_point2 at 12
n = log((F.*exp(-r.*T))./V)+0.5*(sigma.^2).*T-(x.*sigma).*sqrt(t);

Error in ==> Bx at 9
y = bankruptcy_point2(sigma,x);

Error in ==> Integrand at 7
B1 = Bx(sigma,x);

Error in ==> Integrand_abh_von_i at 3
Int=Integrand(sigma,x);

Error in ==> Integral>@(x)Integrand_abh_von_i(sigma,x,i) at 8
I(i) = quadgk(@(x)Integrand_abh_von_i(sigma,x,i),0,1);

Error in ==> quadgk>evalFun at 357
            fx = FUN(x);

Error in ==> quadgk>f1 at 375
        [y,too_close] = evalFun(tt);

Error in ==> quadgk>vadapt at 269
            [fx,too_close] = f(x);

Error in ==> quadgk at 208
    [q,errbnd] = vadapt(@f1,interval);


Viele Grüße,
Alexander
 
Harald
Forum-Meister

Forum-Meister


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

aus der Fehlermeldung wird klar, dass das Problem innerhalb deines Integranden auftaucht:

Zitat:
??? Error using ==> times
Matrix dimensions must agree.

Error in ==> bankruptcy_point2 at 12
n = log((F.*exp(-r.*T))./V)+0.5*(sigma.^2).*T-(x.*sigma).*sqrt(t);
.........


Setz doch mal einen Haltepunkt in der betreffenden Zeile und schau, ob du so die Ursache des Problems aufspüren kannst. Es könnte z.B. sein, dass manche dieser Vektoren Zeilenvektoren und andere Spaltenvektoren sind.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Gast



Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 12.01.2010, 15:42     Titel:
  Antworten mit Zitat      
Hey,


den Fehler kann ich leider nicht finden.
Ich habe aber nur Zeilenvektoren, das ist sicher.

Was ich nicht ganz verstehe: Die Integrand_abh_von_i Funktion läuft ohne Probleme.
Wie kann das denn sein?


Viele Grüße,
Alexander
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 12.01.2010, 15:49     Titel:
  Antworten mit Zitat      
Hallo,

das kann ich ohne Kenntnis der Funktion leider nicht sagen.
Eine Möglichkeit sehe ich darin, dass MATLAB erwartet, dass der Integrand auch für Vektoren ausgewertet werden kann. Das x in der Integrand_abh_von_i muss also ein Vektor beliebiger Länge sein dürfen, und die Funktion muss einen Vektor der selben Länge zurückgeben.
Mehr kann ich dir ohne genauere Kenntnis des Codes leider auch nicht helfen.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Gast



Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 12.01.2010, 16:18     Titel:
  Antworten mit Zitat      
Hi,

OK, danke für deine Hilfe. Ich denke jetzt hab ich das Problem gefunden.
Der erste Fehler steckt bereits hier:
Code:

n = log((F.*exp(-r.*T))./V)+0.5*(sigma.^2).*T-(x.*sigma).*sqrt(t);
y = n./(sigma.*sqrt(tau));

F, r, T, V,t und tau sind Vektoren mit Länge 20, sigma ein Skalar.
Diese Gleichung kann nur dann funktionieren, wenn x Länge 1 oder 20 hat. Da steckt der Wurm bereits drin.

Wie kann ich sie denn umformulieren, dass x beliebige Länge haben kann?

Viele Grüße
Alexander
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 12.01.2010, 16:28     Titel:
  Antworten mit Zitat      
Hallo,

probiers mal zunächst mit einer for-Schleife über alle Elemente von x. Wenn das klappt, kann man immer noch überlegen, ob man das eventuell wieder vektorisieren kann.
Ich vermute mal, du verarbeitest y noch weiter? n hat ja, wenn x Länge 1 hat, auf den ersten Blick Länge 20... es sollte aber am Ende etwas mit Länge 1 herauskommen?
Meine Befürchtung ist übrigens: selbst wenn x Länge 20 hat, kommt etwas anderes heraus als du erwartest.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Gast



Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 12.01.2010, 17:50     Titel:
  Antworten mit Zitat      
Hallo,

ich habe schon gemerkt, das dieses Problem sehr kompliziert ist. Ich fang am besten mal ganz vorne an.

Das hier ist mein Integral:
Code:
I = (exp(-r.*t).*normpdf(x)).*B1

Ich muss über x integrieren mit den Integralgrenzen 0 und inf.

B1 wiederrum schaut folgendermaßen aus:
Code:

n1 = (normcdf(y-sigma.*sqrt(t)).*V).*exp(-0.5*(sigma.^2).*t+sigma.*sqrt(t.*x)+ r.*t);
n2 = (normcdf(-y).*F).*exp(-r.*tau);
B = n1+n2;

In B ist also wiederrum eine Unbekannte y enthalten, die so ausschaut:
Code:
n = log((F.*exp(-r.*T))./V)+0.5*(sigma.^2).*T-(x.*sigma).*sqrt(t);
y = n./(sigma.*sqrt(tau));
 


Natürlich kann ich das alles zusammenfassen, das würde dann so ausschauen:
Code:
U = zeros(1,m);


for i=1:1:m

I = @(x)(normpdf(x).*((normcdf((log(F(i).*exp(-r(i)*T(i))./V(i))+0.5*sigma^2*T(i)-x.*sigma*sqrt(t(i)))./(sigma*sqrt(tau(i)))-sigma*sqrt(t(i))).*V(i)).*exp(-0.5*sigma^2*t(i)+sigma*sqrt(t(i).*x)+r(i)*t(i))+(normcdf(-(log(F(i).*exp(-r(i)*T(i))./V(i))+0.5*sigma^2*T(i)-x.*sigma*sqrt(t(i)))./(sigma*sqrt(tau(i)))).*F(i)).*exp(-r(i)*tau(i)))).*exp(-r(i)*t(i));
U(i) = abs(quadgk(I,xb(i),inf));

end

Diese Funktion funktioniert einwandfrei, ist aber sehr unübersichtlich. Deshalb versuche ich B und y seperat als Funktionen zu schreiben.


Viele Grüße,
Alexander
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 12.01.2010, 18:21     Titel:
  Antworten mit Zitat      
Hallo,

es sollte in jedem Fall möglich sein, x jeweils zu übergeben. Genau dieser Teil (erste Zeile der Funktionen) fehlt leider.

Was mich jedoch erstaunt: ich würde nach meinem Verständnis die Schleife nicht über die Komponenten von T, xb etc. laufen lassen, sondern über die Komponenten von x.

Grüße,
Harald
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.