0

I(k,k''; J,Jp,a,b,c,d)4 つの変分パラメーター(a,b,c,d)と 2 つの固定定数を持つ厄介な不連続 2 次元積分があります(J,Jp)。積分を見つける手順は簡単ではなく、最初のステップがあります。

  1. からまでmuの 1 次元積分のルート ( ) を見つける必要があります。-pipi

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

    ここEで、 は平方根と余弦からなる複雑な関数です。

  2. mu を見つけたので、提供された を使用して、(a,b,c,d)この 2 次元積分 (極限と同じ)-piに対する4D (グローバル) 最小値を見つける必要があります。piJJp

    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'')]

muの推定値を使用して見つけるための最初のステップを実行しましたa,b,c,dが、それらの任意の値を使用する方法がわかりません。すべてのラムダ関数をネストする以外に別の方法はありますか? それでも、必要なことを達成するためにラムダ関数をネストするにはどうすればよいでしょうか?

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に移植してみたいと思います。ありがとう!

EDIT:物理システムの詳細:最初のステップは、システムの充填を課すことにより、量子システムのフェルミ準位を見つけることです。フェルミ準位を使用すると、このハートリー フォック システムの基底状態エネルギーを最小化する変分パラメーターを見つけることができます。

4

1 に答える 1

0

私はあなたの方程式をまったく見ていませんが、ラムダをネストする方法についての情報を提供できます。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

これにより、abc、およびdに渡す値のクロージャーが作成されます。名前をfindmu()に変更findmuした方が理にかなっている場合がありmake_findmuます。

ここでラムダではなく実際の関数定義を使用すると、コードが読みやすくなる場合があります。

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)
于 2012-02-21T06:35:40.720 に答える