Tôi đã tạo ra một hình ảnh nhỏ của các hạt trong python. Tôi đang tính toán sự dịch chuyển của các hạt trong không gian 2D với trọng số bằng không. Khi mỗi hạt thu hút tất cả các hạt khác dựa trên khối lượng hạt và khoảng cách.Tối ưu hóa tính hấp dẫn đối với các hạt trong không gian trọng lực 2d
Tôi đã thực hiện một hình ảnh trong pygame và mọi thứ hoạt động như kế hoạch (với caluclation), tuy nhiên tôi cần phải tối ưu hóa tính toán một cách gián tiếp. Ngày nay, hệ thống có thể tính toán khoảng 100-150 hạt trong một tốc độ khung hình thấp. Tôi đặt tất cả các tính toán trong một chủ đề riêng biệt mà đã cho tôi một số chi tiết nhưng không gần như những gì tôi muốn.
Tôi đã xem xét scipy và gumpy nhưng kể từ khi tôi không có nhà khoa học hoặc mathguru tôi chỉ nhận được bối rối. Có vẻ như tôi đang đi đúng hướng nhưng tôi không biết đầu mối.
Tôi cần tính toán tất cả sức hấp dẫn trên tất cả các hạt tôi phải lặp trong vòng lặp. Và kể từ khi tôi cần phải tìm nếu có bất kỳ va chạm, tôi phải làm như vậy trên một lần nữa.
Nó phá vỡ trái tim tôi viết rằng loại mã ....
NumPy có khả năng tính toán mảng với mảng, tuy nhiên tôi đã không tìm thấy bất kỳ điều gì để tính toán tất cả các mục trong mảng với tất cả các mục từ cùng một mảng khác. Có cái nào không? Nếu vậy tôi có thể tạo ra và vài mảng và tính toán nhanh hơn nhiều và phải có một chức năng để có được chỉ số từ 2 mảng nơi họ phù hợp giá trị (Collitiondetect IOW)
Đây là ngày nay tính hấp dẫn/collsion:
class Particle:
def __init__(self):
self.x = random.randint(10,790)
self.y = random.randint(10,590)
self.speedx = 0.0
self.speedy = 0.0
self.mass = 4
#Attraction
for p in Particles:
for p2 in Particles:
if p != p2:
xdiff = P.x - P2.x
ydiff = P.y - P2.y
dist = math.sqrt((xdiff**2)+(ydiff**2))
force = 0.125*(p.mass*p2.mass)/(dist**2)
acceleration = force/p.mass
xc = xdiff/dist
yc = ydiff/dist
P.speedx -= acceleration * xc
P.speedy -= acceleration * yc
for p in Particles:
p.x += p.speedx
p.y += p.speedy
#Collision
for P in Particles:
for P2 in Particles:
if p != P2:
Distance = math.sqrt( ((p.x-P2.x)**2) + ((p.y-P2.y)**2) )
if Distance < (p.radius+P2.radius):
p.speedx = ((p.mass*p.speedx)+(P2.mass*P2.speedx))/(p.mass+P2.mass)
p.speedy = ((p.mass*p.speedy)+(P2.mass*P2.speedy))/(p.mass+P2.mass)
p.x = ((p.mass*p.x)+(P2.mass*P2.x))/(p.mass+P2.mass)
p.y = ((p.mass*p.y)+(P2.mass*P2.y))/(p.mass+P2.mass)
p.mass += P2.mass
p.radius = math.sqrt(p.mass)
Particles.remove(P2)
Bạn đã xem [Psyco] (http://psyco.sourceforge.net/) hoặc [Viết mô-đun C/C++] (http://docs.python.org/extending/extending.html)? – nagisa
Bài viết này xem xét các phương pháp phổ biến để tối ưu hóa mô phỏng hấp dẫn, bao gồm cả Barnes-Hut. Các chuyên gia thường làm điều đó trong 3D, nhưng tôi tin rằng các trường hợp 2D là tất cả tương tự. http://www.cs.hut.fi/~ctl/NBody.pdf –
nếu bạn không hài lòng với toán học ("Tôi không có nhà khoa học hoặc mathguru tôi chỉ bị lẫn lộn") thì tôi nghĩ bạn cần tìm một thư viện thực hiện điều này. xem http://stackoverflow.com/questions/6381137/python-physics-library http://stackoverflow.com/questions/2298517/are-any-of-these-quad-tree-libraries-any-good –