Что я хочу: у меня есть резиновая веревка, которая в длину, когда не подвергается стрессу и может растягиваться (к длинный). Я хочу разогнать по горизонтали постоянную массу, которая имеет незначительное трение. Я хотел бы иметь функцию, которая сообщает мне скорость массы, зависящую от времени, например, скорость после его выпуска.
Что я сделал: я провел некоторые измерения силы веревки, когда ее натягивали на разную длину. Конечно, при вытягивании (Общая длина ) Я получил силу . Вот график моих результатов.
: смещение одного конца каната
: измеренная сила
Я также смог провести регрессию и нашел функцию, которая описывает, какую силу я получаю после того, как тяну на заданную длину. Я называю эту функцию для силы, зависящей от перемещения. Отсюда легко получить функцию ускорения, которая с объекта, который я хочу ускорить. Но теперь я застрял. мне как-то нужно получить вместо , таким образом, ускорение по времени, а не по длине, поэтому я могу затем интегрировать это, чтобы получить .
Как преобразовать зависимость функции?
Вы, конечно, хотите численно интегрировать ваше уравнение движения с учетом вашего выражения силы.
Я буду считать, что масса крепится с одной стороны веревки, а другая сторона крепится к стене или чему-то, что не будет двигаться во время интеграции. Что-то вроде этого, где пружина на самом деле ваша веревка, с удлинение веревки
Затем вы можете просто проинтегрировать (например, по схеме Эйлера) уравнение
##################################################
## Integration using Euler (mid-point) method knowing position x and speed xp=\dot{x}
##################################################
def integration(x,xp)
dxp = force(x)*@dt
dx = (xp+dxp/2)*@dt
return x+dx,xp+dxp
end
##################################################
## Force expression knowing position x
##################################################
def force(x)
return -10*x
end
##################################################
## Effective integration loop
##################################################
@dt = 0.001 # time increment
t = 0 # initial time
x = 5 # initial position
xp= 0 # initial speed
10000.times do |i|
t += @dt
x,xp = integration(x,xp)
puts "#{t}\t#{x}\t#{xp}"
end
Просто подключите свои начальные условия и задайте выражение из ваших измерений, и вы получите и позицию, и скорость во времени (NB: я взял
в моем коде, но вы можете добавить правильное значение где угодно в integration
функции или в force
функции [которая тогда будет переименована в «ускорение»]).
Вы также можете уточнить его, чтобы интегрировать по постоянному общему времени и выводить меньше результатов, чем у вас есть шагов интеграции (точность увеличивается с меньшим шагом интеграции, @dt
но это может стать трудным для рисования, когда у вас есть миллион точек, просто чтобы быть более точным в интеграции)
Когда ускорение является функцией положения, используйте следующее
который решается для .
Позиция находится из
который решается для .
Пример
когда в затем или
Затем
и когда , затем или
Если бы ваша масса была затем на графике и
пользователь23224
Винтерфелл
пользователь23224