Моделирование физического воздействия объектов, состоящих из конечных мелких элементов

Я хочу смоделировать столкновение двух тел в соответствии с гравитацией и, в конечном итоге, с учетом других сил, чтобы склеить материю. Я хотел бы использовать python для этого, но я открыт для альтернатив. Какие инструменты или библиотеки можно использовать для выполнения этой задачи?

Что-то вроде игрового физического движка? (Законы Ньютона + обнаружение столкновений с трением)
@mbq: вы знаете хороший и простой, возможно, пригодный для использования через python?
Я должен сказать, что фраза «физика элементарных частиц» в вашем заголовке сбивает с толку. Мне было интересно, какую модель вы собираетесь использовать для производства пионов...
@dmckee: ты абсолютно прав
Давным-давно я занимался программированием с помощью ODE . Есть еще двигатель Bullet , о котором я только слышал. Я предполагаю, что у них обоих могут быть привязки к Python. Но уж пользоваться какими-то инструментами и забыть о самостоятельном написании разумного (в смысле способного имитировать что-либо похожее на реальность) движка не стоит. Просто погуглите двигатели, я уверен, вы найдете их еще больше. А также попробуйте спросить на StackOverflow, так как программисты используют эти движки намного чаще, чем физики, я думаю (например, в играх).
Гораздо лучшие ответы вы найдете на сайтах, адаптированных специально для области вашего вопроса, включая Stack Overflow и Game Development .

Ответы (3)

Недавно я сделал что-то подобное, чтобы смоделировать систему из двух масс, соединенных пружиной. Эти массы лежали горизонтально на плоскости без трения. Одна из этих масс получила первоначальный импульс, после чего система осталась в покое. В то время как вся система (контроид, чтобы быть 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.

хорошо, но я не спрашиваю о научном распространении python. Я не хочу переделывать динамику тела с нуля.