2016-07-26 77 views
1

我想評估一個使用quadgk的數值積分,因爲我不是matlab專家,我很難得到下面的代碼來工作。 我有矩陣g(i,j),我正在評估g的每個元素的參數phi的積分。這部分代碼工作正常,但是當我想改變矩陣g的大小時,問題就開始了,在這種情況下,只有第一個值是正確的,並且對於更高大小(k)的所有g元素,它返回零。在多個參數上迭代quadgk

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 

這裏是對於k = 2和輸出,

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 

我試圖尋找的功能處理陣列,和幾個不同的東西,但似乎沒有解決的問題,所以遠。

回答

1

代碼中的錯誤是您在for循環中使用i作爲虛構單位和迭代變量。有兩種方法可以解決此問題:

  1. 將迭代變量i更改爲ii
  2. 變化ifun1i所以你明確地使用虛數單位。

順便說一下,也有一些,你應該在你的代碼改變和提高額外的東西:

  1. 您可以將funfor遍歷k的,因爲fun不依賴於k
  2. mtimesmpower很少使用。改爲使用*^
+0

嗨edwinksl,非常感謝你的答案,現在它的工作完美!但是我仍然感到困惑,因爲我的代碼爲k的每個單獨的值產生了正確的結果,即使對索引i進行迭代,所以這就是爲什麼我不認爲使用{i}創建了問題。 – setareh