6

模型四。

方法:执行积分,作为 E 的函数,它为每个使用的电压值输出电流。这对 v_values 数组重复。方程可以在下面找到。

在此处输入图像描述

虽然这个方程中的限制范围从-infinf,但必须限制限制,以便 (E+eV)^2-\Delta^2>0 和 E^2-\Delta^2>0,以避免极点。(\Delta_1 = \Delta_2)。因此,目前有两个积分,限制从-infto-gap-e*vgapto inf

math range error但是,尽管我相信我已经通过使用上述限制排除了麻烦的 E 值,但我一直返回 a 。错误的粘贴:http: //pastie.org/private/o3ugxtxai8zbktyxtxuvg

为这个问题的模糊性道歉。但是,任何人都可以看到明显的错误或代码滥用吗?

我的尝试:

from scipy import integrate
from numpy import *
import scipy as sp
import pylab as pl
import numpy as np
import math

e = 1.60217646*10**(-19)
r = 3000
gap = 400*10**(-6)*e
g = (gap)**2
t = 0.02
k = 1.3806503*10**(-23)
kt = k*t

v_values = np.arange(0,0.001,0.0001)

I=[]
for v in v_values:
    val, err = integrate.quad(lambda E:(1/(e*r))*(abs(E)/np.sqrt(abs(E**2-g)))*(abs(E+e*v)/(np.sqrt(abs((E+e*v)**2-g))))*((1/(1+math.exp((E+e*v)/kt)))-(1/(1+math.exp(E/k*t)))),-inf,(-gap-e*v)*0.9)
    I.append(val)
I = array(I)

I2=[]
for v in v_values:
    val2, err = integrate.quad(lambda E:(1/(e*r))*(abs(E)/np.sqrt(abs(E**2-g)))*(abs(E+e*v)/(np.sqrt(abs((E+e*v)**2-g))))*((1/(1+math.exp((E+e*v)/kt)))-(1/(1+math.exp(E/k*t)))),gap*0.9,inf)
    I2.append(val2)
I2 = array(I2)

I[np.isnan(I)] = 0
I[np.isnan(I2)] = 0

pl.plot(v_values,I,'-b',v_values,I2,'-b')
pl.show()
4

3 回答 3

4

这个问题更适合计算科学网站。仍然有一些要点供您考虑。

首先,积分范围是 和 的(-oo, -eV-gap) U (-eV+gap, +oo)交集(-oo, -gap) U (gap, +oo)。有两种可能的情况:

  • 如果eV < 2*gap那么允许的能量值在(-oo, -eV-gap) U (gap, +oo)
  • 如果eV > 2*gap那么允许的能量值在(-oo, -eV-gap) U (-eV+gap, -gap) U (gap, +oo).

其次,你在一个非常低的温度区域工作。t等于 0.02 K 时,玻尔兹曼因子中的分母为 1.7 µeV,而能隙为 400 µeV 。在这种情况下,指数的值对于正能量来说是巨大的,它很快就会超出 Python 使用的双精度浮点数的限制。由于这是最小可能的正能量,因此在更高的能量下事情不会变得更好。对于负能量,该值将始终非常接近于零。请注意,在此温度下,费米-狄拉克分布具有非常尖锐的边缘,类似于反射的 theta 函数。在E = gap你将有exp(E/kT)大约 6.24E+100。E/kT > 709.78当或时,您将超出范围E > 3.06*gap

然而,使用这样的能量是没有意义的,因为在那个温度下,两个费米函数之间的差异很快就在区间之外变为零,该[-eV, 0]区间完全落在给定温度V < (2*gap)/e(0.8 mV)的间隙内。这就是为什么人们会期望当偏置电压小于 0.8 mV 时电流会非常接近于零。当它大于 0.8 mV 时,积分的主要值将来自 中的被积函数(-eV+gap, -gap),尽管一些非零值来自于奇点附近的E = gap区域和一些来自奇点附近的区域E = -eV-gap您不应避免DoS 中的奇点,否则您将无法在 I(V) 曲线中获得预期的不连续性(垂直线)(图像取自维基百科):

STJ 电流电压图

相反,您必须在每个奇点附近推导出等效的近似表达式并将它们整合。

如您所见,被积函数的值有许多特殊情况,在进行数值计算时必须将它们全部考虑在内。如果您不想这样做,您可能应该转向其他一些数学软件包,例如 Maple 或 Mathematica。这些具有更复杂的数值积分例程,并且可能能够直接处理您的公式。

请注意,这不是试图回答您的问题,而是很长的评论,不适合任何评论字段。

于 2013-02-19T11:33:14.597 回答
2

数学范围错误的原因是您的指数趋于无穷大。取v = 0.0009and E = 5.18e-23,表达式exp((E + e*v) / kt)(我更正了 Hristo Liev 在您的 Python 表达式中指出的错字)exp(709.984..)超出了您可以用双精度数字表示的范围(最高 ca. 1E308)。

两个附加说明:

  • 正如其他人所指出的,您可能应该使用提供较小范围内的数字的单位系统来重新调整方程式。也许,原子单位是一个可能的选择,因为它会设置e = 1,但我没有尝试将你的方程转换成它。(很可能,您的时间步长会变得非常大,因为在原子单位中,时间单位大约是 1/40 fs)。

  • 通常,对浮点数使用指数表示法:e = 1.60217E-19而不是e = 1.60217*10**(-19).

于 2013-02-18T21:43:44.473 回答
1

最终解决这个问题的最好方法是使用重载函数来防止E变量超过\Delta变量。

于 2013-03-01T13:41:14.307 回答