おそらく、これはプログラミングの問題ではなく、数学の問題です。しかし、ここに行く。キネマティクス方程式をMatlabに変換する
車のモーターで動くジェットコースターを作っているとします。車両は、このモーターを使用して達成できる一定の力の値を持っています。あなたのローラーコースターのセクションで、私の好きなビデオゲームの1つであるこのようなハーフループを横断したいと思っています:Rollercoaster Tycoon!
あなたは半分ループの周りに行くと、あなたの速度は、それはそれを一周する行くことができますどのくらいあるか、どうなるかわかりません。しかし、ハーフループに沿った任意のポイントでの最大加速度が重力のためにエンジンの加速、質量、加速に基づいて計算できます。この議論を数値で混乱させてはいけませんが、代わりに、加速度と位置の曲線を利用できると仮定します。それは次のようになります。
は私が正常位置曲線と初期速度対加速の関数としての速度のための式を導出しました。
v^2 = 2*a*p
動方程式から私は位置の関数としての速度を導出することができます。 MATLABに私が行うことによって得ることができ、V =のSQRT(2 * [= F(P)WRT位置の整数])
:
v = sqrt(2.*abs(trapz(pos, acc)));
私は実際に沿ったすべての点の速度を取得しています次のコードのトラック(accとposは、上にプロットされた加速度と位置の配列です):
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
今私はジレンマに達します。私は加速、速度、位置があり、今は時間が必要です。私の数学は正しいと思います。私は/ v/pを持っているので、時間を伴うキネマティックな方程式を選択して時間を得るために並べ替えるだけで簡単です(トラックに沿ったすべての位置で時間を取得したいので、/ 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つははるかに簡単に見えます。方程式2は有望に見える。それを試してみましょう。 Matlabのにこれを変換する
t = (v_f - v_i)/a
、私はそれがこのされるべきだと思う:
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に間違って変換していますか?
これは実際にプログラミングに関する質問ではないと確信しています。あなたの質問は、スタックエクスチェンジのフィジックスセクションでより適切になると思います。途中で結果をどのように確認しましたか?それが間違っていることをどのように知っていますか – tvo
私は物理学またはプログラミングが正しいとは思わない。私は曲線に沿った運動方程式のSeret-Frenet公式を見ることを期待しています。変位、速度および加速度はすべてベクトルであるため、ベクトル量が必要です。これは最初から最後まで間違っています。 – duffymo
これは最初から最後まで間違っているわけではありません。私は一定の時間ステップと私の加速vs位置曲線を使用して曲線を作成します。私はこの曲線を私がここに来ているものにマッチさせる。位置と速度は正しいです。 – toshiomagic