【发布时间】:2019-03-07 04:03:43
【问题描述】:
类方法是否正确使用?
我正在开发一个程序来为 3-D N 体问题创建数据输入。目标是创建一个具有 50000 个粒子的均匀密度球体。每个粒子类实例必须具有质量、位置和速度。位置矢量必须是球形的,因此当创建粒子实例时,它位于半径为 1 的球体内。速度必须在 3 个方向上随机化。这将在稍后通过添加轨道速度进行更改。所有数据稍后将导出到 3 个列表中,质量、位置和速度均采用笛卡尔坐标。
我无法创建具有此类属性的粒子。
第一次运行的代码是:
import math
import numpy as np
class Particle:
def__init__(self,mass,position,velocity):
self.mass = 1/50000
self.position = position
self.velocity=velocity
def position(self):
self.position = (self.r, self.theta, self.phi)
@classmethod
def set_r(cls, r):
cls.r = np.rand.uniform(0,1)
@classmethod
def set_theta(cls, theta):
cls.theta = np.rand.uniform(-(math.pi)/2 ,(math.pi)/2)
@classmethod
def set_phi(cls, phi):
cls.phi = np.rand.uniform(0,2*math.pi)
def velocity(self):
self.velocity = (self.Vx, self.Vy, self.Vz)
@classmethod
def set_Vx(cls, Vx):
cls.Vx = np.rand.uniform(0,0.001)
@classmethod
def set_Vy(cls, Vy):
cls.Vy = np.rand.uniform(0,0.001)
@classmethod
def set_Vz(cls, Vz):
cls.Vz = np.rand.uniform(0,0.001)
在与 CS 部门的朋友交谈后,代码被编辑为:
import math
import numpy as np
class Particle():
def __init__(self,mass,position,velocity):
self.mass = 1/50000
self.position = position[]
self.velocity = velocity[]
@classmethod
def getPosition(cls):
return [cls.r, cls.theta, cls.phi]
@classmethod
def set_r(cls, r):
cls.position[0] = np.rand.uniform(0,1)
@classmethod
def set_theta(cls, theta):
cls.position[1] = np.rand.uniform(-(math.pi)/2 ,(math.pi)/2)
@classmethod
def set_phi(cls, phi):
cls.position[2] = np.rand.uniform(0,2*math.pi)
def getVelocity(cls):
return [cls.Vx, cls.Vy, cls.Vz]
@classmethod
def set_Vx(cls, Vx):
cls.velocity[0] = np.rand.uniform(0,0.001)
@classmethod
def set_Vy(cls, Vy):
cls.velocity[1] = np.rand.uniform(0,0.001)
@classmethod
def set_Vz(cls, Vz):
cls.velocity[2] = np.rand.uniform(0,0.001)
是否需要在 init 中定义向量的各个部分,然后使用类方法创建数组以供以后使用和更改?
编辑 1:该类将通过 for 循环运行,以创建 50000 个粒子,每个粒子具有相同的质量(归一化为 1/50000)、位置向量和速度向量。所以导出到一个列表中的.dat文件
【问题讨论】:
-
您不想在初始化中将
mass设置为mass。class也应该是小写的 -
另外你打算如何使用这个类?
-
该代码将用于 n 体模拟。是的,质量应该设置为 init 中的值。我认为这需要在类之外定义。
-
类是否有位置(由所有实例共享),还是每个实例都有自己的位置和速度?
-
每个实例都有自己的位置和速度。在导出到 .day 文件之前必须编辑速度