坐标旋转数字计算法(Coordinate Rotation Digital Computer, CORDIC)

介绍CORDIC基本原理及应用。CORDIC为RTL解决三角函数,反三角函数,对数函数,指数函数等函数提供了解决方案。这些函数也可通过查找表法解决,但是CORDIC比查找表法更省面积和资源,耗时也更长。

cordic算法详解
CORDIC算法详解(一)-CORDIC 算法之圆周系统之旋转模式
《CORDIC v6.0LogiCORE IP Product GuideVivado Design SuitePG105 August 6, 2021》
CORDIC算法基本原理
三角函数计算,Cordic 算法入门


1. CORDIC原理

首先明确,CORDIC本质上解决的是一类近似的问题。其基本问题是:直角坐标系 x O y xOy xOy下,任意一点 P 0 = ( x 0 , y 0 ) P_0=(x_0,y_0) P0=(x0,y0),将 O P 0 ⃗ \vec{OP_0} OP0 按照某种仿射变换 [ x s , y s ] T = f ( θ ) ⋅ [ x 0 , y 0 ] [x_s,y_s]^T=f(\theta)·[x_0,y_0] [xs,ys]T=f(θ)[x0,y0]得到 O P s ⃗ = ( x s , y s ) \vec{OP_s}=(x_s,y_s) OPs =(xs,ys)。将该变换通过RTL实现

在这里插入图片描述

RTL的限制在于只能使用位操作和加法,无法使用乘除、三角函数的组合逻辑,所以需要一种近似求解的方法。

CORDIC算法可以解决该问题,非常类似于逐次逼近的思想,CORDIC的基本思想是:将放射变换 [ x s , y s ] T = f ( θ ) ⋅ [ x 0 , y 0 ] [x_s,y_s]^T=f(\theta)·[x_0,y_0] [xs,ys]T=f(θ)[x0,y0]看作是 多次子变换 f i ( θ i ) f_i(\theta_i) fi(θi)的叠加,其中 ∣ θ i ∣ |\theta_i| θi单调递减。当迭代的次数足够多,就越接近 O P s ⃗ \vec{OP_s} OPs

即,CORDIC的遵循的定理就是: lim ⁡ n → + ∞ ∏ i = 0 n [ f i ( θ i ) ] = f ( θ ) \lim\limits_{n\to+\infty} \prod_{i=0}^n[f_i(\theta_i)]=f(\theta) n+limi=0n[fi(θi)]=f(θ)成立

2. 圆周系统

若CORDIC基本问题中 O P 0 ⃗ \vec{OP_0} OP0 O P s ⃗ \vec{OP_s} OPs 模长不变,那么就是圆周系统上的CORDIC问题。变换如下

[ x s y s ] = ( c o s θ − s i n θ s i n θ c o s θ ) [ x 0 y 0 ] (2.1) \left[\begin{array}{lcr} x_s\\ y_s \end{array}\right] =\left(\begin{array}{lcr} cos\theta & -sin\theta\\ sin\theta & cos\theta \end{array}\right) \left[\begin{array}{lcr} x_0\\y_0 \end{array}\right] \tag{2.1} [xsys]=(cosθsinθsinθcosθ)[x0y0](2.1)

( 2.1 ) (2.1) (2.1)的变换是具备几何意义的,等价于坐标系下的向量旋转,旋转角度就是 θ \theta θ,若为逆时针旋转 θ > 0 \theta>0 θ>0,若为顺时针旋转 θ < 0 \theta<0 θ<0
在这里插入图片描述

上述坐标旋转公式可在圆坐标系下证明,记 α 0 \alpha_0 α0为x轴正半轴逆时针旋转至 O P 0 ⃗ \vec{OP_0} OP0 旋转的角度, α s \alpha_s αs为x轴正半轴逆时针旋转至 O P s ⃗ \vec{OP_s} OPs 旋转的角度,则有 α s = α 0 + θ \alpha_s=\alpha_0+\theta αs=α0+θ,再使用三角形角度关系证明。

根据CORDIC原理,迭代过程的几何意义就是多次子旋转,如下图所示, O P 0 ⃗ → O P 1 ⃗ → O P 2 ⃗ → O P 3 ⃗ → O P 4 ⃗ ≈ O P s ⃗ \vec{OP_0}→\vec{OP_1}→\vec{OP_2}→\vec{OP_3}→\vec{OP_4}≈\vec{OP_s} OP0 OP1 OP2 OP3 OP4 OPs 。若累计旋转后的角度小于 θ \theta θ,那么下次旋转就逆时针转。若累计旋转的角度大于 θ \theta θ,那么下次旋转就顺时针转

在这里插入图片描述

之后就可以迭代求解了,根据 ( 2.1 ) (2.1) (2.1)我们有:

[ x i + 1 y i + 1 ] = c o s ( θ i ) [ 1 − t a n ( θ i ) t a n ( θ i ) 1 ] [ x i y i ] , i = 0 , . . . , n (2.2) \left[\begin{array}{lcr} x_{i+1}\\ y_{i+1} \end{array}\right] =cos(\theta_i)\left[\begin{array}{lcr} 1 & -tan(\theta_i)\\ tan(\theta_i) & 1 \end{array}\right] \left[\begin{array}{lcr} x_i\\y_i \end{array}\right], i=0,...,n \tag{2.2} [xi+1yi+1]=cos(θi)[1tan(θi)tan(θi)1][xiyi],i=0,...,n(2.2)

其中,将三角函数转化为RTL中位移,则有

θ i = d i ⋅ a r c t a n ( 1 2 i ) ,     d i = { − 1 , ( θ 0 + . . . + θ i ) > θ 1 , e l s e \theta_i=d_i·arctan(\frac{1}{2^{i}}), \ \ \ \begin{split} d_i= \left \{ \begin{array}{ll} -1, & (\theta_0+...+\theta_i)>\theta\\ 1, & else\\ \end{array} \right. \end{split} θi=diarctan(2i1),   di={1,1,(θ0+...+θi)>θelse

● 根据旋转的几何意义,子旋转的叠加就等价于直接旋转。 ∑ i = 0 n ( θ i ) \sum_{i=0}^n(\theta_i) i=0n(θi)的边界决定着 θ \theta θ的取值范围,即 θ ≈ ∑ i = 0 n ( θ i ) ∈ ( − ∑ i = 0 ∞ [ a r c t a n ( 1 2 i ) ] , ∑ i = 0 ∞ [ a r c t a n ( 1 2 i ) ] ) ≈ ( − 99.8829 ° , 99.8829 ° ) \theta≈\sum_{i=0}^n(\theta_i) \in (-\sum_{i=0}^∞[arctan(\frac{1}{2^{i}})],\sum_{i=0}^∞[arctan(\frac{1}{2^{i}})])≈(-99.8829°,99.8829°) θi=0n(θi)(i=0[arctan(2i1)],i=0[arctan(2i1)])(99.8829°,99.8829°)

● 若 ∑ j = 0 1 ( θ i ) = θ \sum_{j=0}^{1}(\theta_i)=\theta j=01(θi)=θ,则 d i ≠ 0 d_i≠0 di=0。这是因为 d i = 0 d_i=0 di=0会导致 x i + 1 x_{i+1} xi+1 y i + 1 y_{i+1} yi+1停止迭代,角度对了但是幅值错误。


于是将 ( 2.2 ) (2.2) (2.2)多次迭代可以得到 ( 2.3 ) (2.3) (2.3),将 c o s θ i cos\theta_i cosθi连乘放在一起,其余的部分就可以使用RTL进行迭代了。

[ x n y n ] = ∏ i = 0 n − 1 c o s ( θ i ) ⋅ ( ∏ i = 0 n − 1 ( 1 − d i 2 i d i 2 i 1 ) [ x 0 y 0 ] ) = ∏ i = 0 n − 1 c o s ( θ i ) ⋅ [ x ^ n y ^ n ] = ∏ i = 0 n − 1 c o s ( θ i ) ⋅ ( 1 − d n − 1 ⋅ 1 2 n − 1 d n − 1 ⋅ 1 2 n − 1 1 ) ⋅ [ x ^ n − 1 y ^ n − 1 ] (2.3) \left[\begin{array}{lcr} x_{n}\\ y_{n} \end{array}\right] =\prod_{i=0}^{n-1} cos(\theta_i)· \left(\prod_{i=0}^{n-1}\left(\begin{array}{lcr} 1 & -\frac{d_i}{2^{i}}\\ \frac{d_i}{2^{i}} & 1 \end{array}\right) \left[\begin{array}{lcr} x_0\\y_0 \end{array}\right]\right) =\prod_{i=0}^{n-1} cos(\theta_i)·\left[\begin{array}{lcr} \hat{x}_{n}\\ \hat{y}_{n} \end{array}\right] \\ =\prod_{i=0}^{n-1} cos(\theta_i)·\left(\begin{array}{lcr} 1 & -d_{n-1}·\frac{1}{2^{n-1}}\\ d_{n-1}·\frac{1}{2^{n-1}} & 1 \end{array}\right)·\left[\begin{array}{lcr} \hat{x}_{n-1}\\ \hat{y}_{n-1} \end{array}\right] \tag{2.3} [xnyn]=i=0n1cos(θi)(i=0n1(12idi2idi1)[x0y0])=i=0n1cos(θi)[x^ny^n]=i=0n1cos(θi)(1dn12n11dn12n111)[x^n1y^n1](2.3)

那么 ∏ i = 0 n − 1 c o s ( θ i ) = ∏ i = 0 n − 1 c o s [ a r c t a n ( 1 2 i ) ] \prod_{i=0}^{n-1} cos(\theta_i)=\prod_{i=0}^{n-1} cos[arctan(\frac{1}{2^{i}})] i=0n1cos(θi)=i=0n1cos[arctan(2i1)]是多少呢,看下表可知,当n越来越大时 ∏ i = 0 n − 1 c o s ( θ i ) \prod_{i=0}^{n-1} cos(\theta_i) i=0n1cos(θi)越来越趋近于一个定值 0.607253,所以如果迭代的次数足够多,可以直接用这个定值。

在这里插入图片描述

2.1. 迭代算法

综上所述,CORDIC解算过程为:输入为 ( x 0 , y 0 , θ ∈ ( − 0.554905 π , 0.554905 π ) , n ) (x_0,y_0,\theta \in (-0.554905\pi,0.554905\pi),n) (x0,y0,θ(0.554905π,0.554905π),n),基于迭代公式 ( 2.4 ) ( 2.5 ) ( 2.6 ) ( 2.7 ) (2.4)(2.5)(2.6)(2.7) (2.4)(2.5)(2.6)(2.7),可得到输出 ( x n , y n , △ α n ) (x_n,y_n,△α_n) (xn,yn,αn)

[ x ^ i + 1 y ^ i + 1 ] = ( 1 − d i ⋅ 1 2 i d i ⋅ 1 2 i 1 ) ⋅ [ x ^ i y ^ i ] , [ x ^ 0 y ^ 0 ] = [ x 0 x 0 ] (2.4) \left[\begin{array}{lcr} \hat{x}_{i+1}\\ \hat{y}_{i+1} \end{array}\right] =\left(\begin{array}{lcr} 1 & -d_{i}·\frac{1}{2^{i}}\\ d_{i}·\frac{1}{2^{i}} & 1 \end{array}\right)·\left[\begin{array}{lcr} \hat{x}_{i}\\ \hat{y}_{i} \end{array}\right], \left[\begin{array}{lcr} \hat{x}_0\\ \hat{y}_0 \end{array}\right]=\left[\begin{array}{lcr} x_0\\ x_0 \end{array}\right] \tag{2.4} [x^i+1y^i+1]=(1di2i1di2i11)[x^iy^i],[x^0y^0]=[x0x0](2.4)

△ α i + 1 = △ α i + d i ⋅ a r c t a n ( 1 2 i ) , △ α 0 = 0 (2.5) △α_{i+1}=△α_{i}+d_{i}·arctan(\frac{1}{2^{i}}), △α_0=0 \tag{2.5} αi+1=αi+diarctan(2i1),α0=0(2.5)

d i + 1 = { − 1 , △ α i + 1 > θ 1 , e l s e , d 0 = s i g n ( θ ) (2.6) \begin{split} d_{i+1}= \left \{ \begin{array}{ll} -1, & △α_{i+1}>\theta\\ 1, & else\\ \end{array} \right. \end{split},d_0=sign(\theta) \tag{2.6} di+1={1,1,αi+1>θelse,d0=sign(θ)(2.6)

[ x n y n ] = 0.607253 ⋅ [ x ^ n y ^ n ] (2.7) \left[\begin{array}{lcr} x_{n}\\ y_{n} \end{array}\right] =0.607253·\left[\begin{array}{lcr} \hat{x}_{n}\\ \hat{y}_{n} \end{array}\right] \tag{2.7} [xnyn]=0.607253[x^ny^n](2.7)

其中 n n n为迭代次数, △ α i △α_{i} αi用于记录向量实际旋转角度的累计值,用该值判断应该旋转方向。

预旋转

从上述算法可以看到,只有在 θ ∈ ( − 0.554905 π , 0.554905 π ) \theta \in (-0.554905\pi,0.554905\pi) θ(0.554905π,0.554905π)时才能收敛,那么如何覆盖 [ − π , π ] [-\pi,\pi] [π,π]区间呢?转两次

即,若 ∣ θ ∣ ≤ π 2 |\theta|≤\frac{\pi}{2} θ2π直接用上述算法旋转即可,若 ∣ θ ∣ > π 2 |\theta|>\frac{\pi}{2} θ>2π先作 ∣ θ ∣ = ∣ π 2 ∣ |\theta|=|\frac{\pi}{2}| θ=2π一次预旋转,再作 ∣ θ − π 2 ∣ |\theta-\frac{\pi}{2}| θ2π旋转。

预旋转如下

[ x p r e y p r e ] = ( c o s ( π 2 ) − s i n [ s i g n ( θ ) ⋅ π 2 ] s i n [ s i g n ( θ ) ⋅ π 2 ] c o s ( π 2 ) ) [ x 0 y 0 ] = ( 0 − s i g n ( θ ) s i g n ( θ ) 0 ) [ x 0 y 0 ] , ∣ θ ∣ > π 2 \left[\begin{array}{lcr} x_{pre}\\ y_{pre} \end{array}\right] =\left(\begin{array}{lcr} cos(\frac{\pi}{2}) & -sin[sign(\theta)·\frac{\pi}{2}]\\ sin[sign(\theta)·\frac{\pi}{2}] & cos(\frac{\pi}{2}) \end{array}\right) \left[\begin{array}{lcr} x_0\\y_0 \end{array}\right]=\left(\begin{array}{lcr} 0 & -sign(\theta)\\ sign(\theta) & 0 \end{array}\right) \left[\begin{array}{lcr} x_0\\y_0 \end{array}\right] ,|\theta|>\frac{\pi}{2} [xpreypre]=(cos(2π)sin[sign(θ)2π]sin[sign(θ)2π]cos(2π))[x0y0]=(0sign(θ)sign(θ)0)[x0y0],θ>2π

进而重新得到圆周系统下CORDIC算法:

CORDIC解算过程为:输入为 ( x 0 , y 0 , θ ∈ ( − π , π ) , n ) (x_0,y_0,\theta \in (-\pi,\pi),n) (x0,y0,θ(π,π),n),基于迭代公式 ( 2.8 ) ( 2.9 ) ( 2.10 ) ( 2.11 ) ( 2.12 ) (2.8)(2.9)(2.10)(2.11)(2.12) (2.8)(2.9)(2.10)(2.11)(2.12),可得到输出 ( x n , y n , △ α n ) (x_n,y_n,△α_n) (xn,yn,αn)

[ x ^ i + 1 y ^ i + 1 ] = ( 1 − d i ⋅ 1 2 i d i ⋅ 1 2 i 1 ) ⋅ [ x ^ i y ^ i ] , [ x ^ 0 y ^ 0 ] = [ x p r e y p r e ] , i = 0 , . . . , n − 1 (2.8) \left[\begin{array}{lcr} \hat{x}_{i+1}\\ \hat{y}_{i+1} \end{array}\right] =\left(\begin{array}{lcr} 1 & -d_{i}·\frac{1}{2^{i}}\\ d_{i}·\frac{1}{2^{i}} & 1 \end{array}\right)·\left[\begin{array}{lcr} \hat{x}_{i}\\ \hat{y}_{i} \end{array}\right], \left[\begin{array}{lcr} \hat{x}_0\\ \hat{y}_0 \end{array}\right]=\left[\begin{array}{lcr} x_{pre}\\ y_{pre} \end{array}\right],i=0,...,n-1 \tag{2.8} [x^i+1y^i+1]=(1di2i1di2i11)[x^iy^i],[x^0y^0]=[xpreypre],i=0,...,n1(2.8)

[ x p r e y p r e ] = { [ − s i g n ( θ ) ⋅ y 0 s i g n ( θ ) ⋅ x 0 ] , ∣ θ ∣ > π 2 [ x 0 y 0 ] , e l s e (2.9) \begin{split} \left[\begin{array}{lcr} x_{pre}\\ y_{pre} \end{array}\right]= \left \{ \begin{array}{ll} \left[\begin{array}{lcr} -sign(\theta)·y_0\\ sign(\theta)·x_0 \end{array}\right], & |\theta|>\frac{\pi}{2} \\ \\ \left[\begin{array}{lcr} x_0\\y_0 \end{array}\right], & else\\ \end{array} \right. \end{split} \tag{2.9} [xpreypre]= [sign(θ)y0sign(θ)x0],[x0y0],θ>2πelse(2.9)

△ α i + 1 = △ α i + d i ⋅ a r c t a n ( 1 2 i ) , △ α 0 = △ α p r e = { s i g n ( θ ) ⋅ π 2 , ∣ θ ∣ > π 2 0 , e l s e (2.10) △α_{i+1}=△α_{i}+d_{i}·arctan(\frac{1}{2^{i}}), \begin{split} △α_0=△α_{pre}= \left \{ \begin{array}{ll} sign(\theta)·\frac{\pi}{2}, & |\theta|>\frac{\pi}{2} \\ \\ 0, & else\\ \end{array} \right. \end{split} \tag{2.10} αi+1=αi+diarctan(2i1),α0=αpre= sign(θ)2π,0,θ>2πelse(2.10)

d i + 1 = { − 1 , △ α i + 1 > θ 1 , e l s e , d 0 = s i g n ( θ ) (2.11) \begin{split} d_{i+1}= \left \{ \begin{array}{ll} -1, & △α_{i+1}>\theta\\ 1, & else\\ \end{array} \right. \end{split},d_0=sign(\theta) \tag{2.11} di+1={1,1,αi+1>θelse,d0=sign(θ)(2.11)

[ x n y n ] = 0.607253 ⋅ [ x ^ n y ^ n ] (2.12) \left[\begin{array}{lcr} x_{n}\\ y_{n} \end{array}\right] =0.607253·\left[\begin{array}{lcr} \hat{x}_{n}\\ \hat{y}_{n} \end{array}\right] \tag{2.12} [xnyn]=0.607253[x^ny^n](2.12)

其中 n n n为迭代次数, △ α i △α_{i} αi用于记录向量实际旋转角度的累计值,用该值判断应该旋转方向。

经python验证,上述算法正确

旋转模式—— y = c o s ( x ) y=cos(x) y=cos(x) and y = s i n ( x ) y=sin(x) y=sin(x)

预旋转算法中若令 P 0 ( x 0 = 1 , y 0 = 0 ) P_0(x_0=1,y_0=0) P0(x0=1,y0=0),就可以看作是从 P 0 P_0 P0旋转至某个向量,因此有

[ x s y s ] = ( c o s θ − s i n θ s i n θ c o s θ ) [ 1 0 ] = [ c o s θ d ⋅ s i n θ ] \left[\begin{array}{lcr} x_s\\ y_s \end{array}\right] =\left(\begin{array}{lcr} cos\theta & -sin\theta\\ sin\theta & cos\theta \end{array}\right) \left[\begin{array}{lcr} 1\\0 \end{array}\right] =\left[\begin{array}{lcr} cos\theta\\d·sin\theta \end{array}\right] [xsys]=(cosθsinθsinθcosθ)[10]=[cosθdsinθ]

可见旋转模式下 ( x s , y s ) (x_s,y_s) (xs,ys)恰好为正余弦函数,因此有正余弦函数的CORDIC解算过程为:令输入为 ( x 0 = 1 , y 0 = 0 , θ ∈ ( − π , π ) , n ) (x_0=1,y_0=0,\theta \in (-\pi,\pi),n) (x0=1,y0=0,θ(π,π),n),基于迭代公式 ( 2.8 ) ( 2.9 ) ( 2.10 ) ( 2.11 ) ( 2.12 ) (2.8)(2.9)(2.10)(2.11)(2.12) (2.8)(2.9)(2.10)(2.11)(2.12),输出就为 ( x n ≈ c o s ( θ ) , y n ≈ s i n ( θ ) , △ α n ≈ θ ) (x_n≈cos(\theta),y_n≈sin(\theta),△α_n≈\theta) (xncos(θ),ynsin(θ),αnθ)

2.2. 向量模式—— y = a r c t a n ( x ) y=arctan(x) y=arctan(x) and l = x 2 + y 2 l=\sqrt{x^2 + y^2} l=x2+y2

预旋转算法中,若要求 P 0 P_0 P0旋转至x轴正半轴,即令 θ = − a r c t a n [ y 0 x 0 ] \theta=-arctan[\frac{y_0}{x_0}] θ=arctan[x0y0],因此有

[ x s y s ] = ( c o s θ − s i n θ s i n θ c o s θ ) [ x 0 y 0 ] → [ x s y s ] = [ x 0 2 + y 0 2 0 ] \left[\begin{array}{lcr} x_s\\ y_s \end{array}\right] =\left(\begin{array}{lcr} cos\theta & -sin\theta\\ sin\theta & cos\theta \end{array}\right) \left[\begin{array}{lcr} x_0\\y_0 \end{array}\right] → \left[\begin{array}{lcr} x_s\\ y_s \end{array}\right] =\left[\begin{array}{lcr} \sqrt{x_0^2+y_0^2} \\0 \end{array}\right] [xsys]=(cosθsinθsinθcosθ)[x0y0][xsys]=[x02+y02 0]

既然是旋转至x正半轴,所以 θ = − a r c t a n [ y 0 x 0 ] \theta=-arctan[\frac{y_0}{x_0}] θ=arctan[x0y0]是已知的。但在RTL设计中,我们不能进行arctan运算,所以要在原算法上进行修改,不能出现 θ \theta θ

因此输入为 ( x 0 , y 0 , n ) (x_0,y_0,n) (x0,y0,n),基于迭代公式 ( 2.8 ) ( 2.13 ) ( 2.14 ) ( 2.15 ) ( 2.12 ) (2.8)(2.13)(2.14)(2.15)(2.12) (2.8)(2.13)(2.14)(2.15)(2.12),可得到输出 ( x n ≈ x 0 2 + y 0 2 , y n ≈ 0 , △ α n ≈ θ = − a r c t a n ( y 0 x 0 ) ) (x_n≈\sqrt{x_0^2+y_0^2},y_n≈0,△α_n≈\theta=-arctan(\frac{y_0}{x_0})) (xnx02+y02 ,yn0,αnθ=arctan(x0y0))

[ x p r e y p r e ] = { [ s i g n ( y 0 ) ⋅ y 0 − s i g n ( y 0 ) ⋅ x 0 ] , x 0 < 0 [ x 0 y 0 ] , e l s e (2.13) \begin{split} \left[\begin{array}{lcr} x_{pre}\\ y_{pre} \end{array}\right]= \left \{ \begin{array}{ll} \left[\begin{array}{lcr} sign(y_0)·y_0\\ -sign(y_0)·x_0 \end{array}\right], & x_0<0 \\ \\ \left[\begin{array}{lcr} x_0\\y_0 \end{array}\right], & else\\ \end{array} \right. \end{split} \tag{2.13} [xpreypre]= [sign(y0)y0sign(y0)x0],[x0y0],x0<0else(2.13)

△ α i + 1 = △ α i + d i ⋅ a r c t a n ( 1 2 i ) , △ α 0 = △ α p r e = { − s i g n ( y 0 ) ⋅ π 2 , x 0 < 0 0 , e l s e (2.14) △α_{i+1}=△α_{i}+d_{i}·arctan(\frac{1}{2^{i}}), \begin{split} △α_0=△α_{pre}= \left \{ \begin{array}{ll} -sign(y_0)·\frac{\pi}{2}, & x_0<0 \\ \\ 0, & else\\ \end{array} \right. \end{split} \tag{2.14} αi+1=αi+diarctan(2i1),α0=αpre= sign(y0)2π,0,x0<0else(2.14)

d i + 1 = − s i g n ( y ^ i + 1 ) , d 0 = − s i g n ( y 0 ) (2.15) d_{i+1}=-sign(\hat{y}_{i+1}),d_0=-sign(y_0) \tag{2.15} di+1=sign(y^i+1),d0=sign(y0)(2.15)

3. 双曲系统

若CORDIC基本问题中,若遵循双曲旋转变换,那么就是双曲系统上的CORDIC问题。

[ x s y s ] = ( c o s h θ s i n h θ s i n h θ c o s h θ ) [ x 0 y 0 ] (3.1) \left[\begin{array}{lcr} x_s\\ y_s \end{array}\right] =\left(\begin{array}{lcr} cosh\theta & sinh\theta\\ sinh\theta & cosh\theta \end{array}\right) \left[\begin{array}{lcr} x_0\\y_0 \end{array}\right] \tag{3.1} [xsys]=(coshθsinhθsinhθcoshθ)[x0y0](3.1)

其中
c o s h x = e x + e − x 2 coshx=\frac{e^x+e^{-x}}{2} coshx=2ex+ex
s i n h x = e x − e − x 2 sinhx=\frac{e^x-e^{-x}}{2} sinhx=2exex
t a n h x = s i n h x c o s h x = e x − e − x e x + e − x tanhx=\frac{sinhx}{coshx}=\frac{e^x-e^{-x}}{e^x+e^{-x}} tanhx=coshxsinhx=ex+exexex
非常类似于三角函数,其他内容见详解双曲函数(对比三角函数推导)

需要说明的是双曲变换没有明显的几何意义, O P s ⃗ \vec{OP_s} OPs 并不是 O P 0 ⃗ \vec{OP_0} OP0 旋转 θ \theta θ的结果。实际上,我们并不care到底旋转了多少度,我们只关心子变换 f i ( θ i ) f_i(\theta_i) fi(θi)的表达式。

经过计算实际旋转角度为

θ h y p = a r c t a n [ t a n h ( θ ) ⋅ ( x 0 2 − y 0 2 ) x 0 2 + y 0 2 + 2 t a n h ( θ ) ⋅ x 0 y 0 ] (3.2) \theta_{hyp}=arctan[\frac{tanh(\theta)·(x_0^2-y_0^2)}{x_0^2+y_0^2+2tanh(\theta)·x_0y_0}] \tag{3.2} θhyp=arctan[x02+y02+2tanh(θ)x0y0tanh(θ)(x02y02)](3.2)

需要说明的是CORDIC算法详解(四)-CORDIC 算法之双曲系统及其数学应用中存在错误,(3.116)和(3.117)公式错误,不满足 y p / x p = t a n ( α ) y_p/x_p=tan(\alpha) yp/xp=tan(α),但(3.119)公式正确。

迭代求解如下,但注意,由于 a r c t a n h ( 1 ) = ∞ arctanh(1)=∞ arctanh(1)=所以双曲系统要求 i i i从1开始。

并且为了保证收敛性,每迭代到 i = 3 ⋅ k + 1 , k ∈ + Z i=3·k+1,k\in +\Z i=3k+1,k+Z时,该次迭代都要再重复一次,即 i = 1 , 2 , 3 , 4 , 4 , 5 , 6 , 7 , 7 , 8 , 9 , 10 , 10 , . . . i=1,2,3,4,4,5,6,7,7,8,9,10,10,... i=1,2,3,4,4,5,6,7,7,8,9,10,10,...,以此类推。

[ x i + 1 y i + 1 ] = c o s h ( θ i ) [ 1 t a n h ( θ i ) t a n h ( θ i ) 1 ] [ x i y i ] , i = 1 , 2 , 3 , 4 , 4 , 5 , 6 , 7 , 7 , . . . \left[\begin{array}{lcr} x_{i+1}\\ y_{i+1} \end{array}\right] =cosh(\theta_i)\left[\begin{array}{lcr} 1 & tanh(\theta_i)\\ tanh(\theta_i) & 1 \end{array}\right] \left[\begin{array}{lcr} x_i\\y_i \end{array}\right], i=1,2,3,4,4,5,6,7,7,... [xi+1yi+1]=cosh(θi)[1tanh(θi)tanh(θi)1][xiyi],i=1,2,3,4,4,5,6,7,7,...

其中

θ i = d i ⋅ a r c t a n h ( 1 2 i ) ,     d i = { − 1 , ( θ 1 + . . . + θ i ) > θ 1 , e l s e \theta_i=d_i·arctanh(\frac{1}{2^{i}}), \ \ \ \begin{split} d_i= \left \{ \begin{array}{ll} -1, & (\theta_1+...+\theta_i)>\theta\\ 1, & else\\ \end{array} \right. \end{split} θi=diarctanh(2i1),   di={1,1,(θ1+...+θi)>θelse

θ ≈ ∑ i = 0 n ( θ i ) ∈ ( − ∑ i = 0 ∞ [ a r c t a n h ( 1 2 i ) ] , ∑ i = 1 ∞ [ a r c t a n h ( 1 2 i ) ] ) ≈ ( − 1.0554693737354848 , 1.0554693737354848 ) (3.3) \theta≈\sum_{i=0}^n(\theta_i) \in (-\sum_{i=0}^∞[arctanh(\frac{1}{2^{i}})],\sum_{i=1}^∞[arctanh(\frac{1}{2^{i}})])≈(-1.0554693737354848,1.0554693737354848) \tag{3.3} θi=0n(θi)(i=0[arctanh(2i1)],i=1[arctanh(2i1)])(1.0554693737354848,1.0554693737354848)(3.3)

c o s h ( θ i ) cosh(\theta_i) cosh(θi)连乘放在一起,其余的部分就可以使用RTL进行迭代了。

[ x n y n ] = ∏ i = 1 n c o s h ( θ i ) ⋅ ( ∏ i = 1 n ( 1 d i 2 i d i 2 i 1 ) [ x 1 y 1 ] ) = ∏ i = 0 n − 1 c o s h ( θ i ) ⋅ [ x ^ n y ^ n ] = ∏ i = 1 n c o s h ( θ i ) ⋅ ( 1 d n − 1 ⋅ 1 2 n − 1 d n − 1 ⋅ 1 2 n − 1 1 ) ⋅ [ x ^ n − 1 y ^ n − 1 ] \left[\begin{array}{lcr} x_{n}\\ y_{n} \end{array}\right] =\prod_{i=1}^{n} cosh(\theta_i)· \left(\prod_{i=1}^{n}\left(\begin{array}{lcr} 1 & \frac{d_i}{2^{i}}\\ \frac{d_i}{2^{i}} & 1 \end{array}\right) \left[\begin{array}{lcr} x_1\\y_1 \end{array}\right]\right) =\prod_{i=0}^{n-1} cosh(\theta_i)·\left[\begin{array}{lcr} \hat{x}_{n}\\ \hat{y}_{n} \end{array}\right] \\ =\prod_{i=1}^{n} cosh(\theta_i)·\left(\begin{array}{lcr} 1 & d_{n-1}·\frac{1}{2^{n-1}}\\ d_{n-1}·\frac{1}{2^{n-1}} & 1 \end{array}\right)·\left[\begin{array}{lcr} \hat{x}_{n-1}\\ \hat{y}_{n-1} \end{array}\right] [xnyn]=i=1ncosh(θi)(i=1n(12idi2idi1)[x1y1])=i=0n1cosh(θi)[x^ny^n]=i=1ncosh(θi)(1dn12n11dn12n111)[x^n1y^n1]

那么 ∏ i = 1 n c o s h ( θ i ) = ∏ i = 1 n c o s h [ a r c t a n h ( 1 2 i ) ] \prod_{i=1}^{n} cosh(\theta_i)=\prod_{i=1}^{n} cosh[arctanh(\frac{1}{2^{i}})] i=1ncosh(θi)=i=1ncosh[arctanh(2i1)]也会越来越趋近于一个定值 1.205136358446461。迭代的次数足够多,可以直接用这个定值。

3.1. 迭代算法

综上所述,CORDIC解算过程为:输入为 ( x 0 , y 0 , θ ∈ ( − 1.0554693737354848 , 1.0554693737354848 ) , n ) (x_0,y_0,\theta \in (-1.0554693737354848,1.0554693737354848),n) (x0,y0,θ(1.0554693737354848,1.0554693737354848),n),基于迭代公式 ( 3.4 ) ( 3.5 ) ( 3.6 ) ( 3.7 ) (3.4)(3.5)(3.6)(3.7) (3.4)(3.5)(3.6)(3.7),可得到输出 ( x n , y n , △ α n ) (x_n,y_n,△α_n) (xn,yn,αn)

[ x ^ i + 1 y ^ i + 1 ] = ( 1 d i ⋅ 1 2 i d i ⋅ 1 2 i 1 ) ⋅ [ x ^ i y ^ i ] , [ x ^ 1 y ^ 1 ] = [ x 0 y 0 ] , i = 1 , 2 , 3 , 4 , 4 , . . . (3.4) \left[\begin{array}{lcr} \hat{x}_{i+1}\\ \hat{y}_{i+1} \end{array}\right] =\left(\begin{array}{lcr} 1 & d_{i}·\frac{1}{2^{i}}\\ d_{i}·\frac{1}{2^{i}} & 1 \end{array}\right)·\left[\begin{array}{lcr} \hat{x}_{i}\\ \hat{y}_{i} \end{array}\right], \left[\begin{array}{lcr} \hat{x}_1\\ \hat{y}_1 \end{array}\right]=\left[\begin{array}{lcr} x_0\\ y_0 \end{array}\right], i=1,2,3,4,4,... \tag{3.4} [x^i+1y^i+1]=(1di2i1di2i11)[x^iy^i],[x^1y^1]=[x0y0],i=1,2,3,4,4,...(3.4)

△ α i + 1 = △ α i + d i ⋅ a r c t a n h ( 1 2 i ) , △ α 1 = 0 (3.5) △α_{i+1}=△α_{i}+d_{i}·arctanh(\frac{1}{2^{i}}), △α_1=0 \tag{3.5} αi+1=αi+diarctanh(2i1),α1=0(3.5)

d i + 1 = { − 1 , △ α i + 1 > θ 1 , e l s e , d 0 = s i g n ( θ ) (3.6) \begin{split} d_{i+1}= \left \{ \begin{array}{ll} -1, & △α_{i+1}>\theta\\ 1, & else\\ \end{array} \right. \end{split},d_0=sign(\theta) \tag{3.6} di+1={1,1,αi+1>θelse,d0=sign(θ)(3.6)

[ x n y n ] = 1.205136358446461 ⋅ [ x ^ n y ^ n ] (3.7) \left[\begin{array}{lcr} x_{n}\\ y_{n} \end{array}\right] =1.205136358446461·\left[\begin{array}{lcr} \hat{x}_{n}\\ \hat{y}_{n} \end{array}\right] \tag{3.7} [xnyn]=1.205136358446461[x^ny^n](3.7)

其中 n n n为迭代次数, △ α i △α_{i} αi用于记录向量实际旋转角度的累计值,用该值判断应该旋转方向。

预旋转

双曲系统也是一样, θ \theta θ收敛范围未覆盖整个 R \R R区间,要使用CORDIC旋转,则要保证每一次CORDIC运算都使 θ \theta θ在式 ( 3.3 ) (3.3) (3.3)的范围内。否则会存在 θ \theta θ ∑ i = 0 ∞ [ d i ⋅ a r c t a n h ( 1 2 i ) ] \sum_{i=0}^∞[d_i·arctanh(\frac{1}{2^{i}})] i=0[diarctanh(2i1)]的递增误差。假设输入 θ = θ i n ∈ R \theta=\theta_{in} \in \R θ=θinR,有两种思路。

● 可以先作预旋转,给定一个 θ 0 \theta_0 θ0满足 ∣ θ 0 − θ i n ∣ < 1.0554693737354848 |\theta_0-\theta_{in}|<1.0554693737354848 θ0θin<1.0554693737354848,先使用 ( 3.1 ) (3.1) (3.1)完成一次 θ = θ 0 \theta=\theta_0 θ=θ0的预旋转,再完成一次 θ = s i g n ( θ i n ) ⋅ ∣ θ 0 − θ i n ∣ \theta=sign(\theta_{in})·|\theta_0-\theta_{in}| θ=sign(θin)θ0θin的CORDIC旋转。

但问题是 确定 θ 0 \theta_0 θ0后, c o s h ( θ 0 ) cosh(\theta_0) cosh(θ0) s i n h ( θ 0 ) sinh(\theta_0) sinh(θ0) 如何计算?要知道双曲三角函数不具备周期性,而且极限都是∞。所以对于RTL来说只能用查表法计算 c o s h ( θ 0 ) cosh(\theta_0) cosh(θ0) s i n h ( θ 0 ) sinh(\theta_0) sinh(θ0),那为何不直接查表计算 c o s h ( θ ) cosh(\theta) cosh(θ) s i n h ( θ ) sinh(\theta) sinh(θ)呢?

● 另一种思路是令 n c = θ 0 / 1.0554693737354848 n_c=\theta_0/1.0554693737354848 nc=θ0/1.0554693737354848,然后执行 n c n_c nc次CORDIC算法,这样耗时太大。

综上所述,双曲系统预旋转CORDIC算法并不适用于RTL实现。所以推荐使用查找表的方法实现相关函数

但本文依旧给出上述的第一种预旋转CORDIC算法:CORDIC解算过程为:输入为 ( x 0 , y 0 , θ ∈ R , n ) (x_0,y_0,\theta \in \R,n) (x0,y0,θR,n),基于迭代公式 ( 3.8 ) ( 3.9 ) ( 3.10 ) ( 3.11 ) ( 3.12 ) (3.8)(3.9)(3.10)(3.11)(3.12) (3.8)(3.9)(3.10)(3.11)(3.12),可得到输出 ( x n , y n , △ α n ) (x_n,y_n,△α_n) (xn,yn,αn)

[ x ^ i + 1 y ^ i + 1 ] = ( 1 d i ⋅ 1 2 i d i ⋅ 1 2 i 1 ) ⋅ [ x ^ i y ^ i ] , [ x ^ 1 y ^ 1 ] = [ x p r e y p r e ] , i = 1 , 2 , 3 , 4 , 4 , . . . (3.8) \left[\begin{array}{lcr} \hat{x}_{i+1}\\ \hat{y}_{i+1} \end{array}\right] =\left(\begin{array}{lcr} 1 & d_{i}·\frac{1}{2^{i}}\\ d_{i}·\frac{1}{2^{i}} & 1 \end{array}\right)·\left[\begin{array}{lcr} \hat{x}_{i}\\ \hat{y}_{i} \end{array}\right], \left[\begin{array}{lcr} \hat{x}_1\\ \hat{y}_1 \end{array}\right]=\left[\begin{array}{lcr} x_{pre}\\ y_{pre} \end{array}\right], i=1,2,3,4,4,... \tag{3.8} [x^i+1y^i+1]=(1di2i1di2i11)[x^iy^i],[x^1y^1]=[xpreypre],i=1,2,3,4,4,...(3.8)

[ x p r e y p r e ] = { [ c o s h ( k π 3 ) ⋅ x 0 + s i n h [ s i g n ( θ ) ⋅ k π 3 ] ⋅ y 0 s i n h [ s i g n ( θ ) ⋅ k π 3 ] ⋅ x 0 + c o s h ( k π 3 ) ⋅ y 0 ] , k π 3 < ∣ θ ∣ ≤ ( k + 1 ) π 3 , k ∈ + Z [ x 0 y 0 ] , e l s e (3.9) \begin{split} \left[\begin{array}{lcr} x_{pre}\\ y_{pre} \end{array}\right]= \left \{ \begin{array}{ll} \left[\begin{array}{lcr} cosh(\frac{k\pi}{3})·x_0+sinh[sign(\theta)·\frac{k\pi}{3}]·y_0 \\ sinh[sign(\theta)·\frac{k\pi}{3}]·x_0+cosh(\frac{k\pi}{3})·y_0 \end{array}\right], & \frac{k\pi}{3}<|\theta|≤\frac{(k+1)\pi}{3},k \in +\Z \\ \\ \left[\begin{array}{lcr} x_0\\y_0 \end{array}\right], & else \\ \end{array} \right. \end{split} \tag{3.9} [xpreypre]= [cosh(3)x0+sinh[sign(θ)3]y0sinh[sign(θ)3]x0+cosh(3)y0],[x0y0],3<θ3(k+1)π,k+Zelse(3.9)

△ α i + 1 = △ α i + d i ⋅ a r c t a n h ( 1 2 i ) , △ α 1 = △ α p r e = { s i g n ( θ ) ⋅ k π 3 , k π 3 < ∣ θ ∣ ≤ ( k + 1 ) π 3 , k ∈ + Z 0 , e l s e (3.10) △α_{i+1}=△α_{i}+d_{i}·arctanh(\frac{1}{2^{i}}), △α_1=△α_{pre}= \left \{ \begin{array}{ll} sign(\theta)·\frac{k\pi}{3} , & \frac{k\pi}{3}<|\theta|≤\frac{(k+1)\pi}{3},k \in +\Z \\ \\ 0, & else \\ \end{array} \right. \tag{3.10} αi+1=αi+diarctanh(2i1),α1=αpre= sign(θ)3,0,3<θ3(k+1)π,k+Zelse(3.10)

d i + 1 = { − 1 , △ α i + 1 > θ 1 , e l s e , d 1 = s i g n ( θ ) (3.11) \begin{split} d_{i+1}= \left \{ \begin{array}{ll} -1, & △α_{i+1}>\theta\\ 1, & else\\ \end{array} \right. \end{split},d_1=sign(\theta) \tag{3.11} di+1={1,1,αi+1>θelse,d1=sign(θ)(3.11)

[ x n y n ] = 1.205136358446461 ⋅ [ x ^ n y ^ n ] (3.12) \left[\begin{array}{lcr} x_{n}\\ y_{n} \end{array}\right] =1.205136358446461·\left[\begin{array}{lcr} \hat{x}_{n}\\ \hat{y}_{n} \end{array}\right] \tag{3.12} [xnyn]=1.205136358446461[x^ny^n](3.12)

其中 n n n为迭代次数, △ α i △α_{i} αi用于记录向量实际旋转角度的累计值,用该值判断应该旋转方向。

经python验证,上述算法正确

旋转模式—— y = c o s h ( x ) y=cosh(x) y=cosh(x) y = s i n h ( x ) y=sinh(x) y=sinh(x) and y = e x y=e^x y=ex

在迭代算法的基础上,令 P 0 ( x 0 = 1 , y 0 = 0 ) P_0(x_0=1,y_0=0) P0(x0=1,y0=0),因此有

[ x s y s ] = ( c o s h θ s i n h θ s i n h θ c o s h θ ) [ 1 0 ] = [ c o s h θ s i n h θ ] \left[\begin{array}{lcr} x_s\\ y_s \end{array}\right] =\left(\begin{array}{lcr} cosh\theta & sinh\theta\\ sinh\theta & cosh\theta \end{array}\right) \left[\begin{array}{lcr} 1\\0 \end{array}\right] =\left[\begin{array}{lcr} cosh\theta\\ sinh\theta \end{array}\right] [xsys]=(coshθsinhθsinhθcoshθ)[10]=[coshθsinhθ]

= > x s + y s = c o s h ( θ ) + s i n h ( θ ) = e θ => x_s + y_s = cosh(\theta) + sinh(\theta) = e^{\theta} =>xs+ys=cosh(θ)+sinh(θ)=eθ

可见旋转模式下 ( x s , y s ) (x_s,y_s) (xs,ys)相加就是指数函数。下面给出不带预旋转的双曲CORDIC算法

因此指数函数的CORDIC解算过程为:输入为 ( x 0 = 1 , y 0 = 0 , θ ∈ ( − 1.0554693737354848 , 1.0554693737354848 ) , n ) (x_0=1,y_0=0,\theta \in (-1.0554693737354848,1.0554693737354848),n) (x0=1,y0=0,θ(1.0554693737354848,1.0554693737354848),n),基于迭代公式 ( 3.4 ) ( 3.5 ) ( 3.6 ) ( 3.7 ) (3.4)(3.5)(3.6)(3.7) (3.4)(3.5)(3.6)(3.7),可得到输出 ( x n ≈ c o s h ( θ ) , y n ≈ s i n h ( θ ) , △ α n ≈ θ ) (x_n≈cosh(\theta),y_n≈sinh(\theta),△α_n≈\theta) (xncosh(θ),ynsinh(θ),αnθ),进而得到 x n + y n ≈ e θ x_n+y_n≈e^{\theta} xn+yneθ

3.2. 向量模式—— y = x y=\sqrt{x} y=x and y = ln ⁡ x y=\ln{x} y=lnx

同样地,若要求 P 0 P_0 P0旋转至x轴正半轴,那么旋转角就是 − a r c t a n ( y 0 x 0 ) -arctan(\frac{y_0}{x_0}) arctan(x0y0),此处就需要用到 ( 3.2 ) (3.2) (3.2)式来求解 θ \theta θ

θ h y p = − a r c t a n ( y 0 x 0 ) → θ = − a r c t a n h [ y 0 x 0 ] → 0 < ∣ y 0 x 0 ∣ < t a n h ( 1.0554693737354848 ) ≈ 0.7839236595945456 (3.13) \theta_{hyp}=-arctan(\frac{y_0}{x_0})→ \theta=-arctanh[\frac{y_0}{x_0}] \\ → 0<|\frac{y_0}{x_0}|<tanh(1.0554693737354848)≈0.7839236595945456 \tag{3.13} θhyp=arctan(x0y0)θ=arctanh[x0y0]0<x0y0<tanh(1.0554693737354848)0.7839236595945456(3.13)

代入 ( 3.1 ) (3.1) (3.1)得到

[ x s y s ] = ( c o s h θ s i n h θ s i n h θ c o s h θ ) [ x 0 y 0 ] → [ x s y s ] = [ x 0 2 − y 0 2 0 ] \left[\begin{array}{lcr} x_s\\ y_s \end{array}\right] =\left(\begin{array}{lcr} cosh\theta & sinh\theta\\ sinh\theta & cosh\theta \end{array}\right) \left[\begin{array}{lcr} x_0\\y_0 \end{array}\right] → \left[\begin{array}{lcr} x_s\\ y_s \end{array}\right] =\left[\begin{array}{lcr} \sqrt{x_0^2-y_0^2} \\0 \end{array}\right] [xsys]=(coshθsinhθsinhθcoshθ)[x0y0][xsys]=[x02y02 0]

上述公式蕴含 ∣ y 0 x 0 ∣ ≤ 1 |\frac{y_0}{x_0}|≤1 x0y01,再结合 ( 3.13 ) (3.13) (3.13),得到 0 < ∣ y 0 x 0 ∣ < 0.7839236595945456 0<|\frac{y_0}{x_0}|<0.7839236595945456 0<x0y0<0.7839236595945456

因此输入为 ( x 0 , y 0 , θ = − a r c t a n h [ y 0 x 0 ] , n ) (x_0,y_0, \theta=-arctanh[\frac{y_0}{x_0}],n) (x0,y0,θ=arctanh[x0y0],n),且满足 0 < ∣ y 0 x 0 ∣ < 0.7839236595945456 0<|\frac{y_0}{x_0}|<0.7839236595945456 0<x0y0<0.7839236595945456,基于迭代公式 ( 3.8 ) ( 3.9 ) ( 3.10 ) ( 3.11 ) ( 3.12 ) (3.8)(3.9)(3.10)(3.11)(3.12) (3.8)(3.9)(3.10)(3.11)(3.12),可得到输出 ( x n ≈ x 0 2 − y 0 2 , y n ≈ 0 , △ α n ≈ θ = − a r c t a n h ( y 0 x 0 ) ) (x_n≈\sqrt{x_0^2-y_0^2},y_n≈0,△α_n≈\theta=-arctanh(\frac{y_0}{x_0})) (xnx02y02 ,yn0,αnθ=arctanh(x0y0))

如果还满足 x 0 = a + 1 , y 0 = a − 1 x_0=a+1, y_0=a-1 x0=a+1,y0=a1那么就可以得出开方与ln函数。注意此处 a a a的范围,即

0 < ∣ y 0 x 0 ∣ < 0.7839236595945456 → a ∈ ( 0.12112 , 8.25599 ) , a ≠ 1 (3.14) 0<|\frac{y_0}{x_0}|<0.7839236595945456→ a \in (0.12112,8.25599), a≠1 \tag{3.14} 0<x0y0<0.7839236595945456a(0.12112,8.25599)a=1(3.14)

CORDIC解算过程为:输入为 ( x 0 = a + 1 , y 0 = a − 1 , n ) (x_0=a+1,y_0=a-1,n) (x0=a+1,y0=a1,n) a a a满足 ( 3.14 ) (3.14) (3.14),并基于迭代公式 ( 3.4 ) ( 3.5 ) ( 2.14 ) ( 3.7 ) (3.4)(3.5)(2.14)(3.7) (3.4)(3.5)(2.14)(3.7),可得到输出 ( x n ≈ 2 a , y n ≈ 0 , △ α n ≈ θ = − a r c t a n h ( a − 1 a + 1 ) = − 1 2 l n a ) (x_n≈2\sqrt{a},y_n≈0,△α_n≈\theta=-arctanh(\frac{a-1}{a+1})=-\frac{1}{2}lna) (xn2a ,yn0,αnθ=arctanh(a+1a1)=21lna)

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Starry丶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值