脾气除以零.为什么? [英] Numpy divide by zero. Why?
问题描述
import pygame
import random
import math
import numpy as np
import matplotlib.pyplot as plt
fx = np.zeros([11])
fy = np.zeros([11])
x = np.zeros([11])
y = np.zeros([11])
x[0] = 11
y[0] = 1
sigma = 1.01
e = 1.1
dt = 0.1
def LJ(x,y):
for i in range(1,10):
for j in range(1,10):
rx = (x[i]-x[j])
ry = (y[i]-y[j])
fx[i] = 24*e*(((2/rx)*sigma/rx**12)-((1/rx)*sigma/rx**6))
fy[i] = 24*e*(((2/ry)*sigma/ry**12)-((1/ry)*sigma/ry**6))
print fx, fy
为什么我仍然收到错误消息
RuntimeWarning: divide by zero encountered in double_scalars
和
Why am I still getting errors
RuntimeWarning: divide by zero encountered in double_scalars
and
RuntimeWarning: invalid value encountered in double_scalars
我得到的结果是
[ 0. nan nan nan nan nan nan nan nan nan 0.] [ 0. nan nan nan nan nan nan nan nan nan 0.]
我试图修改x和y开头,但是没有效果.
I tried to modify starting x and y but that gave no effect.
推荐答案
在此代码中:
def LJ(x,y):
for i in range(1,10):
for j in range(1,10):
...
如果为i == j
,则表示正在将粒子与其自身进行比较.尝试像这样跳过for循环的迭代:
If i == j
, you are comparing a particle to itself. Try skipping that iteration of the for-loops like so:
def LJ(x,y):
for i in range(1,10):
for j in range(1,10):
if i == j:
continue
rx = (x[i]-x[j])
ry = (y[i]-y[j])
fx[i] = 24*e*(((2/rx)*sigma/rx**12)-((1/rx)*sigma/rx**6))
fy[i] = 24*e*(((2/ry)*sigma/ry**12)-((1/ry)*sigma/ry**6))
此外,您将需要为x和y列表输入实际值,因为它们当前均为0.完全在同一位置的两个粒子将根据该方程施加无限量的力,因此在这种情况下除以0就是正确的.
Also, you will need to put in actual values for the x and y lists, as they are all currently 0's. Two particles at exactly the same location exert an infinite amount of force according to that equation, so the divide by 0 is accurate in that scenario.
这篇关于脾气除以零.为什么?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!