Я хочу смоделировать столкновение двух тел в соответствии с гравитацией и, в конечном итоге, с учетом других сил, чтобы склеить материю. Я хотел бы использовать python для этого, но я открыт для альтернатив. Какие инструменты или библиотеки можно использовать для выполнения этой задачи?
Недавно я сделал что-то подобное, чтобы смоделировать систему из двух масс, соединенных пружиной. Эти массы лежали горизонтально на плоскости без трения. Одна из этих масс получила первоначальный импульс, после чего система осталась в покое. В то время как вся система (контроид, чтобы быть precies) движется с постоянной скоростью, две массы колеблются, двигаясь вперед. Вот краткий ASCII-рисунок системы
Initial Impulse ______ ______
----> | m1 |/\/\/\/\/\/\/\| m2 |
_____________________|____|______________|____|______________________
Записав дифференциальные уравнения, я написал небольшую программу на Python, моделирующую проблему. Эта программа основана на методе малых шагов (также называемом методом Эйлера). Вот соответствующая статья в Википедии:
http://en.wikipedia.org/wiki/Euler_method
Я реализовал этот алгоритм для описанной выше проблемы и построил результаты с помощью gnuplot:
gnuplot.info (мне разрешено добавить только одну гиперссылку, поэтому добавьте www)
Но вы можете использовать любой инструмент, который вам нравится для этой цели. Вот исходный код моей небольшой программы:
#!/usr/bin/python
import os
steps = 100000
time = 100.
# Initial conditions
D = 0.9
m1 = 1.2
m2 = 0.4
v1 = 1.3
v2 = 0.
x1 = 0.
x2 = 1.
l = 1.
#Since I also tried to implement other algorithmus i specify which one to use
Euler = 1
#Euler
if Euler == 1:
timesteps = time / steps
# Open the files for writing the results to
f = open('results_x1', 'w')
f2 = open('results_x2', 'w')
f3 = open('results_com', 'w')
# The real calculation
for i in range(0,steps):
x1 = x1 + (D * (x2 - x1 -l) / m1)* (timesteps**2) + v1 * timesteps
x2 = x2 - (D * (x2 - x1 -l) / m2)* (timesteps**2) + v2 * timesteps
v1 = v1 + (D * (x2 - x1 -l) / m1)* (timesteps)
v2 = v2 - (D * (x2 - x1 -l) / m2)* (timesteps)
f.write(str(i*timesteps) + " " + str(x1) + "\n")
f2.write(str(i*timesteps) + " " + str(x2) + "\n")
f3.write(str(i*timesteps) + " " + str((x1*m1 + x2*m2)/(m1+m2)) + "\n")
f.close()
f2.close()
f3.close()
Конечно, есть алгоритмы получше, чем эйлеровы, но этот, безусловно, самый простой в реализации (мне не удалось реализовать более сложные алгоритмы ;-)).
Итак, вот шаги, которые вы, вероятно, должны выполнить:
Я знаю, что это довольно обширная тема, и поэтому мой ответ будет поверхностным. Просто расскажите, о чем вы хотите узнать больше, а я постараюсь добавить соответствующие комментарии ;-)
Посетите сайт Рона Федкива ; это хорошая отправная точка с исчерпывающим набором ключевых слов.
это зависит от того, какую симуляцию вы пытаетесь построить:
если ваша симуляция имеет целью построить симуляционную модель, которая, например, избегает экспериментального шума, может быть, со сложным алгоритмом динамики и т. д., я думаю, что C или C++ - лучший выбор.
С другой стороны, если вы хотите создать быструю симуляцию с графическим выводом и встроенными инструментами анализа (возможно, даже в дидактических целях), python — ваш выбор! в этом случае я предлагаю вам проверить дистрибутив Enthought Python .. для академического использования это бесплатное программное обеспечение, и оно имеет встроенную версию scipy.
пользователь68
Стефано Борини
dmckee --- котенок экс-модератор
Стефано Борини
Марек
Джастин Л.