【发布时间】:2013-02-03 06:06:16
【问题描述】:
模型 I-V。
方法: 执行积分,作为 E 的函数,它为每个使用的电压值输出电流。这对 v_values 数组重复。公式如下。
虽然此等式中的限制范围从-inf 到inf,但必须限制限制,以便 (E+eV)^2-\Delta^2>0 和 E^2-\Delta^2> 0、避免两极。 (\Delta_1 = \Delta_2)。因此,目前有两个积分,限制从-inf 到-gap-e*v 和gap 到inf。
但是,我一直返回math range error,尽管我相信我已经通过使用上述限制排除了麻烦的 E 值。错误粘贴: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()
【问题讨论】:
-
如果轴上有极点,难道你真的不想用复分析做这个积分吗?计算残差要容易得多。
-
重新调整您的变量,以便 数值计算 不涉及非常小的浮点数,例如
k和e等。在进行纯数学时一切都很好,但数值算法当浮点数很小时,通常不能很好地工作。 -
您在第二个玻尔兹曼项中
exp的参数的分母中缺少大括号,或者您只是忘记将k*t替换为kt。此外,您正在整合[0.9*gap-ev, 0.9*gap]。也许你想把它分成两个积分:一个在(-inf,-0.9*gap-ev],一个在[0.9*gap, inf)。 -
此外,被积函数的前两项的分母中没有
abs。将它们放在那里会隐藏错误的集成范围。 -
让您的代码更易于阅读和调试的风格提示: (1) 将长行拆分为多个较短的行; (2) 使用
def而不是lambda,除非功能极其简单; (3) 将复杂的公式拆分为多个步骤(例如将 f(E) 定义为单独的函数)。 :-D
标签: python numpy scipy integration physics