2016-06-01 5 views
0

Возможно, это не вопрос программирования, а математический вопрос. Но здесь идет.Преобразование уравнений кинематики в Matlab

Представьте, что вы делаете горки с двигателем на автомобиле. Транспортные средства имеют фиксированное значение силы, которое они могут достичь с помощью этого двигателя. В разделе ваших американских каботажных судов вы хотите пройти половину петли, как этот, из одной из моих любимых видеоигр: «Рояльщик» Tycoon!

A good old half loop from Rollercoaster Tycoon

Как вы идете вокруг половины петли, вы не знаете, что ваша скорость будет или как долго он будет считать вас ходить вокруг него. Тем не менее, вы можете понять, основываясь на вашем ускорении, массе и ускорении двигателя из-за силы тяжести, каково максимальное возможное ускорение в любой точке полупериода. Давайте не будем путать эту дискуссию с цифрами, но вместо этого предположим, что мы получили доступ к кривой ускорения и позиции. Это выглядит примерно так:

enter image description here

Я успешно вывел формулу для скорости в зависимости от ускорения против кривого положения и начальной скорости. Из кинематического уравнения

v^2 = 2*a*p 

Я могу определить скорость в зависимости от положения. v = SQRT (2 * [интеграл = F (р) WRT положение])

который в MATLAB я могу получить, выполнив:

v = sqrt(2.*abs(trapz(pos, acc))); 

Я на самом деле я получаю скорость каждой точки вдоль трек с кодом (АСС и поз являются массивами ускорения против позиции график выше):

vel = 1; 
newAcc = 0; 
while ix <= length(acc) 
    pa = acc(ix-1) + (acc(ix)-acc(ix-1))./2; 
    newAP = (pos(ix)-pos(ix-1)).*pa; % This is more time efficient than trapz 
    newAcc = newAcc + abs(2.*newAP); 
    vel(ix) = sqrt(newAcc); 
    ix = ix + 1; 
end 

Теперь я достигаю мою дилемму. У меня ускорение, скорость и положение, и теперь мне нужно время. Я думаю, что моя математика правильная. Поскольку у меня есть a/v/p, это должно быть просто так же просто, как выбрать любое из кинематических уравнений, связанных с временем, и переупорядочить его для получения времени (я хочу получить время в каждой позиции вдоль дорожки, чтобы я мог построить a/v/p как функции времени).

Это должно означать, что я могу выбрать любой из них:

1. p_f = p_i + v_i*t + 1/2*a*t^2 
2. v_f = v_i + a*t 
3. p = (v_i + v_f)*t/2 

уравнение 1 является квадратным. Остальные два выглядят намного проще. Уравнение 2 выглядит многообещающим. Давайте попробуем это.

t = (v_f - v_i)/a 

Преобразование это Matlab, я думаю, что это должно быть так:

time = 0; 
while ix <= length(acc) 
    pa = acc(ix-1) + (acc(ix)-acc(ix-1))./2; 
    newAP = (pos(ix)-pos(ix-1)).*pa; % This is more time efficient than trapz 
    newAcc = newAcc + abs(2.*newAP); 
    vel(ix) = sqrt(newAcc); 

    dt = (vel(ix)-vel(ix-1))./acc(ix); 
    time(ix) = time(ix-1) + dt; 
    ix = ix + 1; 
end 

Но так далеко от моего тестирования, это дает неправильный результат! Я преуменьшен как по математике, так и по алгоритму. Но я полагаю, что это место просто для ответа на вопрос об алгоритме. Я не вижу, как моя формула будет неправильной. Я неправильно конвертирую его в Matlab?

+0

Я уверен, что это действительно не вопрос программирования. Я думаю, что ваш вопрос лучше всего подходит в разделе «Физика» Stack Exchange. Как вы подтвердили свой результат? Откуда вы знаете, что это неправильно? – tvo

+0

Я не верю, что физика или программирование верны. Я ожидаю увидеть формулы Серета-Френета для уравнений движения вдоль кривой. Должны быть векторные величины, поскольку смещения, скорости и ускорения - все векторы. Это неправильно от начала до конца. – duffymo

+0

Это не ошибка от начала до конца. Я создаю кривую с использованием постоянных временных шагов и кривой ускорения и позиции. Я сопоставляю эту кривую с тем, что я получаю здесь. Положение и скорость правильны. – toshiomagic

ответ

0

Следующий код является решением. Я сидел на этом некоторое время, просто забыл ответить на вопрос.

while p < pf 
    vel(i) = real(sqrt(vel(i-1).^2 + 2 .* ((acc(i)+acc(i-1))./2) .* (pos(i)-pos(i-1)))); 
    time(i) = time(i-1) + (pos(i)-pos(i-1)) ./ ((vel(i)+vel(i-1))./2); 
    i = i + 1; 
end 

Функция время происходит от перестройки

d = (vi+vf)*t/2 

модифицированной для массива значений положения.