2016-06-01 2 views
0

Peut-être que ce n'est pas une question de programmation mais une question mathématique. Mais voilà. Imaginez que vous faites des montagnes russes alimentées par un moteur sur le véhicule. Les véhicules ont une valeur de force fixe qu'ils peuvent atteindre en utilisant ce moteur. Dans une section de vos montagnes russes, vous voulez traverser une demi-boucle comme celle-ci d'un de mes jeux vidéo préférés: Rollercoaster Tycoon!Conversion d'équations cinématiques en Matlab

A good old half loop from Rollercoaster Tycoon

Comme vous allez autour de la demi-boucle, vous ne savez pas ce que votre vitesse sera ou combien de temps il vous faudra pour en faire le tour. Cependant, vous pouvez déterminer, en fonction de l'accélération, de la masse et de l'accélération du moteur en fonction de la gravité, quelle sera votre accélération maximale possible à n'importe quel point de la demi-boucle. Ne confondons pas cette discussion avec les chiffres, mais supposons plutôt que nous avons la courbe accélération/position disponible. Il ressemble à ceci:

enter image description here

I ont dérivé avec succès la formule de la vitesse en fonction de l'accélération vs courbe de position et de la vitesse initiale. A partir de l'équation cinématique

v^2 = 2*a*p 

Je peux dériver la vitesse en fonction de la position. v = sqrt (2 * [intégrale a = f (p) de la position de WRT])

qui MATLAB® je peux obtenir en faisant:

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

Je reçois effectivement la vitesse de chaque point le long la piste avec le code suivant (acc et pos sont des tableaux de l'accélération en fonction position calculée ci-dessus):

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 

maintenant, j'atteint mon dilemme. J'ai l'accélération, la vélocité et la position, et maintenant j'ai besoin de temps. Je pense que mes calculs sont corrects. Puisque j'ai un/v/p il devrait simplement être aussi simple que de choisir l'une des équations cinématiques impliquant le temps et de le réarranger pour obtenir le temps (je veux obtenir le temps à chaque position le long de la piste pour tracer un/v/p en fonction du temps).

Cela devrait signifier que je peux choisir parmi l'un de ces:

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 

équation 1 est un second degré. Les deux autres ont l'air beaucoup plus simple. L'équation 2 semble prometteuse. Essayons ça.

t = (v_f - v_i)/a 

La conversion de ce à Matlab, je pense qu'il devrait être le suivant:

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 

Mais si loin de mes tests, ce produit un résultat incorrect! Je suis perplexe à la fois sur les mathématiques et l'algorithme. Mais je suppose que cet endroit est simplement pour répondre à la question sur l'algorithme. Je ne peux pas voir comment ma formule serait incorrecte. Est-ce que je le convertis incorrectement en Matlab?

+0

Je suis assez sûr que ce n'est en effet pas une question de programmation. Je pense que votre question serait mieux adaptée dans la section Physique de Stack Exchange. Comment avez-vous vérifié votre résultat en passant? Comment savez-vous que c'est faux? – tvo

+0

Je ne crois pas que la physique ou la programmation soient correctes. Je m'attends à voir des formules de Seret-Frenet pour les équations du mouvement le long d'une courbe. Il devrait y avoir des quantités vectorielles, puisque les déplacements, les vitesses et les accélérations sont tous des vecteurs. C'est faux du début à la fin. – duffymo

+0

Ce n'est pas faux du début à la fin. Je crée une courbe en utilisant des pas de temps constants et ma courbe d'accélération en fonction de la position. Je fais correspondre cette courbe à ce que je reçois ici. La position et la vitesse sont correctes. – toshiomagic

Répondre

0

Le code suivant est la solution. J'ai été assis dessus pendant un certain temps, j'ai juste oublié de répondre à la question.

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 

La fonction temporelle provient d'un réarrangement de

d = (vi+vf)*t/2 

modifié pour un tableau de valeurs de position.