平均阻尼法

math

这是一种”将长方形变得更像正方形”的方法.

[latexpage]有一个矩形,面积为$S$,设其中一边长为$L_n$,那么另一边长为$\frac{S}{L_n}$.求$L_n$与$\frac{S}{L_n}$的平均值作为下一个边的长度.即

$L_{n+1} = \frac{L_n + \frac{S}{L_n}} {2}$

[latexpage]可以发现随着迭代的次数增加,$Ln$与$\frac{S}{L_n}$越来越接近,在面积不变的条件下长方形变得更像正方形了.

[latexpage]S是一个待开方的数,$L_1$为第一次猜测的值,进行多次迭代后,当$L_n$与$L_{n+1}$的差足够小时,就可以认为S的开方被求出来了.

用c语言写的平均阻尼法求开平方.

#define minx 0.0000001

double average( double x, double y ) { return ( x + y ) / 2; }

double damp( double x, double guess )
{
double S = x;
double newGuess = average( guess, S / guess );
for ( ;; )
{
if ( abs(newGuess-guess) < minx ) break;
guess = newGuess;
newGuess = average( guess, S / guess );
}
return newGuess;
}

平均阻尼法处理矩形的图像表示

绘制一个长为8,宽为2的矩形,其面积为16.初始A点坐标为(8,2).可以理解为对于待开平方数16,做出了第一次猜测为8.

[latexpage]进行一次平均阻尼处理,在计算一次$L_{n+1} = \frac{L_n + \frac{S}{L_n}} {2}$后得到$L_2=5$,求出宽为3.2.A点坐标变为(5,3.2),发现在面积不变的条件下,原来的矩形向正方形变化了.

[latexpage]再进行一次平均阻尼处理,求得$L_3 = 4.1$宽接近3.9,A点坐标变为(4.1, 3.9)此时原本的矩形已经非常接近正方形了,4.1也是非常接近$\sqrt{16} = 4$的一个值.