<p>正如@Hristo Iliev和@Pavel Annosov在评论中已经提到的,<code>quad</code><a href="http://docs.scipy.org/doc/scipy/reference/generated/scipy.integrate.quad.html" rel="nofollow">returns a tuple of stuff</a>。如果你假设积分没有问题,就像你在Mathematica中所做的那样(这不是一个好主意),那么你只需要第一个元素,它应该是积分的结果。在</p>
<p>但这只会给你一个数字,而不是<code>T</code>的函数。要获得后者,您需要自己定义相应的函数,就像在Mathematica中使用<code>\Delta[T_]:=...</code>所做的那样</p>
<p>以下是一些可以让你开始的地方:</p>
<pre><code>def f(E, T):
"""To be integrated over T."""
temp = np.sqrt(E * E + T * T)
return np.tanh(1477.92 * temp) / temp
def gap(T):
"""Integration result: \Delta(T)"""
return quad(f, 0, 1, args=(T, ))[0] #NB: [0] select the 1st element of a tuple
</code></pre>
<p>请注意,您需要使用<code>args=(T,)</code>语法将<code>T</code>参数发送给正在集成的函数:<code>quad</code>对函数的第一个参数进行积分,并且它需要其他参数来计算<code>f(E, T)</code>。在</p>
<p>现在您可以将这个<code>gap(T)</code>提供给<code>fsolve</code>,<a href="http://docs.scipy.org/doc/scipy/reference/generated/scipy.optimize.fsolve.html" rel="nofollow">which also expects a function</a>(更准确地说是<code>callable</code>)。在</p>
<p>在更一般的层面上,您不应该使用Boltzmann常数、hbar等数值(甚至Mathematica也抱怨过!)。相反,你应该用无量纲的形式写出你的公式:用能量单位测量温度(因此k_B=1),等等,在积分中做适当的代换,这样你就可以处理无量纲参数的无量纲函数,然后让计算机来处理。在</p>