求函数I(a,b,c,d)的积分的四维最小值(a,b,c,d)

时间:2012-02-21 05:28:49

标签: python integration minimization

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

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

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

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

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

    Jp

  3. 复杂的函数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的第一步,但我不确定如何使用它们的任意值。除了嵌套所有lambda函数之外还有另一种方法吗?即便如此,我如何设法嵌套lambda函数来实现我的需要呢?

    a,b,c,d

    我有使用Mathematica编写的程序,但是获取最小值所花费的时间太长,有时候是错误的。我想尝试将它移植到Python,我目前正在学习。谢谢!

    编辑:有关物理系统的更多信息:第一步是通过强制填充系统来找到量子系统的费米能级。利用费米能级,可以找到变化参数最小化Hartree-Fock系统的基态能量。

1 个答案:

答案 0 :(得分:0)

我根本没看过你的等式,但我可以给你关于如何筑巢lambdas的信息。您只需将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的{​​{1}},bcd的值进行关闭,这可能更有意义将findmu()重命名为findmu或类似内容。

在这里使用实际的函数定义而不是lambdas可能会使代码更具可读性:

make_findmu