0

おそらくこれはプログラミングの問題ではなく、数学の問題です。しかし、ここに行きます。

車両のモーターで動くジェット コースターを作っていると想像してください。車両には、このモーターを使用して達成できる固定力値があります。ジェット コースターのセクションで、私のお気に入りのビデオ ゲームの 1 つである Rollercoaster Tycoon のようなハーフ ループを横断したいとします。

Rollercoaster Tycoon の古き良きハーフ ループ

ハーフ ループを 1 周すると、自分の速度がどのくらいになるか、1 周するのにどれくらいの時間がかかるかわかりません。ただし、エンジンの加速度、質量、および重力による加速度に基づいて、ハーフ ループに沿った任意のポイントで可能な最大加速度が何であるかを把握できます。この議論を数値でごちゃごちゃにするのはやめましょう。代わりに、加速度と位置の曲線が利用可能であると仮定します。次のようになります。

ここに画像の説明を入力

加速度対位置曲線と初期速度の関数として、速度の式を導き出すことに成功しました。運動方程式から

v^2 = 2*a*p

位置の関数として速度を導き出すことができます。v = sqrt(2 * [a=f(p) wrt位置の積分])

MATLAB では、次のようにして取得できます。

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

今、私はジレンマに達しています。加速度、速度、位置がありますが、今は時間が必要です。私の計算は正しいと思います。私は 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 次式です。他の 2 つはもっと単純に見えます。式 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 に変換していますか?

4

1 に答える 1