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


9

我是一位试图对超导体-超导体结的电流-电压特性进行建模的物理学家。

该模型的等式为:

一世V=1个Ë[Rñ-ñ-|Ë|[Ë2-Δ1个2]1个/2|Ë+ËV|[Ë+ËV2-Δ22]1个/2[FË-FË+ËV]dË

通过评估给定电压(或代码中)的积分来计算电流值(或代码中)。一世IVv

我已经在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或其他语言建模吗?


就像jeffdk在下面的回答中提到的那样:请检查您的值->从E的平方中减去g = E从-inf变为+ inf !并且出于调试目的,最好定义一个函数F来定义您的被积数(而不是使用lambda形式),以便您可以按其因子/项/部分对其进行拆分,以找出罪魁祸首(尽管在这种情况下,您所有的因素都有麻烦)。Ø1个Ë-45
GertVdE

Answers:


3

首先,最好进一步调试问题,并准确了解溢出源于何处(什么参数,什么参数)。这个问题对我来说还不清楚。

一旦确切地知道了问题所在,就可以更好地诊断问题。例如,让我们来解决溢出问题。如果我没记错的话,这个数字在1e300以上。

  1. 您应该问自己“我真的应该达到这个变量变高的范围”吗?
  2. 如果答案是“是,但被另一个术语除以或被另一个术语抵消”,则需要以合并这些术语的方式重写方程式。也就是说,如果您要使用计算,请尝试定义和并整合这些变量。这里的目标应该是编写方程式,以便您始终在比较相似幅度的项。 X+ÿ/žXÿžX=X/žÿ=ÿ/ž
  3. 如果您确信需要大量解决此问题的方法,请尝试将方程式转换为基本变量位于logspace中的形式。

请注意,您是在明确要求代码执行不正确的积分(-inf,inf),因此您需要确保要放入其中的被积分对于整个域中的数字都表现良好!尝试以最小的值截断积分可能会有所帮助,将其称为,在物理上您知道您不希望从到inf 对积分有任何贡献。Ë一个XË一个X

祝好运!

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.