2

私はPythonにかなり慣れていません。現在の割り当てでは、3Dでパーティクルを調べました。

質問の最初の部分は、同一の重なり合わない粒子を立方格子に配置するプログラムを作成することを求めました。したがって、以下の私のコードは、可能なすべての組み合わせを繰り返し、XYZファイルに入れます。

xyzファイルは次の形式です。

1000.000000
comment goes here
H 0.000000 0.000000 0.000000
H 0.000000 0.000000 1.000000
H 0.000000 0.000000 2.000000
H 0.000000 0.000000 3.000000
H 0.000000 0.000000 4.000000
H 0.000000 0.000000 5.000000
H 0.000000 0.000000 6.000000
H 0.000000 0.000000 7.000000
H 0.000000 0.000000 8.000000

私が立ち往生している次の部分は、私に同じことをしてもらいたいのですが、それらをランダムに配置し、私が持っている粒子の数を制限します。これは私が最初の部分で持っていたコードです。

import itertools #will help iterating particles 

#we must set the values of diameter and Length
L=10
d=.5

#this is the intial coordinates of the first particle
x,y,z = 0,0,0
counter=0

#The particles will be spread across, the below ensures that there is no overlap of particles
with open("question1.xyz","w") as file:
    file.write("\ncomment goes here\n") #add comments into the 2nd line of the xyz file
    for x,y,z in itertools.product(range(L),repeat = 3):
        file.write('H %f %f %f\n' % (x, y, z))
        counter=counter+1

#this will put the number of particles as the first line
with open("question1.xyz") as infile:
    with open("q1Output.xyz","w") as outfile:
        for i,line in enumerate(infile):
            if i==0:
                outfile.write('%f\n'%counter)
            else:
                outfile.write(line)

私が混乱しているのは、パーティクル/座標をランダム化し、オーバーラップがないことを確認する方法です。

何か案は?前もって感謝します!

**編集:これは私がこれまでに持っているものですが、Lを変更し、プログラムの実行にかかる時間を最小限に抑えるように求める質問は別として、何がわかりません

import random
import time

start_time=time.time() 

text_file=open("textfile.xyz","w")
text_file.write("512\n")
text_file.write("Comment goes here\n")

L=12.5
d=1

#place particles
for partciles in range(0,512)
    proxcheck=1
    while proxcheck !=2 #when the particles has been placed, proxcheck will be set=2, and the program will move onto next
    x,y,z=random.random()*L,random.random()*L,random.random()*L #random numbers for positions
    skipfirsttwolines,proxcheck=0,1;

For line in text_file
    skipfirsttwolines=skipfirsttwolines+1;
    if skipfirsttwolines>2: #in xyz file we dont look at first two lines
        proxcheck=0 #if no overlap particle will be placed
        oldvals=line.split(none)
        oldx=float(oldvals[1])
        oldy=float(oldvals[2])
        oldz=float(oldvals[3])

ここからどこに行くべきか、または重複しないようにするためにこのアプローチを取るべきかどうかわからない

@david:

これは私が考えていたものです、何か提案はありますか?

x,y,z=[],[],[]
for j in range(0,512):
    x.append(0)
    y.append(0)
    z.append(0)
xyz_line = '\n{0} {1} {2} {3}'.format('O',x[0],y[0],z[0])
f.write(xyz_line)
4

1 に答える 1

2

コードでランダムなポイントを作成できます

import random

p = (random.randint(0, L), random.randint(0, L), random.randint(0, L))

ただし、同じ場所に 2 つあるのを防ぐ必要がある場合は、(必要なnum_pointsポイント数に設定した後に)行うことができます。

points = set()
while len(points) < num_points:
    p = (random.randint(0, L), random.randint(0, L), random.randint(0, L))
    if p not in points:
        points.add(p)

結果のポイントをファイルに書き込むには:

for p in points:
    f.write("%s %s %s\n" % p)
于 2012-10-03T01:01:00.950 に答える