7

制御ループが高周波で実行されており、サイクルごとに平方根を計算する必要があります。一般的な平方根関数は正常に機能しますが、時間がかかりすぎます。私が取っている平方根の値は各サイクルであまり変化しないので、収束して正しい結果を追跡する反復平方根を見つけたいと思います。このようにして、多くではなく、各タイムステップで単一の反復を実行できます。

問題は、入力が変更されているときに、私が見たすべての反復平方根法がおそらく失敗することです。特に、入力がゼロになり、その後再び増加すると問題が発生するようです。メソッドは、ゼロの推測から開始することを好みません。

私の入力範囲は0〜4.5で、0.01前後の精度が必要なので、0.01のインクリメント/デクリメントを使用すると時間がかかりすぎる可能性があります。ほとんどの場合、10サイクル以下で収束する必要があります。

参考までに、16/32ビットの固定小数点を使用しています。入力は16ビットq12です。マイクロコントローラー上にあるので、ルックアップテーブルに1Kを使用することに興味はありません。コードもSimulinkモデルから生成され、それらのテーブルルックアップ関数はかなりオーバーヘッドでいっぱいです。

これに対する良い解決策はありますか?

4

4 に答える 4

5

0 ~ 4.5 の範囲はかなり小さいです。0.01 の精度では、450 の可能な計算しかありません。コンパイル時にそれらすべてを定数として計算し、実行時に検索するだけです。

于 2012-04-12T14:15:54.407 に答える
2

2次のテイラー展開を試してみたところsqrt(x)、次の結果になりました

もしy=sqrt(x)あなたがすでに知っているならy_c = sqrt(x_c)

t = x-3*x_c;
y = (12*x_c*x_c-t*t)/(8*y_c*y_c*y_c);

大きいほどx近似が良好です。x_c=0.01との最悪の場合x=0.02の結果は0.1375、実際の結果に対して、sqrt(0.02)=0.1414またはその差が の0.0039下にあり0.01ます。

でコードをテストしたところC#、 に対して安定した33%スピードアップが見られましたMath.Sqrt()

于 2012-04-12T14:37:43.097 に答える
2

扱っている範囲が事前にわかっている場合は、ルックアップ テーブルを使用することをお勧めします。配列またはハッシュ テーブル (使用している言語に応じて) を必要な精度レベルで生成し、ルートが必要なときにこれを参照します。

于 2012-04-12T14:18:11.367 に答える
1

ハレー法のワンショットを使用できます。立方収束があるため、値がわずかに移動する場合は非常に正確である必要があります。

x_{n+1} = x_n * (x_n^2 + 3Q) / (3 x_n^2 + Q)

これは、立方体的にに収束しsqrt(Q)ます。

参照: http: //www.mathpath.org/Algor/squareroot/algor.square.root.halley.htm

于 2012-04-26T20:15:56.867 に答える