2012-02-21 94 views
0

我有一個討厭的不連續2維積分I(k,k''; J,Jp,a,b,c,d),它有4個變分參數(a,b,c,d)和2固定常數(J,Jp)。找到積分的過程並不簡單,並且有第一步。查找函數I(a,b,c,d)積分的四維最小值(a,b,c,d)

  1. 我需要找到從-pi 根(mu)到一維積分到pi

    A = Integrate [ 1/(exp(E(k; a,b,c,d)-mu)+1 ] dk/2pi = 0.5

    其中E是由平方根和餘弦的複雜函數。

  2. 在發現畝,我需要JJp提供找到4D(全球)最低(a,b,c,d)值此二維積分(同-pipi限制)。

    result(J,Jp) = Minimum[ Integrate [ I(J,Jp;k,k''; a,b,c,d,mu) ] dk/2pi dk''/2pi ]

的複雜功能I基本上看起來像

I(J,Jp;k,k''; a,b,c,d,mu) = A(k)*A(k'')*f(a,b,c,d)*[J cos(k+k'') + Jp cos(k-k'')] 

我已經完成了第一步,與a,b,c,d假定值發現mu,但我不知道該如何去任意他們的價值。除了嵌套所有的lambda函數之外還有其他方法嗎?即便如此,我如何去嵌套lambda函數來完成我所需要的功能呢?

beta=100.0 
a=1.2 
b=1.5 
c=0.1 
d=0.5 
findmu = lambda mu: integrate.quad(lambda k:1.0/(2.0*pi)*1.0/(exp(beta*(0.5*(c+d-2.0*(1.0+b)*cos(k)-sqrt(32.0*(b*cos(k/2.0))**2.0+(c-d-2.0*(1-b)*cos(k))**2.0))-mu))+1.0)-0.5/(2.0*pi), -pi,pi) 
mu0 = optimize.fsolve(findmu,0.0) 

我有用Mathematica編寫的程序,但它需要很長時間才能獲得最小值,並且有時是錯誤的。我想嘗試將它移植到我目前正在學習的Python。謝謝!

編輯:關於物理系統的更多信息:第一步是通過強制填充系統找到量子系統的費米能級。利用費米能級,人們可以找到變分參數使Hartree-Fock系統的基態能量最小化。

+0

(1)你能不能給這兩個方程?我想我可以看到E是什麼 - 我認爲你錯過了a)來自你的findmu系列 - 但是(2)它看起來像E有時會很複雜。那是對的嗎? – DSM 2012-02-21 05:47:37

+0

E有時可能很複雜,但第一步基本上強加一個約束,使得E不會很複雜。所有的參數都是真實的(實際上它試圖解決一個物理系統)。我編輯了原始文章以包含E的實際形式。可以看出,它非常複雜。我需要最小化的函數_I_可以認爲是E的平方形式乘以[J cos(k + k'')+ Jp cos(k-k'')] – CKtalon 2012-02-21 06:18:18

回答

0

我還沒有看過你的等式,但我可以給你關於如何嵌套lambda的信息。您可以簡單地添加lambda a, b, c, d:到您當前的拉姆達的前面,然後findmu(a, b, c, d)會返回你會傳遞到optimize.fsolve(),例如功能:

beta=100.0 
findmu = lambda a, b, c, d: lambda mu: integrate.quad(lambda k:1.0/(2.0*pi)*1.0/(exp(beta*(0.5*(c+d-2.0*(1.0+b)*cos(k)-sqrt(32.0*(b*cos(k/2.0))**2.0+(c-d-2.0*(1-b)*cos(k))**2.0))-mu))+1.0)-0.5/(2.0*pi), -pi,pi) 
mu0 = optimize.fsolve(findmu(1.2, 1.5, 0.1, 0.5),0.0) 
# now just tweak the values for the arguments to findmu in subsequent calls 

這使得封閉爲ac值,b,並將d傳遞給findmu(),則將findmu重命名爲make_findmu或類似內容可能更有意義。

這可能使代碼更易讀用一個實際的函數定義,而不是lambda表達式在這裏:

def make_findmu(a, b, c, d): 
    beta = 100.0 
    return lambda mu: integrate.quad(lambda k:1.0/(2.0*pi)*1.0/(exp(beta*(0.5*(c+d-2.0*(1.0+b)*cos(k)-sqrt(32.0*(b*cos(k/2.0))**2.0+(c-d-2.0*(1-b)*cos(k))**2.0))-mu))+1.0)-0.5/(2.0*pi), -pi,pi) 

mu0 = optimize.fsolve(make_findmu(1.2, 1.5, 0.1, 0.5),0.0) 
+0

我不確定這是否會實現我找到最小值的最後一步(我在問題的最終目標中添加了一些細節)。基本上整個過程將需要找到結果(J,Jp)=主要取決於J,Jp; k,k「; a,b,c,d,mu的2D積分的最小值,其中k和k」被整合與a,b,c,d一起取值,這將給我一個特定的J和Jp的最小值。 mu是通過原始問題中提到的fsolve過程獲得的,並且在我看來,您的建議代碼。如果我寫的東西很混亂(這是!)請說什麼 – CKtalon 2012-02-21 07:03:09

相關問題