phk*_*ler 7 iteration math estimation approximation sqrt
我有一个高频运行的控制回路,需要在每个周期计算一个平方根.典型的平方根函数工作正常但需要花费过多时间.由于我采用平方根的值在每个周期上没有太大变化,我想找到一个迭代的平方根,它将收敛然后跟踪正确的结果.这样我就可以在每个时间步进行一次迭代,而不是很多次迭代.
问题是,当输入发生变化时,我看到的所有迭代平方根方法都可能会失败.特别是当输入变为零然后再次增加时,看起来会出现问题 - 方法不喜欢从零开始猜测.
我的输入范围是0-4.5,我需要大约0.01精密所以用的0.01递增/递减可能需要的时间太长了 - 我想这主要是在10次以内收敛.
仅供参考我使用16/32bit定点输入为16bit q12.它在微控制器上,所以我对使用1K查找表不感兴趣.代码也是从simulink模型生成的,它们的表查找功能相当充满了开销.
有一个很好的解决方案吗?
您可以使用哈雷法的一击。它具有三次收敛性,因此如果值略有移动,它应该相当精确:
x_{n+1} = x_n * (x_n^2 + 3Q) / (3 x_n^2 + Q)
Run Code Online (Sandbox Code Playgroud)
这三次收敛到sqrt(Q)。
参考: http: //www.mathpath.org/Algor/squareroot/algor.square.root.halley.htm