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和
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,但没有效果。
发布于 2015-04-21 14:14:29
在此代码中:
def LJ(x,y):
for i in range(1,10):
for j in range(1,10):
...如果是i == j,你是在将一个粒子与其自身进行比较。尝试跳过for循环的迭代,如下所示:
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是准确的。
发布于 2015-04-22 11:49:38
你应该继续学物理。势函数是,根据你的力公式重建,
LJ(r) = 4*e*( (sigma/r)**12 - (sigma/r)**6 )与势相对应的力是,对于任何一个势,
F = - LJ'(r)*(rx/r, ry/r)因此,计算组合相互作用力的过程应该如下所示
def LJ(x,y):
for i in range(x.size):
for j in range(x.size):
rx = (x[i]-x[j])
ry = (y[i]-y[j])
r = sqrt(rx*rx+ry*ry+1e-12)
f = 24*e/r*( 2*(sigma/r)**12 - (sigma/r)**6 )
fx[i] += f*(rx/r)
fy[i] += f*(ry/r)
print fx, fy条件是,在这个过程的调用下,力数组被初始化,要么是零,要么是引力。
在距离的计算中加上术语eps**2可以避免零距离,从而避免了力计算中无穷大的值。当然,相对于粒子的典型距离,这个epsilon eps应该很小。场景的维数,这里的sigma=1.01是一个典型的距离,因此eps=1e-6相对于它很小。
https://stackoverflow.com/questions/29774191
复制相似问题