2013-02-13 14 views
28

में आई मैं "एक वसंत में गेंद के लिए" यूलर पद्धति का उपयोग करके एक कार्यक्रम बनाने के लिए है मॉडलRuntimeWarning: अमान्य मान डिवाइड

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 

मैं कर सकते हैं यह समझ में नहीं आता, कोड के साथ क्या गलत है?

+0

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

+1

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

उत्तर

1

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

48

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

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

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

+17

यह एनपी.एर्स्टेट (divide = 'ignore', अवैध = 'अनदेखा' के साथ 'उपयोग करने के लिए उपयोगी हो सकता है:' यदि आप कोड के ब्लॉक के लिए चेतावनियों को दबाना चाहते हैं। – GWW

+1

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

6

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

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^