2016-07-26 19 views
1

Ich versuche, eine numerische Integration mit Quadgk zu bewerten, da ich kein Experte in Matlab bin, habe ich eine harte Zeit, um den folgenden Code zu arbeiten. Ich habe die Matrix g (i, j), wo ich einen Integral-Over-Parameter phi für jedes Element von g auswerte. Dieser Teil des Codes funktioniert ordnungsgemäß, aber das Problem beginnt, wenn ich die Größe der Matrix g ändern möchte, in diesem Fall ist nur der erste Wert korrekt, und es wird Null für alle Elemente von g für höhere Größen (k) zurückgegeben.Iterieren über Quadgk mit mehreren Parametern

clear; 
alpha=2.0; 
h=1.0; 
lmax=12; 
for k=2:2:4 
    fun = @(phi,t,s) (exp(-i.*(t-s).*phi).*(exp(-i.*phi)-1)./sqrt((1-h.*exp(i.*phi)).*(1-h.*exp(-i.* phi))))./(2.*pi); 
    for i=1:k 
     for j=1:k 
     [email protected](phi) fun(phi,i,j); 
     g(i,j)=real(quadgk(F,0,2.*pi)); 
     end 
    end 
    Y1=mtimes(transpose(g),g) 
    Y2=mpower(Y1,1./2.); 
    Z1 = 0.5.*(eye(k) - Y2); 
    Z2 = 0.5.*(eye(k) + Y2); 
    C1 = mpower(Z1, alpha) + mpower(Z2, alpha); 
    M1=diag(log(eig(C1))); 
    s(k/2)=k; 
    ent(k/2)=real(trace(M1))./(1-alpha); 
end 

hier ausgegeben wird für k = 2 und 4,

k = 

    2 


g = 

    -0.636619772367581 0.636619772367581 
    -0.212206590789194 -0.636619772367581 


Y1 = 

    0.450316371743723 -0.270189823046234 
    -0.270189823046234 0.810569469138702 


k = 

    4 


g = 

    0  0  0  0 
    0  0  0  0 
    0  0  0  0 
    0  0  0  0 


Y1 = 

    0  0  0  0 
    0  0  0  0 
    0  0  0  0 
    0  0  0  0 

ich für das Array von Funktionsgriffe, und ein paar andere Dinge zu sehen versucht, aber nichts scheint das Problem so zu lösen weit.

Antwort

1

Der Fehler in Ihrem Code besteht darin, dass Sie i als eine imaginäre Einheit und eine Iterationsvariable in einer for-Schleife verwenden. Es gibt zwei Möglichkeiten, dieses Problem zu beheben:

  1. Ändern der Iterationsvariable i-ii.
  2. Ändern Sie i in fun zu 1i, so dass Sie die imaginäre Einheit explizit verwenden.

Übrigens gibt es einige zusätzliche Dinge, die Sie in Ihrem Code ändern sollte und verbessern:

  1. Sie fun aus dem for Schleife über k seit fun auf k hängt nicht bewegen kann.
  2. mtimes und mpower werden selten verwendet. Verwenden Sie stattdessen * und ^.
+0

Hallo edwinksl, vielen Dank für die Antwort, jetzt funktioniert es perfekt! Aber ich bin immer noch verwirrt, da mein Code für jeden einzelnen Wert von k ein korrektes Ergebnis liefert, selbst bei Iteration über Index i, weshalb ich nicht gedacht habe, dass die Verwendung von {i} das Problem verursacht hat. – setareh