RuntimeWarning: डिवाइड में अमान्य मान का सामना करना पड़ा


96

मुझे "बॉल इन ए स्प्रिंग" मॉडल के लिए यूलर की विधि का उपयोग करके एक कार्यक्रम बनाना है

from pylab import*
from math import*
m=0.1
Lo=1
tt=30
k=200
t=20
g=9.81
dt=0.01
n=int((ceil(t/dt)))
km=k/m
r0=[-5,5*sqrt(3)]
v0=[-5,5*sqrt(3)]
a=zeros((n,2))
r=zeros((n,2))
v=zeros((n,2))
t=zeros((n,2))
r[1,:]=r0
v[1,:]=v0
for i in range(n-1):
    rr=dot(r[i,:],r[i,:])**0.5
    a=-g+km*cos(tt)*(rr-L0)*r[i,:]/rr
    v[i+1,:]=v[i,:]+a*dt
    r[i+1,:]=r[i,:]+v[i+1,:]*dt
    t[i+1]=t[i]+dt

    #print norm(r[i,:])

plot(r[:,0],r[:,1])
xlim(-100,100)
ylim(-100,100)
xlabel('x [m]')
ylabel('y [m]')

show()

मुझे यह त्रुटि मिलती रहती है:

a=-g+km*cos(tt)*(rr-L0)*r[i,:]/rr
RuntimeWarning: invalid value encountered in divide

मैं यह पता नहीं लगा सकता कि कोड में क्या गलत है?


कोड की छोटी लाइन में प्रत्येक में क्या चल रहा है प्रिंट करें। इसे डिबेट करने का एकमात्र तरीका है।
कैप्लनियर

2
आपके पास nanहै rr, जो उस त्रुटि को फेंक रहा है। के साथ मुद्दा rrहै, r[i,:]जिसमें से बराबर है, कुछ मामलों में, करने के लिए array([ nan, nan])। जैसा कि @CppLearner ने उल्लेख किया है, कोड को डिबग (या लिखने) का सबसे अच्छा तरीका लागू करने से पहले प्रत्येक छोटे हिस्से का परीक्षण करना है।
कोस्मोसिस

जवाबों:


160

मुझे लगता है कि आपका कोड "शून्य से विभाजित" या "एनएएन द्वारा विभाजित" करने की कोशिश कर रहा है। यदि आप इसके बारे में जानते हैं और नहीं चाहते कि यह आपको परेशान करे, तो आप कोशिश कर सकते हैं:

import numpy as np
np.seterr(divide='ignore', invalid='ignore')

अधिक जानकारी के लिए देखें:


76
with NP.errstate(divide='ignore',invalid='ignore'):यदि आप कोड के ब्लॉक के लिए चेतावनी को दबाना चाहते हैं तो इसका उपयोग करना उपयोगी हो सकता है ।
GWW

8
कोई व्यक्ति शून्य या NaN द्वारा विभाजन को अनदेखा क्यों करना चाहेगा?
एक्स

7
@xsquared जब आपने सही तरीके से अपने आप को विभाजित करने के बाद मूल्य को संभाला है, और आप अपना कोड उपयोगकर्ताओं को वितरित कर रहे हैं (या चेतावनी देखकर थक गए हैं)। with np.errstate(...)आप इसे केवल संभाले हुए मामले के लिए सुरक्षित रूप से करते हैं।
पुन: व्यवस्थित करें

2
@reve_etrange मुझे लगता है कि आम तौर पर शून्य से विभाजित की तुलना में बहुत अधिक स्वीकार्य है।
x चुकता

1
यह इस सेट करने के लिए बेहतर है से पहले लाइन है कि कारण बनता त्रुटि तो रीसेट के बाद की सामान्य अवस्था में लाइन 'warn'आदेश सेnp.seterr(divide='warn', invalid='warn')
मोहम्मद ElNesr

15

पायथन इंडेक्सिंग 0 से शुरू होता है (1 के बजाय), इसलिए आपका असाइनमेंट "r [1 ,:] = r0" r का दूसरा (यानी इंडेक्स 1) तत्व परिभाषित करता है और पहले (इंडेक्स 0) एलिमेंट को शून्य की एक जोड़ी के रूप में छोड़ देता है। आपके लूप के लिए i का पहला मान 0 है, इसलिए rr को पहली प्रविष्टि के डॉट उत्पाद का वर्गमूल r के साथ r (स्वयं का 0) मिलता है, और बाद की पंक्ति में rr द्वारा विभाजन त्रुटि को फेंकता है।


10

विभाजन को शून्य से रोकने के लिए आप आउटपुट को 'आउट' से पहले से जोड़ सकते हैं जहाँ div0 त्रुटि होती है, उदा np.where लिए इसे काट नहीं है क्योंकि पूरी लाइन का मूल्यांकन बिना किसी शर्त के किया जाता है।

पूर्व-प्रारंभिककरण के साथ उदाहरण:

a = np.arange(10).reshape(2,5)
a[1,3] = 0
print(a)    #[[0 1 2 3 4], [5 6 7 0 9]]
a[0]/a[1]   # errors at 3/0
out = np.ones( (5) )  #preinit
np.divide(a[0],a[1], out=out, where=a[1]!=0) #only divide nonzeros else 1

4

आप विभाजित कर रहे हैं, rrजो 0.0 हो सकता है। जाँच करें कि rrक्या शून्य है और हर में इसे इस्तेमाल करने के अलावा कुछ उचित है।

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