我有一个讨厌的不连续二维积分I(k,k''; J,Jp,a,b,c,d)
,它有4个变分参数(a,b,c,d)
和2个固定常数(J,Jp)
。找到积分的过程并不简单,只有第一步。
我需要找到mu
的一维积分的根(-pi
)
到pi
A = Integrate [ 1/(exp(E(k; a,b,c,d)-mu)+1 ] dk/2pi = 0.5
,
其中E
是由平方根和余弦组成的复杂函数。
找到mu后,我需要找到这个二维积分的4D(全局)最小(a,b,c,d)
值(同-pi
到pi
限制){{ 1}},J
提供。
Jp
复杂的函数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系统的基态能量。
答案 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}},b
,c
和d
的值进行关闭,这可能更有意义将findmu()
重命名为findmu
或类似内容。
在这里使用实际的函数定义而不是lambdas可能会使代码更具可读性:
make_findmu