超导体建模曲线的数值积分(Python)

计算科学 Python 麻木的 积分方程
2021-12-13 08:41:45

我是一名试图模拟超导体-超导体结的电流-电压特性的物理学家。

该模型的方程为:

I(V)=1eRnn|E|[E2Δ12]1/2|E+eV|[(E+eV)2Δ22]1/2[f(E)f(E+eV)]dE

当前的 (II在代码中)值是通过评估给定电压的积分来计算的(V,或v在代码中)。

我在 Python 中尝试过这个。代码如下所示。

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

ec = 1.6021764*10**(-19)
r = 2500
gap = 200*10**(-6)*ec
g = (gap)**2
t = 0.04
k = 1.3806503*10**(-23)
kt = k*t

v_values = arange(0,0.001,0.00001)

I=[]
for v in v_values:
    result, error = integrate.quad (lambda E:(abs(E)/sqrt((E**2-g)))*(abs(E+ec*v)/(sqrt(((E+ec*v)**2-g))))*(math.exp(-E/kt)*(math.exp(-ec*v/kt)-1)),(-inf),(-gap*0.9-ec*v))
    I.append(result)
I = array(I)

I2=[]
for v in v_values:
    result2 = integrate.quad(lambda E:(abs(E)/sqrt((E**2-g)))*(abs(E+ec*v)/(sqrt(((E+ec*v)**2-g))))*(math.exp(-E/kt)*(math.exp(-ec*v/kt)-1)),(gap*0.9),(inf))
    I2.append(result2)
I2 = array(I2)

pl.plot(v_values,I,'-b',v_values,I2,'-r')
pl.xlabel(r'Voltage ($V$)')
pl.ylabel(r'Current ($A$)')
pl.title('Theoretical I(V) curve')
pl.grid(True)
pl.savefig('IVcurve.png')
pl.show()

但是,我收到OverflowError: math range error. 有谁知道如何克服这个问题?10**n为和长积分道歉。当指数被删除(返回 0)时,代码运行,这就是问题所在。

任何想法如何在 Python 或任何其他语言中建模?

1个回答

首先,进一步调试问题并准确查看溢出的来源(什么术语,什么参数)总是好的。从问题中我不清楚这一点。

一旦您确切地知道问题是什么,您就可以更好地诊断问题。例如,让我们考虑溢出问题。如果我没记错的话,这在 1e300 以上。

  1. 你应该问自己'我真的应该达到这个变量变得如此高的范围'吗?
  2. 如果答案是“是的,但它被另一个术语分开或取消”,您需要以结合这些术语的方式重写方程。也就是说,如果你正在计算(x+y)/zx,y,z巨大的数字尝试定义x=x/zy=y/z并整合这些变量。这里的目标应该是写出你的方程,这样你就可以一直比较相似量级的项。
  3. 如果您确信您需要非常大的数字来解决问题,请尝试将您的方程转换为基本变量位于对数空间中的形式。

请注意,您明确要求代码执行不正确的积分(-inf,inf),因此您需要确保放入其中的被积函数对于整个域中的数字表现良好!尝试以最小值截断积分可能会有所帮助,我们称之为Emax,您实际上知道您不期望对积分有任何贡献Emax到 inf。

祝你好运!