0

我有一个令人讨厌的不连续二维积分I(k,k''; J,Jp,a,b,c,d),它有 4 个变分参数(a,b,c,d)和 2 个固定常数(J,Jp)。求积分的过程并不简单,需要第一步。

  1. 我需要找到从 到 的一维积分的根 ( mu)-pipi

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

    其中E是一个由平方根和余弦组成的复杂函数。

  2. 找到 mu 后,我需要找到(a,b,c,d)这个二维积分(与极限相同-pipi的4D(全局)最小值JJp提供 ,。

    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,但我不确定如何处理它们的任意值。除了嵌套所有 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 系统的基态能量最小化。

4

1 回答 1

0

我根本没有看过你的方程,但我可以给你有关如何嵌套 lambda 的信息。您可以简单地添加lambda a, b, c, d:到当前 lambda 的前面,然后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

这为您传入的a, b,c和的值创建了一个闭包,重命名为或类似的东西可能更有意义。dfindmu()findmumake_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)
于 2012-02-21T06:35:40.720 回答