রানটাইম ওয়ার্নিং: বিভাজনে অবৈধ মান


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

আমি বুঝতে পারছি না, কোডটিতে কী ভুল?


কোডের সেই লাইনে ছোট আইটেমের মধ্যে কী চলছে তা মুদ্রণ করুন। এটি ডিবাগ করার একমাত্র উপায়।
CppLearner

4
আপনার nanপক্ষে রয়েছে rr, যা ত্রুটিটি ছুঁড়ে দিচ্ছে। ইস্যুটি rrউত্থাপিত হয় r[i,:]যা থেকে সমান, কিছু ক্ষেত্রে, থেকে array([ nan, nan])। @ সিপিপিআল্নার যেমন উল্লেখ করেছেন, কোডটি ডিবাগ করার (বা লেখার) সর্বোত্তম উপায় হ'ল বাস্তবায়ন করার আগে প্রতিটি ছোট অংশ পরীক্ষা করা।
মহাজাগতিক

উত্তর:


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(...)আপনাকে কেবল পরিচালনা করা মামলার জন্য নিরাপদে এটি করতে দেয়।
উদ্ঘাটন_রায়েজ

4
@ রিভ_ইটরেঞ্জ যে আমি শূন্য দ্বারা বিভাজনকে সাধারণত উপেক্ষা করার চেয়ে অনেক বেশি গ্রহণযোগ্য বলে মনে করি।
এক্স স্কোয়ার 12

4
লাইনটির আগে এটি স্থাপন করা ভাল যা ত্রুটি সৃষ্টি করে তারপরে লাইনের পরে পুনরায় সেট করার পরে'warn' কমান্ডের মাধ্যমে স্বাভাবিক অবস্থায় ফিরে আসেnp.seterr(divide='warn', invalid='warn')
মোহাম্মদ এলনেসার

15

পাইথন ইনডেক্সিং 0 (1 এর পরিবর্তে) থেকে শুরু হয়, সুতরাং আপনার অ্যাসাইনমেন্টটি "r [1 ,:] = r0" আর এর দ্বিতীয় (অর্থাত্ সূচক 1) উপাদানকে সংজ্ঞায়িত করে এবং প্রথম (সূচক 0) উপাদানটিকে শূন্যের জোড়া হিসাবে ছেড়ে দেয়। লুপের জন্য আপনার প্রথম মানটি 0 হয়, সুতরাং আরআর নিজের সাথে প্রথমে প্রবেশের ডট পণ্যটির বর্গমূল পায় (যা 0 হয়) এবং পরবর্তী লাইনে আরআর দ্বারা বিভাজনটি ত্রুটি ছুঁড়ে দেয়।


10

শূন্য দ্বারা বিভাজন রোধ করতে আপনি যেখানে আউটপুট 'আউট' প্রি-ইনিশিয়েল করতে পারবেন যেখানে ডিভ0 ত্রুটি ঘটে, যেমন eg 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শূন্য কিনা তা পরীক্ষা করুন এবং ডিনোমিনেটরে এটি ব্যবহার ব্যতীত যুক্তিসঙ্গত কিছু করুন।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.