1

Cでクロソイドの値をリアルタイムで計算するという問題に直面しています。

最初に、Matlab コーダーを使用して、フレネル式の quadgk-integrator 用に自動生成された C コードを取得しようとしました。これは基本的に、私のテストシナリオでうまく機能します。唯一の問題は、実行速度が非常に遅いことです (Matlab および自動生成コードで)。

もう 1 つのオプションは、サンプル ポイントを直線で結ぶ単位クロソイドのデータ テーブルを補間することでした (線形補間)。曲率の​​わずかな変化 (クロソイドに沿った小さなステップ) だけで、結果が明らかに線に劣化していることがわかった後、私はあきらめました。驚いた...

円は別の式を使用してプロットされる可能性があることは知っていますが、実際のシナリオでは曲率の小さな変化に遭遇することが多く、見出し 0° と 360° の間の 30k のサンプリング ポイントでは、私の問題に対して十分な角度分解能が得られませんでした。

次に、R = inf ポイントの周りでテイラー近似を試みました。これは、必要なすべての場所で大きな曲率が得られることを期待しています。多項式がすぐに不安定になるため (おそらく、倍精度 fp 計算の数値の不正確さが原因で)、4 項 (15 乗) を超える項を使用できないことにすぐに気付きました。したがって、t 値が大きいと、明らかに精度が急速に低下します。そして、「大きな t 値」とは、曲率がゼロの点に対して 90° を超える曲線を表すクロソイド上のすべての点のことです。

たとえば、R=150m から R=125m までの道路を 90° 曲がりながら評価する場合、有効な近似の範囲外になります。代わりに、204.5° ~ 294.5° の範囲にいますが、テイラー限界は単位クロソイドの約 90° になります。

私は今、ランダムに物事を試してみました。つまり、そのトピックについて見つけた何十もの論文に時間を費やすことができるということです. または、上記の方法のいくつかを改善または組み合わせることもできます。おそらく、Matlab には、Coder と互換性があり、十分に高速な統合関数が存在することさえあります。

この問題は非常に基本的なものであり、私にはそれほど問題を解決する必要はないと感じています。何か提案はありますか?

4

2 に答える 2

1

テイラー級数の 4 つの項について - もっと多くの用語を使用できるはずです。doubles を使用すると、2pi の合計シータは確かに実行可能です。

完全な式に従って、完全な階乗と検出力の値を計算して、各項を個別に計算している可能性があります。これが、精度が非常に速く失われる理由です。

代わりに、前の項から次の項へと段階的に項を計算します。シリーズの前の項に対する次の項の比率の式を見つけて、それを使用します。

精度を上げるthetaには、距離ではなく計算しないでくださいs(スケーリングで精度を失わないようにするため)。

あなたの例は非常に平らなクロソイドです。私が間違いを犯していなければ、(25/22) pi =~ 204.545°(36/22) pi =~ 294.545° のようになります (これらの詳細を質問に含めてみませんか?)。それでも大丈夫なはずです。、完全な円 (およびその 2 倍) でさえ2 pi = 360°、問題を引き起こさないはずです。

given: r = 150 -> 125,  90 degrees turn :

  r s = A^2 = 150 s = 125 (s+x)  

  =>  1+(x/s) = 150/125 = 1 + 25/125       x/s = 1/5  

  theta = s^2/2A^2 = s^2 / (300 s) = s / 300  ;   = (pi/2) * (25/11)  = 204.545°
  theta2 = (s+x)^2/(300 s) = (6/5)^2 s / 300  ;   = (pi/2) * (36/11)  = 294.545°
  theta2 - theta = ( 36/25 - 1 ) s / 300 == pi/2

  =>  s = 300 * (pi/2) * (25/11) = 1070.99749554    x = s/5 = 214.1994991

      A^2 = 150 s = 150 * 300 * (pi/2) * (25/11) 

      a = sqrt (2 A^2) = 300 sqrt ( (pi/2) * (25/11) ) = 566.83264608

基準点は r = 無限大で、シータ = 0 です。

x = a INT[u=0..(s/a)] cos(u^2) d(u)wherea = sqrt(2 r s)とがありtheta = (s/a)^2ます。のテイラー級数を書き出し、cosそれを項ごとに積分して、 のテイラー近似を曲線に沿った 0 点からのx距離の関数として取得します。sそれで全部です。

次に、クロソイドに沿ってポイントを計算する密度を決定する必要があります。最小半径 125 の場合、弦の上の望ましい許容値から見つけることができます。したがって、これらの点は、連続する点の間に引かれた線分によって曲線の近似を定義します。

于 2015-04-15T14:32:42.857 に答える