2012-02-21 23 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)の積分の4次元最小値(a、b、c、d)を求める

  1. 私はEが平方根と余弦からなる複雑な関数である

    -pi からpi

    A = Integrate [ 1/(exp(E(k; a,b,c,d)-mu)+1 ] dk/2pi = 0.5に一次元積分にルート(mu)を見つける必要があります。

  2. がMUを発見したが、私はJJp供給されると、この二次元積分(同じ-pipiに限界)に4D(グローバル)最小(a,b,c,d)値を見つける必要があります。

    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を見つけるための最初のステップを行ってますが、任意について行くには方法がわからないよいますそれらの値。すべてのラムダ関数を入れ子にする以外の方法がありますか?それでも、私が必要とするものを達成するためにラムダ関数を入れ子にする方法はありますか?

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:物理システムに関する詳細:最初のステップは、システムの充填を課すことによって量子システムのフェルミレベルを見つけることです。フェルミ準位を用いれば、このHartree-Fockシステムの基底状態エネルギーを最小にする変分パラメータを見つけることができます。

+0

(1)あなたは、方程式の両方を与えることができますか?私はEが何であるかを見ることができると思う - あなたがfindmuの行からaを欠いていると思う - しかし、(2)Eのように見えることが時々複雑になる。あれは正しいですか? – DSM

+0

Eは時には複雑かもしれませんが、最初のステップは基本的にEが複雑にならないような制約を課しています。すべてのパラメータも実際のものです(実際には物理システムを解決しようとしています)。私は元の投稿をEの実際の形を含むように編集しました。見て分かるように、それはかなり複雑です。私が最小化する必要のある関数は、Eの二乗されたバージョンに[J cos(k + k '')+ Jp cos(k-k ")]を掛けたものと考えることができます – CKtalon

答えて

0

私はあなたの方程式を全く見ていませんが、ラムダを入れ子にする方法についての情報を提供しています。あなたは、単にその後、findmu(a, b, c, d)は、たとえば、あなたがoptimize.fsolve()に渡す機能を返すでしょう、あなたの現在のラムダの前にlambda a, b, c, d:を追加することができます。

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の値のための閉鎖を行い、そしてdfindmu()に入力すると、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) 
+0

これが成し遂げられるかどうかわかりません最小値を見つける最後のステップ(私は質問の最終目標にいくつかの詳細を追加しました)。基本的には、J、Jp; k、k ''; a、b、c、d、muに依存する2D積分の最小値(J、Jp)を求める必要があります。 a、b、c、dは、特定のJとJpの最小値を与える値をとっています。元の質問に記載されているようにfsolveの手続きで得られます。私が書いたことが混乱しているなら、何でも言ってください(それはあります!) – CKtalon

関連する問題