सुपरकंडक्टर्स (पायथन) के लिए मॉडलिंग वक्र के लिए संख्यात्मक एकीकरण


9

मैं एक भौतिक विज्ञानी हूं, जो एक सुपरकंडक्टर-सुपरकंक्टर जंक्शन के वर्तमान-वोल्टेज विशेषताओं को मॉडल करने की कोशिश कर रहा है।

समीकरण इस मॉडल के लिए है:

मैं(वी)=1आरn-n-||[2-Δ12]1/2|+वी|[(+वी)2-Δ22]1/2[()-(+वी)]

वर्तमान ( या कोड में) मूल्यों की गणना इस दिए गए वोल्टेज ( , या कोड में) के लिए अभिन्न मूल्यांकन करके की जाती है ।मैंIवीv

मैंने पायथन में यह प्रयास किया है। कोड नीचे दिखाया गया है।

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), और इसके साथ ही समस्या भी है।

किसी भी विचार यह कैसे पायथन, या किसी अन्य भाषा में मॉडलिंग की जा सकती है?


कृपया, नीचे दिए गए उत्तर में jeffdk का उल्लेख करें: अपने मूल्यों की जांच करें -> E -inf से + inf तक जाता है, जबकि आप E के वर्ग से मान g = घटा रहे हैं ! और डिबगिंग के उद्देश्यों के लिए, यह एक अच्छा विचार हो सकता है कि एक फ़ंक्शन एफ को आपके इंटीग्रैंड (लैम्बडा फॉर्म का उपयोग करने के बजाय) को परिभाषित करने के लिए परिभाषित किया जाए ताकि आप अपराधी को पहचानने के लिए इसके कारकों / शर्तों / भागों में विभाजित कर सकें (हालांकि इस मामले में) आपके सभी कारक परेशानी में हैं)। हे(1-45)
GertVdE

जवाबों:


3

सबसे पहले, इस मुद्दे को और डिबग करना हमेशा अच्छा होता है और देखें कि ओवरफ्लो कहाँ से आ रहा है (किस शब्द, किस मापदंडों के लिए)। यह मेरे लिए प्रश्न से स्पष्ट नहीं था।

एक बार जब आपको पता चल जाए कि समस्या क्या है, तो आप इस समस्या का बेहतर निदान कर सकते हैं। उदाहरण के लिए, ओवरफ़्लो समस्या को लेने देता है। अगर मैं सही ढंग से याद करूँ तो यह 1e300 से ऊपर है।

  1. आपको खुद से पूछना चाहिए 'क्या मुझे वास्तव में एक रेंज मारना चाहिए जहां यह चर इस उच्च हो रहा है'?
  2. यदि उत्तर 'हां है, लेकिन इसे किसी अन्य शब्द से विभाजित या रद्द किया गया है', तो आपको समीकरणों को एक तरह से फिर से लिखना होगा जो उन शब्दों को जोड़ता है। यही है, अगर आप गणना कर रहे हैं(एक्स+y)/z साथ में एक्स,y,z विशाल संख्या को परिभाषित करने का प्रयास करें एक्स'=एक्स/z तथा y'=y/zऔर उन चर को एकीकृत करें। यहां लक्ष्य आपके समीकरण लिखने के लिए होना चाहिए ताकि आप हमेशा समान परिमाण के शब्दों की तुलना करें।
  3. यदि आप आश्वस्त हैं कि समस्या के लिए आपको बहुत बड़ी संख्या की आवश्यकता है, तो अपने समीकरणों को एक ऐसे रूप में परिवर्तित करने का प्रयास करें जिसमें मूलभूत चर लॉगस्पेस में हों।

ध्यान दें कि आप कोड को एक अनुचित अभिन्न (-inf, inf) करने के लिए स्पष्ट रूप से पूछ रहे हैं, इसलिए आपको यह सुनिश्चित करने की आवश्यकता है कि जिस इंटीग्रैंड को आप इसमें डाल रहे हैं, वह उस पूरे डोमेन के साथ संख्यात्मक कार्यों के लिए अच्छा व्यवहार करता है! यह आपके द्वारा किए जा सकने वाले छोटे से छोटे मूल्य पर अभिन्न को रौंदने की कोशिश करने में मदद कर सकता हैएक्स, जहां आप शारीरिक रूप से जानते हैं कि आप अभिन्न से किसी भी योगदान की उम्मीद नहीं करते हैं एक्स inf करने के लिए।

सौभाग्य!

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.