Числова інтеграція для моделювання кривої надпровідників (Python)


9

Я фізик, який намагається моделювати характеристики струму напруги з’єднання надпровідник-надпровідник.

Рівняння для цієї моделі:

Я(V)=1еRн-н-|Е|[Е2-Δ12]1/2|Е+еV|[(Е+еV)2-Δ22]1/2[f(Е)-f(Е+еV)]гЕ

Поточні ( або в коді) значення обчислюються шляхом обчислення цього інтеграла для заданих напруг ( V або в коді).Я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 переходить від -inf до + inf, поки ви віднімаєте значення g = від квадрата E! І для цілей налагодження може бути хорошою ідеєю визначити функцію F, що визначає ваш інтеград (замість того, щоб використовувати лямбда-форму), щоб ви могли розділити його на його фактори / терміни / частини, щоб визначити винуватця (хоча в цьому випадку, всі ваші фактори потрапляють у біду). О(1е-45)
GertVdE

Відповіді:


3

По-перше, завжди добре додатково налагодити проблему і точно побачити, звідки (який термін, за якими параметрами) надлишок надходить. Це мені було незрозуміло з питання.

Як тільки ви точно дізнаєтеся, в чому проблема, ви зможете краще поставити діагноз. Наприклад, давайте взяти проблему переповнення. Це десь вище 1e300, якщо я правильно пам’ятаю.

  1. Ви повинні запитати себе: «чи дійсно я потрапляю в діапазон, коли ця змінна набуває такого високого рівня»?
  2. Якщо відповідь «так, але вона розділена або скасована іншим терміном», вам потрібно переписати рівняння таким чином, що поєднує ці терміни. Тобто, якщо ви обчислюєте з величезні числа, спробуйте визначити і та інтегрувати ці змінні. Цілі тут повинні полягати в тому, щоб написати свої рівняння, щоб ви завжди порівнювали умови подібних величин. (х+у)/zх,у,zх'=х/zу'=у/z
  3. Якщо ви впевнені, що вам потрібні дуже великі цифри для проблеми, спробуйте перетворити рівняння у форму, в якій основні змінні знаходяться в просторі журналів.

Зауважте, що ви явно просите код виконати неправильний інтеграл (-inf, inf), тому вам потрібно переконатися, що інтеград, який ви вводите в нього, добре поводиться з числовими характеристиками у всьому домені! Це може допомогти спробувати обрізати інтеграл за найменшим можливим значенням, давайте назвати його , де ви фізично знаєте, що не очікуєте жодного внеску в інтеграл від до inf.ЕмахЕмах

Удачі!

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.